我正在寻找有关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());
}
}
}
答案 0 :(得分:0)
设置消息侦听器后,未启动连接。这可能导致了这个问题。