从rabbitmq接收消息,无法在多线程环境中返回消息

时间:2014-07-28 18:36:33

标签: rabbitmq spring-amqp

以下是我的申请

1)客户端应用程序在REQUEST_QUEUE_1上发送带有correlationId的请求消息,并使用correlationId等待RESPONSE_QUEUE_1上的响应消息

2)服务器应用程序从REQUEST_QUEUE_1

接收消息

3)Server App处理在步骤2中收到的消息

4)服务器应用程序在RESPONSE_QUEUE_1上发送响应,与作为步骤2中消息的一部分收到的correlationId异步发送。

5)来自第1步的客户端应用程序的线程收到来自RESPONSE_QUEUE_1的响应,用于correlationId

以下是java程序的代码片段,它在客户端和服务器端与队列进行sendMessage和receiveMessage的传递 - https://gist.github.com/graj2014/f580b35579bf8a94029d

使用jmeter在客户端应用程序的单个请求中测试时,此代码工作正常。但是,同时多个用户请求会使某些消息处于未确认状态,并且相应的响应会对客户端产生超时时间。

带有msgCorrelationId的receiveMessage方法存在问题,该问题与要确认的队列上的消息相匹配。

1 个答案:

答案 0 :(得分:0)

问题在于:

if (msgCorrelationId.toString().equals(correlationId)) {
        ....
        channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        break;
}

如果您收到的信息有correlationId,但提供的信息不多,那么您只需从进动中跳过它们,当然会为它们丢失acknowledgement

不清楚为什么你这么做以request-reply模式的方式,因为RabbitTemplate.sendAndReceive()会解决问题。

请参考Docstest-case