Java JMS MessageListener onMessage在某些PC上运行但在其他PC上运行

时间:2014-02-05 22:12:11

标签: java jboss jms publish-subscribe

我正在寻找有关Java软件应用程序遇到的这个奇怪问题的见解。该应用程序从网站下载并进行通信 使用发布/订阅模型中的JMS / JBOSS在Internet上使用服务器。从很大程度上讲,问题在于我们的许多Windows 7 PC(64位Win7操作系统,JRE 1.7.0_51-b13 32位),客户端应用程序不会收到从服务器发送的消息。 onMessage()方法似乎没有被调用。

令人沮丧的是,在我们的一些PC上(使用Ghost硬盘映像部署,因此理论上应该具有相同的配置),应用程序确实收到消息 - 我们可以看到onMessage()方法按预期工作。

我能够检查进入PC的TCP / IP流量,我可以看到从服务器到达客户端TCP / IP堆栈的消息。但不知何故,有些东西阻止了消息触发Java onMessage处理程序。

另一个非常奇怪的转折是,如果我们让客户端应用程序运行大约20分钟,它会突然开始接收消息(即onMessage()方法被触发)。我们再一次知道它正在通过查看TCP / IP流量来获取消息。

我们使用的代码的基本概要如下所示。我认为它几乎遵循这里的例子1并且具有大多数相似的元素。任何有关进一步调试或探索的建议都将受到赞赏。

public class MyPubSub {
         private static final String CONN_FACTORY_QUEUE = "jms/RemoteConnectionFactory";
         private static final String QUEUE_A = "jms/queue/QueueA";
         private static final String CONN_FACTORY_TOPIC = "jms/RemoteConnectionFactory";
         private static final String USERNAME = "xyz";
         private static final String PWD = "xyz123";

public static void main(String[] args) 
{
         String hostURL = "some_host_string_thing_here";
         String remotingURL = "remote://"+hostURL+":4447";  

         // Establish context
         Context ctx;
         QueueConnectionFactory qcf = null;
         Properties p = new Properties();
         p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
         p.put(Context.PROVIDER_URL, remotingURL);
         p.put(Context.SECURITY_PRINCIPAL, USERNAME);
         p.put(Context.SECURITY_CREDENTIALS, PWD);
         ctx = new InitialContext(p);

         // Set up Queue

         QueueConnectionFactory qcf = null;
         QueueConnection qconn = null;
         QueueSession qsession = null;
         Queue queueA = null;
         QueueReceiver qrecv = null;

         qcf = (QueueConnectionFactory)ctx.lookup(CONN_FACTORY_QUEUE);
         qconn = qcf.createQueueConnection(USERNAME, PWD);
         qsession = qconn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
         messageProducer = qsession.createProducer(queueA);

         // Set up Topic
         TopicConnectionFactory tcf;
         TopicConnection connA = null;
         TopicSession sessionA = null;
         Topic topicA = null;  
         TopicSubscriber recvA;

         tcf = (TopicConnectionFactory)ctx.lookup(CONN_FACTORY_TOPIC);
         topicA = (Topic)ctx.lookup(TOPICA);
         connA = tcf.createTopicConnection(USERNAME, PWD);
         connA.setExceptionListener(new ExceptionListenerImpl());
         sessionA = connA.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
         messageProducerA = sessionA.createProducer(getJmsDestination(TOPICA));
         recvA = sessionA.createSubscriber(topicA);
         // Associate the MessageListener ExListenerA()
         recvA.setMessageListener(new ExListenerA());
         // Start
         connA.start();
}

public class ExListenerA implements MessageListener {
       public void onMessage(Message msg) {
           TextMessage oo = (TextMessage) msg;
           System.out.println("Got message" + oo.getText());
      }
}
}

1 个答案:

答案 0 :(得分:0)

设置消息侦听器后,未启动连接。这可能导致了这个问题。