【问题标题】:Sending a Message with Spring Cloud Stream and RabbitMq changes ID使用 Spring Cloud Stream 和 RabbitMq 发送消息更改 ID
【发布时间】:2018-10-19 15:00:00
【问题描述】:

我正在使用 Spring Cloud Stream 和 RabbitMq 在不同的微服务之间交换消息。

这就是我发布消息的设置。

public interface OutputChannels {
  static final String OUTPUT_CHANNEL = "outputChannel";

  @Output
  MessageChannel outputChannel();
}

.

@EnableBinding(OutputChannels.class)
@Log4j
public class OutputProducer {

  @Autowired
  private OutputChannels outputChannels;

  public void createMessage(MyContent myContent) {
    Message<MyContent> message = MessageBuilder
      .withPayload(myContent)
      .build();
    outputChannels.outputChannel().send(message);
    log.info("Sent message: " + message.getHeaders().getId() + myContent);
  }
}

以及接收消息的设置

public interface InputChannels {
  String INPUT_CHANNEL = "inputChannel";

  @Input
  SubscribableChannel inputChannel();
}

.

@EnableBinding(InputChannels.class)
@Log
public class InputConsumer {

  @StreamListener(InputChannels.INPUT_CHANNEL)
  public void receive(Message<MyContent> message) {

    MyContent myContent = message.getPayload();
    log.info("Received message: " + message.getHeaders().getId() + ", " + myContent);
  }
}

我能够通过此设置成功地交换消息。我希望,发送消息和接收消息的 ID 是相等的。但它们总是不同的 UUID。

有没有办法让消息从生产者通过 RabbitMq 到消费者的整个过程保持相同的 ID?

【问题讨论】:

    标签: spring rabbitmq spring-cloud-stream


    【解决方案1】:

    Spring Messaging 消息是不可变的;每次发生变异时,它们都会获得一个新 ID。

    您可以使用自定义标题或IntegrationMessageHeaderAccessor.CORRELATION_ID 来传达常量值;在大多数用例中,相关 id 标头由应用程序设置为消息旅程开始时的 ID 标头。

    【讨论】:

    • 自定义标头意味着,我在 MessageBuilder 中使用 .setHeader(headerName, headerValue) 添加自定义值? IntegrationMessageHeaderAccessor.CORRELATION_ID 如何工作?我必须手动设置吗? new IntegrationMessageHeaderAccessor(message).getCorrelationId() 始终是 null
    • 是的;你必须在一开始就设置它;大多数人只是简单地复制初始消息的 ID。它被框架用于聚合器等组件,但您可以将其用于您的目的(或选择自定义标头)。
    猜你喜欢
    • 1970-01-01
    • 2021-06-12
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 2021-03-25
    • 2020-09-28
    • 2018-01-24
    相关资源
    最近更新 更多