JMS临时队列丢弃第一条消息

时间:2012-04-10 10:43:20

标签: java jms weblogic

我通过命名的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个回复消费者的超时结束。当消费者收到第一个答案时,它继续接收所有其余的答案,因此问题只是在创建临时队列后通过临时队列发送第一条消息。

我的问题:我是否必须为临时队列设置一些特殊内容,以便它在创建后从一开始就有效?或任何其他提示?

更多信息:

  • 在对我的本地开发机器进行测试时,临时队列可以正常工作。只有在针对我们的集群Weblogic服务器进行测试时,消息才会丢失。但是,我已经关闭了所有集群成员,只有一个实例。
  • 我已验证服务器已成功回复客户端发送的所有请求(通过计算已发送的请求并发送回复)。服务器以毫秒的顺序回复,即使丢失的回复也是如此。
  • 当我用常规命名队列替换临时队列时,问题就消失了!所以问题似乎(对我来说)不在我的代码中。
  • 我还尝试修改回复消息的过期,持久性,延迟等,但没有成功。通过这种方式,我排除了响应在客户端开始读取队列之前到达的情况,然后消息立即过期,不会让客户端有机会处理它。
  • 修改:我还尝试使用异步replyConsumer.receive(5000),而不是同步replyConsumer.setMessageListener(this)。行为没有改变,临时队列的第一条消息仍然丢失。

编辑:我正在使用的Weblogic服务器(或群集)似乎有问题。因为当我将服务器应用程序部署到我们拥有的另一个Weblogic集群时,一切都开始正常工作!两个集群应该配置相同 - 所以哪里有区别?让我感到害怕的是,Weblogic没有发出错误信号。

1 个答案:

答案 0 :(得分:1)

您的问题似乎是,有时服务器正在接收发布并在您的消费者开始接收之前将其丢弃。

解决方法是使用异步接收(replyConsumer.setMessageListener)调用而不是您当前拥有的阻塞调用(replyConsumer.receive(5000)),并使用其余的消费者代码添加对代码的调用

这样,您在发出请求之前就已经在听取回复了。

希望有所帮助。

编辑:只是看到您正在使用临时队列,所以我的第一句话不正确。但是,作为实验,请尝试其余的回复,看看它是否会改变您所看到的行为