Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从rabbitmq接收消息在多线程环境中返回消息失败_Rabbitmq_Spring Amqp - Fatal编程技术网

从rabbitmq接收消息在多线程环境中返回消息失败

从rabbitmq接收消息在多线程环境中返回消息失败,rabbitmq,spring-amqp,Rabbitmq,Spring Amqp,下面是我的应用程序的功能 1客户端应用程序发送请求队列1上具有correlationId的请求消息,并使用correlationId等待响应队列1上的响应消息 2服务器应用程序从请求队列1接收消息 3服务器应用程序处理在步骤2中接收到的消息 4服务器应用程序在响应队列1上异步发送响应,correlationId作为步骤2消息的一部分接收 5步骤1中的客户端应用程序线程从响应队列1接收correlationId的响应 下面是java程序在客户端和服务器端执行sendMessage和receiveM

下面是我的应用程序的功能

1客户端应用程序发送请求队列1上具有correlationId的请求消息,并使用correlationId等待响应队列1上的响应消息

2服务器应用程序从请求队列1接收消息

3服务器应用程序处理在步骤2中接收到的消息

4服务器应用程序在响应队列1上异步发送响应,correlationId作为步骤2消息的一部分接收

5步骤1中的客户端应用程序线程从响应队列1接收correlationId的响应

下面是java程序在客户端和服务器端执行sendMessage和receiveMessage往返队列的代码片段-

当使用jmeter在单个客户端应用程序请求中进行测试时,此代码工作正常。然而,多个用户同时请求会使一些消息处于未确认状态,并对客户端获取timedout做出相应的响应

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

问题在于:

if (msgCorrelationId.toString().equals(correlationId)) {
        ....
        channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        break;
}
如果您收到带有correlationId的消息,但提供的消息并不多,您只需从进程中跳过它们,当然,会丢失对它们的确认

现在还不清楚为什么要如此努力地使用请求-应答模式,因为rabbitmplate.sendAndReceive在这个问题上起作用


请参考和

我不想承认它们,因为它们是供其他线程使用的。那么我应该用requeue true调用channel.basicNack吗?没错。我不是说你应该承认他们。没错,basicNack可能会有所帮助,但最终你会发现,同一个侦听器—其中一个并发的,甚至每个并发的—开始对无趣的消息做无用的工作。这就是为什么对于每条消息最好只依赖临时replyQueue,就像默认情况下在RabbitTemplate.sendReceive中一样,而不依赖replyQueue。问题的根源在于,AMQP不像JMS那样提供选择器选项。但是,当我对它进行负载测试时。我看到并发请求的响应时间随着并发数的增加而增加。假设使用jmeter,1个用户进行1000次迭代,平均响应时间为7毫秒。2个用户进行1000次迭代,平均响应时间为7毫秒。时间-14毫秒。如何提高响应时间以使并发请求保持不变。您不认为您可以在单个线程中实现这种并发吗?我的用例是从浏览器发送不同的请求,从而触发发送和接收。因此,我不明白单线程如何用于发送和接收。