28.10. 重复使用端点并发送到运行时计算的不同目的地
如果您需要发送消息到许多不同的 JMS 目的地,则重复利用 JMS 端点并在消息标头中指定实际目的地。这允许 Camel 重复使用同一端点,但会发送到不同的目的地。这可大大减少内存和线程资源中创建的端点数量。
您可以在以下标头中指定目的地:
标头 | 类型 | 描述 |
---|---|---|
|
| 目标对象。 |
|
| 目标名称。 |
例如,以下路由演示了如何在运行时计算目的地,并使用它来覆盖出现在 JMS URL 中的目的地:
from("file://inbox") .to("bean:computeDestination") .to("activemq:queue:dummy");
from("file://inbox")
.to("bean:computeDestination")
.to("activemq:queue:dummy");
队列名称 dummy
只是一个占位符。它必须作为 JMS 端点 URL 的一部分提供,但本例中将忽略。
在 computeDestination
bean 中,通过设置 CamelJmsDestinationName
标头来指定真实目的地,如下所示:
public void setJmsHeader(Exchange exchange) { String id = .... exchange.getIn().setHeader("CamelJmsDestinationName", "order:" + id"); }
public void setJmsHeader(Exchange exchange) {
String id = ....
exchange.getIn().setHeader("CamelJmsDestinationName", "order:" + id");
}
然后,Camel 将读取此标头并将其用作目的地,而不是在端点上配置的目的地。因此,在本示例中,Camel 会将消息发送到 activemq:queue:order:2
,假设 id
值为 2。
如果设置了 CamelJmsDestination
和 CamelJmsDestinationName
标头,则 CamelJmsDestination
将具有优先权。请记住,JMS 制作者从交换中删除
标头和 CamelJmsDestinationName 标头,且不会将它们传播到所创建的 JMS 消息,以避免路由中的意外循环(当消息将转发到另一个 JMS 端点时)。
CamelJmsDestination
Name