我正在通过已命名的JMS队列向Weblogic 10.3服务器发送JMS请求,并通过临时队列接收回复。JMS临时队列丢弃第一条消息
客户端(裸机):
//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的超时结束。当消费者收到第一个答案时,它将继续收到所有剩下的答案,所以问题只是在创建临时队列后第一条消息通过临时队列发送。
我的问题:我是否需要为临时队列设置一些特殊的东西,以便它在创建后从一开始就工作?或者其他提示?
进一步信息:
- 当对我的地方发展机测试,临时队列没有问题的工作。只有在对我们的集群Weblogic服务器进行测试时,这些消息才会丢失。但是,我关闭了所有集群成员,但只有一个实例。
- 我已验证服务器成功回复客户端发送的所有请求(通过计算发送的请求和发送的回复)。服务器以毫秒为单位进行回复,即使对于丢失的回复也是如此。
- 当我用普通的命名队列替换临时队列时,问题就消失了!所以这个问题在我的代码中似乎没有(对我来说)。
- 我也尝试修改回复消息的过期,持久性,延迟等,但没有成功。这样我排除了响应早于客户端开始读取队列的情况,然后消息立即失效,而不会让客户端有机会处理它。我试过使用异步
replyConsumer.setMessageListener(this)
。行为没有改变,第一个消息对于临时队列仍然丢失。
编辑:似乎有什么毛病我使用WebLogic服务器(或集群)。因为当我将服务器应用程序部署到另一个Weblogic集群时,所有事情都开始正常工作!两个集群应该配置相同 - 所以区别在哪里?它让我害怕Weblogic没有错误。
我们还没有找到这种不良行为的原因。但是,重新创建该域名有所帮助 - 新域名可以毫无问题地运作。 – xarx 2012-04-13 10:50:04