[jboss-user] [JBoss Messaging] - Messaging client hangs on exit

PeterJ do-not-reply at jboss.com
Sun Sep 10 20:00:08 EDT 2006


I have a simple messaging client that opens a topic as both a subcriber and publisher, with a listener on the subscriber.  Once I send and receive one message on the topic, the program hangs when I try to exit.  I know that there must be something I am doing wrong but cannot see it.

Particulars: JBoss AS 4.0.4.GA, JBoss Messaging 1.0.1.CR3, JDK 1.5.0_06

Here is my code:

package jms;
  | import java.io.BufferedReader;
  | import java.io.InputStreamReader;
  | import javax.jms.JMSException;
  | import javax.jms.Message;
  | import javax.jms.Session;
  | import javax.jms.TextMessage;
  | import javax.jms.Topic;
  | import javax.jms.TopicConnection;
  | import javax.jms.TopicConnectionFactory;
  | import javax.jms.TopicPublisher;
  | import javax.jms.TopicSession;
  | import javax.jms.TopicSubscriber;
  | import javax.naming.InitialContext;
  | public class Echo implements javax.jms.MessageListener {
  |     private TopicSession sessionPublisher;
  |     private TopicSession sessionSubscriber;
  |     private TopicPublisher publisher;
  |     private TopicSubscriber subscriber;
  |     private TopicConnection connection;
  |     public Echo() throws Exception {
  |         InitialContext jndi = new InitialContext();
  |         TopicConnectionFactory factory = (TopicConnectionFactory)jndi.lookup("ConnectionFactory");
  |         connection = factory.createTopicConnection();
  |         sessionPublisher = connection.createTopicSession(false,
  |                 Session.AUTO_ACKNOWLEDGE);
  |         sessionSubscriber = connection.createTopicSession(false,
  |                 Session.AUTO_ACKNOWLEDGE);
  |         Topic topic = (Topic)jndi.lookup("topic/testTopic");
  |         publisher = sessionPublisher.createPublisher(topic);
  |         subscriber = sessionSubscriber.createSubscriber(topic);
  |         subscriber.setMessageListener(this);
  |         connection.start();
  |     }
  |     public void onMessage(Message message) {
  |         try {
  |             TextMessage textMessage = (TextMessage)message;
  |             String text = textMessage.getText();
  |             System.out.println("echo: " + text);
  |         } catch (JMSException e) {
  |             e.printStackTrace();
  |         }
  |     }
  |     protected void writeMessage(String text) throws JMSException {
  |         TextMessage message = sessionPublisher.createTextMessage();
  |         message.setText(text);
  |         publisher.publish(message);
  |     }
  |     public void close() throws JMSException {
  |         connection.close();
  |     }
  |     public static void main(String[] args) throws Exception {
  |         Echo echo = new Echo();
  |         BufferedReader commandLine = new java.io.BufferedReader(new InputStreamReader(System.in));
  |         boolean looping = true;
  |         System.out.println("Echo chamber is ready...");
  |         while (looping) {
  |             String s = commandLine.readLine();
  |             if (s.equals("q")) {
  |                 looping = false;
  |             } else
  |                 echo.writeMessage(s);
  |         }
  |         echo.close();
  |         System.out.println("Good-bye!");
  |     }
  | }

Here is the output for an example run, followed by a thread dump:

