12.3. wire Tap
wire Tap 复制链接链接已复制到粘贴板!
wire tap 模式(如 图 12.1 “wire Tap 模式” 所示)可让您将消息的副本路由到单独的 tap 位置,原始消息被转发到最终目的地。
图 12.1. wire Tap 模式
Wiretap 节点 复制链接链接已复制到粘贴板!
Apache Camel 2.0 引入了用于进行线路利用的 wireTap
节点。wireTap
节点将原始交换复制到被利用交换的交换中,其交换模式被设置为 InOnly,因为应以 单向方式 传播利用的交换。tapped Exchange 在单独的线程中处理,以便它可以与主路由同时运行。
wireTap
支持两种不同的方法来利用交换:
- TAP 是原始交换的副本。
- 利用一个新交换实例,您可以自定义被利用的交换。
从 Camel 2.16,当将交换发送到有线 tap 目的地时,Wire Tap EIP 会发出事件通知。
自 Camel 2.20 起,Wire Tap EIP 将在关机时完成任何 inflight 电缆利用的交换。
使用原始交换的副本 复制链接链接已复制到粘贴板!
使用 Java DSL:
from("direct:start") .to("log:foo") .wireTap("direct:tap") .to("mock:result");
from("direct:start")
.to("log:foo")
.wireTap("direct:tap")
.to("mock:result");
使用 Spring XML 扩展:
tap 并修改原始交换的副本 复制链接链接已复制到粘贴板!
通过使用 Java DSL,Apache Camel 支持使用处理器或表达式修改原始交换的副本。使用处理器可让您完全获得交换填充方式,因为您可以设置属性、标头等。表达式方法只能用于修改 In 消息正文。
例如,使用 处理器 方法修改原始交换的副本:
使用 表达式 方法修改原始交换的副本:
from("direct:start") .wireTap("direct:foo", constant("Bye World")) .to("mock:result"); from("direct:foo").to("mock:foo");
from("direct:start")
.wireTap("direct:foo", constant("Bye World"))
.to("mock:result");
from("direct:foo").to("mock:foo");
使用 Spring XML 扩展,您可以使用 处理器 方法修改原始交换的副本,其中 processorRef
属性引用带有 myProcessor
ID 的 spring bean:
<route> <from uri="direct:start2"/> <wireTap uri="direct:foo" processorRef="myProcessor"/> <to uri="mock:result"/> </route>
<route>
<from uri="direct:start2"/>
<wireTap uri="direct:foo" processorRef="myProcessor"/>
<to uri="mock:result"/>
</route>
使用 表达式 方法修改原始交换的副本:
TAP 一个新的交换实例 复制链接链接已复制到粘贴板!
您可以通过将 copy 标记设置为 false
(默认为 true
)来定义带有新交换实例的 wiretap。在这种情况下,会为 wiretap 创建一个空的交换。
例如,使用 处理器 方法创建新的交换实例:
其中第二个 wireTap
参数将 copy 标志设置为 false
,这表示原始交换 没有 复制,而是创建一个空的交换。
使用 表达式 方法创建新的交换实例:
from("direct:start") .wireTap("direct:foo", false, constant("Bye World")) .to("mock:result"); from("direct:foo").to("mock:foo");
from("direct:start")
.wireTap("direct:foo", false, constant("Bye World"))
.to("mock:result");
from("direct:foo").to("mock:foo");
通过使用 Spring XML 扩展,您可以通过将 wireTap
元素的 copy
属性设置为 false
来指示要创建新的交换。
要使用 处理器 方法创建新的交换实例,其中 processorRef
属性引用带有 myProcessor
ID 的 spring bean,如下所示:
<route> <from uri="direct:start2"/> <wireTap uri="direct:foo" processorRef="myProcessor" copy="false"/> <to uri="mock:result"/> </route>
<route>
<from uri="direct:start2"/>
<wireTap uri="direct:foo" processorRef="myProcessor" copy="false"/>
<to uri="mock:result"/>
</route>
使用 表达式 方法创建新的交换实例:
发送一个新的 Exchange 并在 DSL 中设置标头 复制链接链接已复制到粘贴板!
从 Camel 2.8 开始提供
如果您使用 第 12.3 节 “wire Tap” 发送新信息,则您只能使用 DSL 中的 第 II 部分 “路由表达式和 predicates 语言” 设置消息正文。如果您还需要设置新标头,则必须为此使用 第 1.5 节 “处理器”。因此,在 Camel 2.8 中,我们改进了这种情况,因此您现在可以在 DSL 中设置标头。
以下示例发送一条具有的新消息
- "bye World"作为消息正文
- 具有键为 "id" 的标头,值为 123
- 具有键"date"的标头,其当前日期为值
Java DSL 复制链接链接已复制到粘贴板!
XML DSL 复制链接链接已复制到粘贴板!
XML DSL 与 Java DSL 稍有不同,因为您如何配置消息正文和标头。在 XML 中,您使用 <body> 和 <setHeader>,如下所示:
使用 URI 复制链接链接已复制到粘贴板!
wire Tap 支持静态和动态端点 URI。静态端点 URI 从 Camel 2.20 提供。
下例演示了如何将 wire tap 到 JMS 队列,其中标头 ID 是队列名称的一部分。
from("direct:start") .wireTap("jms:queue:backup-${header.id}") .to("bean:doSomething");
from("direct:start")
.wireTap("jms:queue:backup-${header.id}")
.to("bean:doSomething");
有关动态端点 URI 的更多信息,请参阅 “动态到”一节。
在准备消息时,使用 onPrepare 来执行自定义逻辑 复制链接链接已复制到粘贴板!
从 Camel 2.8 开始提供
详情请查看 第 8.13 节 “多播”。
选项 复制链接链接已复制到粘贴板!
wireTap
DSL 命令支持以下选项:
Name | 默认值 | 描述 |
|
发送有线 tapped 消息的端点 uri。您应该使用 | |
|
指的是发送有线 tapped 消息的端点。您应该使用 | |
| 指的是处理有线利用消息时使用的自定义 第 2.8 节 “线程模型”。如果没有设置,则 Camel 使用默认的线程池。 | |
| 指的是用于创建新消息的自定义 第 1.5 节 “处理器”(如发送新消息模式)。请参见以下内容。 | |
|
| Camel 2.3: 应该在有线利用消息时使用 “Exchanges”一节 的副本。 |
| Camel 2.8: 请参阅自定义 第 1.5 节 “处理器” 以准备 “Exchanges”一节 副本,以有线利用。这可让您执行任何自定义逻辑,如 deep-cloning the message payload (如果需要的话)。 |