2014-02-05 41 views
0

我正在尋找關於我們在Java軟件應用程序中遇到的這個奇怪問題的見解。該應用程序從網站下載,並使用發佈/訂閱模型中的JMS/JBOSS與Internet上的服務器通信 。在很高的層面上,問題在於,在我們的許多Windows 7 PC(64位Win7操作系統,JRE 1.7.0_51-b13 32位)上,客戶端應用程序不會收到服務器發送的消息。 onMessage()方法似乎不被調用。在某些PC上運行的Java JMS MessageListener 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()); 
     } 
} 
} 

回答

0

設置消息監聽器後,連接沒有啓動。這可能會導致問題。

+0

我編輯的例子 - 我們打電話connA.start(); (當我第一次複製和粘貼代碼時,我錯過了) - 謝謝 – user3276159

相關問題