【问题标题】:How to set custom headers on RabbitMQ message using Apache Camel?如何使用 Apache Camel 在 RabbitMQ 消息上设置自定义标头?
【发布时间】:2019-02-08 15:22:01
【问题描述】:

我正在尝试在我的消息中添加自定义标头,因此每当发生异常并最终进入死信队列时,我都可以看到异常是什么。然而我所有的尝试都失败了。

  • 使用 .setHeader()
  • 在 outMessage 上设置标题
  • 设置交易所的属性

不允许将异常设置为有效负载中的属性。

@Component
public class ProcessRoute extends RouteBuilder {
    ...
    @Override
    public void configure() throws Exception {
        onException(Exception.class)
                .log("Error for ${body}! Requeue")
                .redeliveryDelay(2000)
                .maximumRedeliveries(3)
                .handled(true)
                .setHeader("TEST", constant("TEST"))
                .process(e -> {
                    e.getOut().setHeader("TEST", "TEST");
                    e.setProperty("TEST","TEST");
                });

        from(SOME_ROUTE)
          .doSomeStuff()
          .to(RABBITMQ);
    }
    ...
}

RABBITMQ 字符串:

rabbitmq://foo
?exchangeType=topic
&addresses=localhost:1234
&routingKey=#
&autoDelete=false
&queue=bar
&autoAck=false
&deadLetterExchange=DLX
&deadLetterQueue=bar.dlq
&deadLetterExchangeType=direct
&deadLetterRoutingKey=#
&username=foo
&password=bar

死信队列上的结果消息:

【问题讨论】:

    标签: rabbitmq apache-camel dead-letter


    【解决方案1】:

    如果您按照 Camel RabbitMQ 组件建立的模式使用标头键,那么当消息发布到 RabbitMQ 时,您的自定义标头将被拾取。

    取自您上面的代码,而不是:

    .setHeader("TEST", constant("TEST"))
    

    这样做:

    .setHeader("rabbitmq.TEST", constant("TEST"))
    

    Camel RabbitMQ 组件似乎忽略了所有其他可能在 Camel 交换中的非“rabbitmq.*”标头,这可能是有充分理由的。可能有很多,其中大多数在发布到 RabbitMQ 的消息的上下文中没有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 2015-09-27
      相关资源
      最近更新 更多