如何使用 Apache Camel 在 RabbitMQ 消息上设置自定义标头?

Edw*_*ard 6 apache-camel rabbitmq dead-letter

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

  • 使用 .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);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

死信队列上的结果消息: 死信队列上的结果消息

Jas*_*erg 3

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

从上面的代码中获取,而不是:

.setHeader("TEST", constant("TEST"))
Run Code Online (Sandbox Code Playgroud)

做这个:

.setHeader("rabbitmq.TEST", constant("TEST"))
Run Code Online (Sandbox Code Playgroud)

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