>java ... jms.Echo
  | log4j:WARN No appenders could be found for logger (org.jboss.remoting.transport.
  | socket.SocketClientInvoker).
  | log4j:WARN Please initialize the log4j system properly.
  | Echo chamber is ready...
  | hello
  | echo: hello
  | q
  | Good-bye!
  | Full thread dump Java HotSpot(TM) Client VM (1.5.0_06-b05 mixed mode):
  | 
  | "DestroyJavaVM" prio=6 tid=0x00036fa8 nid=0x114c waiting on condition [0x0000000
  | 0..0x0007fae8]
  | 
  | "SocketServerInvokerThread-192.168.0.101-0" prio=6 tid=0x0ae4fc50 nid=0x16ac run
  | nable [0x0b48f000..0x0b48fae8]
  |         at java.net.SocketInputStream.socketRead0(Native Method)
  |         at java.net.SocketInputStream.read(Unknown Source)
  |         at java.io.BufferedInputStream.fill(Unknown Source)
  |         at java.io.BufferedInputStream.read(Unknown Source)
  |         - locked <0x02b520b0> (a java.io.BufferedInputStream)
  |         at java.io.FilterInputStream.read(Unknown Source)
  |         at org.jboss.serial.io.JBossObjectInputStream.read(JBossObjectInputStrea
  | m.java:193)
  |         at org.jboss.remoting.transport.socket.ServerThread.readVersion(ServerTh
  | read.java:497)
  |         at org.jboss.remoting.transport.socket.ServerThread.processInvocation(Se
  | rverThread.java:414)
  |         at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.j
  | ava:534)
  |         at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.jav
  | a:257)
  | 
  | "Timer-0" daemon prio=6 tid=0x0ae4d998 nid=0xda0 in Object.wait() [0x0b44f000..0
  | x0b44fb68]
  |         at java.lang.Object.wait(Native Method)
  |         - waiting on <0x030d3ce0> (a java.util.TaskQueue)
  |         at java.lang.Object.wait(Unknown Source)
  |         at java.util.TimerThread.mainLoop(Unknown Source)
  |         - locked <0x030d3ce0> (a java.util.TaskQueue)
  |         at java.util.TimerThread.run(Unknown Source)
  | 
  | "GC Daemon" daemon prio=2 tid=0x0ac83120 nid=0x1374 in Object.wait() [0x0af4f000
  | ..0x0af4fd68]
  |         at java.lang.Object.wait(Native Method)
  |         - waiting on <0x02fe8a08> (a sun.misc.GC$LatencyLock)
  |         at sun.misc.GC$Daemon.run(Unknown Source)
  |         - locked <0x02fe8a08> (a sun.misc.GC$LatencyLock)
  | 
  | "RMI RenewClean-[192.168.0.101:1098]" daemon prio=6 tid=0x0ac8a578 nid=0x1174 in
  |  Object.wait() [0x0af0f000..0x0af0f9e8]
  |         at java.lang.Object.wait(Native Method)
  |         - waiting on <0x02fe8a70> (a java.lang.ref.ReferenceQueue$Lock)
  |         at java.lang.ref.ReferenceQueue.remove(Unknown Source)
  |         - locked <0x02fe8a70> (a java.lang.ref.ReferenceQueue$Lock)
  |         at sun.rmi.transport.DGCClient$EndpointEntry$RenewCleanThread.run(Unknow
  | n Source)
  |         at java.lang.Thread.run(Unknown Source)
  | 
  | "Low Memory Detector" daemon prio=6 tid=0x00a92b20 nid=0x1154 runnable [0x000000
  | 00..0x00000000]
  | 
  | "CompilerThread0" daemon prio=10 tid=0x00a91820 nid=0x10bc waiting on condition
  | [0x00000000..0x0abcf84c]
  | 
  | "Signal Dispatcher" daemon prio=10 tid=0x00a90a18 nid=0x10b4 waiting on conditio
  | n [0x00000000..0x00000000]
  | 
  | "Finalizer" daemon prio=8 tid=0x00a87a30 nid=0x11b8 in Object.wait() [0x0ab4f000
  | ..0x0ab4fc68]
  |         at java.lang.Object.wait(Native Method)
  |         - waiting on <0x02fc4768> (a java.lang.ref.ReferenceQueue$Lock)
  |         at java.lang.ref.ReferenceQueue.remove(Unknown Source)
  |         - locked <0x02fc4768> (a java.lang.ref.ReferenceQueue$Lock)
  |         at java.lang.ref.ReferenceQueue.remove(Unknown Source)
  |         at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)
  | 
  | "Reference Handler" daemon prio=10 tid=0x00a86598 nid=0x1514 in Object.wait() [0
  | x0ab0f000..0x0ab0fce8]
  |         at java.lang.Object.wait(Native Method)
  |         - waiting on <0x02fc47e8> (a java.lang.ref.Reference$Lock)
  |         at java.lang.Object.wait(Unknown Source)
  |         at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
  |         - locked <0x02fc47e8> (a java.lang.ref.Reference$Lock)
  | 
  | "VM Thread" prio=10 tid=0x00a823f8 nid=0x1144 runnable
  | 
  | "VM Periodic Task Thread" prio=10 tid=0x00a90958 nid=0xa0c waiting on condition

I also tried, in the Echo.close() method, to close the various sessions, unset the listener, and a few other variations to no avail. It appears as if the listener is still active, even after the connection is closed.

I did try ending the program with System.exit(0), and that worked, but calling System.exit() should be only a last ditch effort to bring the JVM down, not the normal way of exiting an application. 


View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3970641#3970641

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3970641



More information about the jboss-user mailing list