我有一个项目,我将AMQP消息发送到RabbitMQ服务器。此消息是同步消息(我使用sendAndReceive方法)。因此,我将SimpleMessageListenerContainer配置为RabbitTemplate作为MessageListener,并且响应队列是固定的(RabbitTemplate中的setReplyAddress)。
如果我有一个可以同时发送一些消息的多线程服务器(Tomcat),如果响应没有按顺序到达或者应用程序在对另一条消息的响应到达之前发送消息,则会出现问题?
答案 0 :(得分:1)
使用 correlationId 标头将响应与请求配对。客户端必须为每个请求将其设置为唯一值,并且服务器必须为响应队列设置相同的值。这样,即使客户以任意顺序到达,客户也可以将消息配对。
在上面介绍的方法中,我们建议为每个RPC请求创建一个回调队列。这是非常低效的,但幸运的是有更好的方法 - 让我们为每个客户创建一个回调队列。
这引发了一个新问题,在那个队列中收到了响应 不清楚响应属于哪个请求。就是那个时候 使用correlationId属性。我们将把它设置为一个独特的 每个请求的价值。后来,当我们收到消息时 回调队列我们将看看这个属性,并基于我们将 能够将响应与请求进行匹配。如果我们看到未知 correlationId值,我们可以安全地丢弃该消息 - 它没有 属于我们的要求。