[jboss-user] [JBoss Messaging] - JMS Queue/Topic Issue (JBoss SOA 4.3 - JBoss AS 4.2.2)
J H
do-not-reply at jboss.com
Tue Jun 22 07:05:19 EDT 2010
J H [http://community.jboss.org/people/jbossuseruseruser] created the discussion
"JMS Queue/Topic Issue (JBoss SOA 4.3 - JBoss AS 4.2.2)"
To view the discussion, visit: http://community.jboss.org/message/549085#549085
--------------------------------------------------------------
I have tried this with both a Queue and Topic. Within the destinations-service.xml file, I have configured a new Queue or Topic, simply by copying and pasting the example one and changing the name (testTopic > newTopic). I have a class that sends simple text messages to the topic and then another class that receieves them. The receiving class is used within a very simple GUI to get the message and display it in a text area. This all works 'fine'.
The problem is after a certain amount of time (there is no regularity in the time this happens...) messages stop being received. Whilst using a topic I have seen the subscription in the JMX-Console and noticed that it is no longer there when messages are not being received. I have tried leaving sessions open - I've tried closing them and then making a new subscription every time - but no matter what I try it never seems to 'stay alive'. I then turned to Queues, thinking that the same problem couldn't possibly apply, but I was wrong, my GUI client stops receiving messages after an arbitrary amount of time. So my question is: Does JBoss have configuration settings for a subscription? Or something along those lines. Or is it something that I am doing wrong:
destinations-service.xml
<mbean code="org.jboss.jms.server.destination.TopicService"
name="jboss.messaging.destination:service=Topic,name=newTopic"
xmbean-dd="xmdesc/Topic-xmbean.xml">
<depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
<depends>jboss.messaging:service=PostOffice</depends>
<attribute name="SecurityConfig">
<security>
<role name="guest" read="true" write="true"/>
<role name="publisher" read="true" write="true" create="true"/>
</security>
</attribute>
</mbean>
TopicReceiver.java:
private static final String JBOSS_TOPIC_NAME = "topic/newTopic";
private static final String JBOSS_JNDI_CONNECTION_FACTORY = "ConnectionFactory";
private static final String JBOSS_JNDI_PACKAGE = "org.jboss.naming:org.jnp.interfaces";
private static final String JBOSS_JNDI_DRIVER = "org.jnp.interfaces.NamingContextFactory";
private static final String JBOSS_URL = "jnp://localhost:1099";
//The topic to which we will be publishing messages
private Topic testTopic;
//The factory that will build us JMS connections
private TopicConnectionFactory topicFactory;
//The connection to the JMS server
private TopicConnection connection;
//The subscriber object
private TopicSubscriber subscriber;
//The session for receiving
private TopicSession subscribeSession;
private String messageText = "";
/**
* Calls the incomingMessage() method on instantiation
* to get the message from the subscribed Topic.
*/
public TopicReceiver() {
this.setup();
}
/**
* Gets the message that has been stored from the subscribed
* topic.
* @return The newest incoming message.
*/
public String getMessage(){
return messageText;
}
/**
* Sets up the connection to JBoss and the Subscriber, who will
* listen for incoming messages.
*/
public void setup(){
Properties prop = new Properties();
prop.put("java.naming.factory.initial",JBOSS_JNDI_DRIVER);
prop.put("java.naming.provider.url",JBOSS_URL);
prop.put("java.naming.factory.url.pkgs",JBOSS_JNDI_PACKAGE);
InitialContext context;
try {
context = new InitialContext(prop);
//Lookup the JMS connection factory and topic
topicFactory = (TopicConnectionFactory)context.lookup(JBOSS_JNDI_CONNECTION_FACTORY);
connection = topicFactory.createTopicConnection();
testTopic = (Topic)context.lookup(JBOSS_TOPIC_NAME);
subscribeSession = connection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);
subscriber = subscribeSession.createSubscriber(testTopic);
connection.start();
} catch (NamingException e) {
e.printStackTrace();
} catch (JMSException jms){
jms.printStackTrace();
}
}
/**
* Provides a user friendly view of the message - as a String.
* @return The Message contained within the JMS Message object.
*/
public String receiveMessage(){
String msg = "";
try {
Message message = subscriber.receive();
msg = ((TextMessage)message).getText();
System.out.println(msg);
//stop();
} catch (JMSException e) {
e.printStackTrace();
}
return msg;
}
public void stop(){
try {
subscribeSession.close();
subscriber.close();
connection.stop();
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
TopicSender.java:
private static final String JBOSS_TOPIC_NAME = "topic/newTopic";
private static final String JBOSS_JNDI_CONNECTION_FACTORY = "ConnectionFactory";
private static final String JBOSS_JNDI_PACKAGE = "org.jboss.naming:org.jnp.interfaces";
private static final String JBOSS_JNDI_DRIVER = "org.jnp.interfaces.NamingContextFactory";
private static final String JBOSS_URL = "jnp://localhost:1099";
//The topic to which we will be publishing messages
private Topic jbossTopic;
//The factory that will build us JMS connections
private TopicConnectionFactory topicFactory;
//The connection to the JMS server
private TopicConnection connection;
//The publisher object
private TopicPublisher publisher;
//The session for sending
private TopicSession publishSession;
/**
* Default Constructor
*/
public TopicSender(){
}
/**
* Prepares the connection to the Topic on the Server.
*/
public void setup(){
try{
Properties prop = new Properties();
prop.put("java.naming.factory.initial",JBOSS_JNDI_DRIVER);
prop.put("java.naming.provider.url",JBOSS_URL);
prop.put("java.naming.factory.url.pkgs",JBOSS_JNDI_PACKAGE);
InitialContext context = new InitialContext(prop);
//Lookup the JMS connection factory and topic
topicFactory = (TopicConnectionFactory)context.lookup(JBOSS_JNDI_CONNECTION_FACTORY);
connection = topicFactory.createTopicConnection();
jbossTopic = (Topic)context.lookup(JBOSS_TOPIC_NAME);
//to send messages we create a session and a publisher
publishSession = connection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);
connection.start();
}
catch(Exception e){
e.printStackTrace();
}
}
/**
* Sends the message passed through the parameter to a topic named
* 'topic/testTopic'
* @param text - The message that is to be published to the topic.
*/
public void sendMessage(String text){
try {
this.setup();
publisher = publishSession.createPublisher(jbossTopic);
TextMessage tm = publishSession.createTextMessage(text);
publisher.publish(tm);
publisher.close();
this.stop();
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* Closes the connection and resources in use.
*/
public void stop(){
try {
connection.stop();
publishSession.close();
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
Please let me know if you require more information - any feedback is appreciated,
Thanks,
J
--------------------------------------------------------------
Reply to this message by going to Community
[http://community.jboss.org/message/549085#549085]
Start a new discussion in JBoss Messaging at Community
[http://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2042]
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/jboss-user/attachments/20100622/6e117735/attachment-0001.html
More information about the jboss-user
mailing list