【发布时间】:2016-04-11 09:10:07
【问题描述】:
当你使用sendAndReceive()(how can i get correlationId?) 方法时,我已经看到 Spring AMQP 改变了属性 correlationId 的值。
如果我想设置自己的correlationId(发送消息前需要保存correlationId),有没有办法防止spring改变correlationId的值?
谢谢
【问题讨论】:
标签: spring spring-amqp
当你使用sendAndReceive()(how can i get correlationId?) 方法时,我已经看到 Spring AMQP 改变了属性 correlationId 的值。
如果我想设置自己的correlationId(发送消息前需要保存correlationId),有没有办法防止spring改变correlationId的值?
谢谢
【问题讨论】:
标签: spring spring-amqp
以下内容仅适用于您使用回复容器的情况;如果没有,Spring 根本不使用correlationId。
模板不能依赖于用户提供的correlationId,因为它必须是唯一的,并且不能保证用户提供的模板是唯一的。
默认情况下,模板使用标准的correlationId 标头,它会在内部保存任何用户提供的值,并在收到回复时恢复它。用户提供的 correlationId 不会发送到远程系统。
您可以通过设置correlationKey(例如设置为springCorrelationId)来告诉模板使用不同的标头进行关联(并保持用户提供的值不变)。但是,这样做时,远程系统必须在回复中回显该标头(以便模板可以将回复与请求相匹配)。
【讨论】:
sendAndReceive() 方法只需要一个响应。 ack 会在其他队列中返回吗?我想是的。一种解决方案是将MessagePostProcessor 添加到模板的beforePublishPostProcessors - 它将在发布之前立即调用 - 在建立correlationId 之后。但是,对于长时间运行的请求,您最好使用send() 并设置一个消息侦听器容器来接收回复(和确认);这样你就不会一直占用调用线程。