2012-04-10 85 views
2

我正在通过已命名的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没有错误。

+0

我们还没有找到这种不良行为的原因。但是,重新创建该域名有所帮助 - 新域名可以毫无问题地运作。 – xarx 2012-04-13 10:50:04

回答

1

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

解决方法是使用异步接收(replyConsumer.setMessageListener)调用代替当前拥有的阻止调用(replyConsumer.receive(5000)),并将调用添加到您的其他消费者码。

这样,在发送请求之前,您已经在收听回复。

希望有所帮助。

编辑:刚才读到你正在使用临时队列,所以我的第一句话是不正确的。然而,作为一个实验尝试我的回应的其余部分,看看它是否会改变你看到的行为

+0

我试过你的建议,但没有成功。我编辑了我的帖子并添加了更多信息。 – xarx 2012-04-11 08:42:36