【问题标题】:Spring AMQP and CorrelationIdSpring AMQP 和 CorrelationId
【发布时间】:2016-04-11 09:10:07
【问题描述】:

当你使用sendAndReceive()(how can i get correlationId?) 方法时,我已经看到 Spring AMQP 改变了属性 correlationId 的值。

如果我想设置自己的correlationId(发送消息前需要保存correlationId),有没有办法防止spring改变correlationId的值?

谢谢

【问题讨论】:

    标签: spring spring-amqp


    【解决方案1】:

    以下内容仅适用于您使用回复容器的情况;如果没有,Spring 根本不使用correlationId。

    模板不能依赖于用户提供的correlationId,因为它必须是唯一的,并且不能保证用户提供的模板是唯一的。

    默认情况下,模板使用标准的correlationId 标头,它会在内部保存任何用户提供的值,并在收到回复时恢复它。用户提供的 correlationId 不会发送到远程系统。

    您可以通过设置correlationKey(例如设置为springCorrelationId)来告诉模板使用不同的标头进行关联(并保持用户提供的值不变)。但是,这样做时,远程系统必须在回复中回显该标头(以便模板可以将回复与请求相匹配)。

    【讨论】:

    • 谢谢加里。那么在发送消息之前就不可能知道correlationId了?
    • 是的,有一种方法可以访问它,但首先你能解释一下你想要实现的目标(即你需要它做什么),所以我可以理解目标,以防万一我们应该这样做考虑烘焙到框架中。
    • 当然。场景如下:当我向服务器发送一条消息时,它(同步)响应一个 ACK​​ 指示消息已收到。一定时间后,是服务器发送一条AMQP消息,表示消息处理的结果。在这两条消息中,服务器都会发送我们的客户端发送的correlationId,以识别它响应的消息。
    • 嗯——sendAndReceive() 方法只需要一个响应。 ack 会在其他队列中返回吗?我想是的。一种解决方案是将MessagePostProcessor 添加到模板的beforePublishPostProcessors - 它将在发布之前立即调用 - 在建立correlationId 之后。但是,对于长时间运行的请求,您最好使用send() 并设置一个消息侦听器容器来接收回复(和确认);这样你就不会一直占用调用线程。
    • 谢谢。我有两个不同的队列,一个用于 ACK,另一个用于第二条消息,还有另一个 SimpleMessageListenerContainer。
    猜你喜欢
    • 1970-01-01
    • 2012-09-12
    • 2015-01-31
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    相关资源
    最近更新 更多