133.12. 重复使用端点并发送到在运行时计算的不同目的地
如果您需要发送消息到许多不同的 RabbitMQ 交换,您必须重复使用端点并在消息标头中指定实际目的地。这允许 Camel 重复使用同一端点,但发送到不同的交换。这大大减少了在内存和线程资源上创建和经济的端点数量。
使用 toD 比使用标头指定动态目的地更容易。
您可以使用以下标头来指定:
| 标头 | 类型 | 描述 |
|---|---|---|
|
|
| 交换名称。 |
|
|
| 路由密钥。 |
例如,以下路由演示了如何在运行时计算目的地,并使用它覆盖端点 URL 中显示的交换:
from("file://inbox")
.to("bean:computeDestination")
.to("spring-rabbitmq:dummy");
交换名称 dummy 仅是一个占位符。它必须作为 RabbitMQ 端点 URL 的一部分提供,但本例中将被忽略。
在 computeDestination bean 中,通过设置 CamelRabbitmqExchangeOverrideName 标头来指定实际目的地,如下所示:
public void setExchangeHeader(Exchange exchange) {
String region = ....
exchange.getIn().setHeader("CamelSpringRabbitmqExchangeOverrideName", "order-" + region);
}
Camel 读取此标头,并将其用作交换名称,而不是端点上配置的名称。因此,在本示例中,Camel 会将消息发送到 spring-rabbitmq:order-emea,假定 region 值是 emea。
制作者从交换中删除 CamelSpringRabbitmqExchangeOverrideName 和 CamelSpringRabbitmqRoutingOverrideKey 标头,且不会将它们传播到创建的 Rabbitmq 消息,以避免路由中的意外循环(当消息转发到另一个 RabbitMQ 端点时)。