2

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

我的问题:我是否必须为临时队列设置一些特殊的东西才能让它在创建后从一开始就工作?还是有其他提示?

更多信息:

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

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

4

1 回答 1

1

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

解决方法是使用异步接收 (replyConsumer.setMessageListener) 调用而不是您当前拥有的阻塞调用 (replyConsumer.receive(5000)),并将调用与您的其余使用者代码一起添加到代码中。

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

希望有帮助。

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

于 2012-04-10T13:19:11.747 回答