我通过命名的JMS队列将JMS请求发送到Weblogic 10.3服务器,并通过临时队列接收回复。
客户(准系统):
//init
Destination replyQueue = session.createTemporaryQueue();
replyConsumer = session.createConsumer(replyQueue);
...
//loop
TextMessage requestMessage = session.createTextMessage();
requestMessage.setText("Some request")
requestMessage.setJMSReplyTo(replyQueue);
requestProducer.send(requestMessage);
Message msg = replyConsumer.receive(5000);
if (msg instanceof TextMessage) {
...
} else { ... }
//loop end
服务器MDB(消息驱动bean):
public void onMessage(Message msg) {
if (msg instanceof TextMessage) {
...
TextMessage replyMessage = jmsSession.createTextMessage();
replyMessage.setText("Some response");
replyMessage.setJMSCorrelationID(msg.getJMSCorrelationID());
replyProducer.send(replyMessage);
}
}
问题是第一个服务器回复经常丢失!也就是说,replyConsumer.receive(5000)
以每4到5个回复消费者的超时结束。当消费者收到第一个答案时,它继续接收所有其余的答案,因此问题只是在创建临时队列后通过临时队列发送第一条消息。
我的问题:我是否必须为临时队列设置一些特殊内容,以便它在创建后从一开始就有效?或任何其他提示?
更多信息:
replyConsumer.receive(5000)
,而不是同步replyConsumer.setMessageListener(this)
。行为没有改变,临时队列的第一条消息仍然丢失。编辑:我正在使用的Weblogic服务器(或群集)似乎有问题。因为当我将服务器应用程序部署到我们拥有的另一个Weblogic集群时,一切都开始正常工作!两个集群应该配置相同 - 所以哪里有区别?让我感到害怕的是,Weblogic没有发出错误信号。
答案 0 :(得分:1)
您的问题似乎是,有时服务器正在接收发布并在您的消费者开始接收之前将其丢弃。
解决方法是使用异步接收(replyConsumer.setMessageListener)调用而不是您当前拥有的阻塞调用(replyConsumer.receive(5000)),并使用其余的消费者代码添加对代码的调用
这样,您在发出请求之前就已经在听取回复了。
希望有所帮助。
编辑:只是看到您正在使用临时队列,所以我的第一句话不正确。但是,作为实验,请尝试其余的回复,看看它是否会改变您所看到的行为