我正在尋找關於我們在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());
}
}
}
我編輯的例子 - 我們打電話connA.start(); (當我第一次複製和粘貼代碼時,我錯過了) - 謝謝 – user3276159