Apache Camel ,如何测试路由与窃听?

qv7cva1a  于 2023-04-20  发布在  Apache
关注(0)|答案(2)|浏览(183)

我想用wireTaps编写一个路由测试。

from("direct:inhouse")
.wireTap("direct:persist")
.process(...)
.unmarshal()
.wireTap("direct:transferToX")
.to("direct:createResponse")
.marshal()
.process()
.wireTap("direct:persist")

在wireTaps向其发送消息的一些端点处,uuidService用于生成UUID。My Test模拟uuid服务,以便在每次请求下一个uuid时返回递增的uuid,例如“uuid-1”,“uuid-2”等。
由于wireTaps不是以有保证的顺序执行的,所以我不能编写一个稳定的测试来检查消息头是否包含预期的UUID。
我正在寻找一种方法,使wireTap路径按照路由中定义的顺序执行。
我尝试使用AdviceWithRouteBuilder来实现这一点,它将wireTaps()替换为multicast(),但发现这不够通用,因为我必须显式地定义多播的端点。如果有一种方法可以让多播将消息发送到wireTap(它取代)使用的同一个端点,那就可以了。但我找不到配置的方法。

kcwpcxri

kcwpcxri1#

使用executorService选项,您可以为窃听提供一个执行器服务,使其同步执行:

.wireTap("direct:persist").executorService(new SynchronousExecutorService())

您还可以从注册表中指定服务的名称,该名称在运行时进行查找,从而允许您使用不同的实现进行测试和生产

.wireTap("direct:persist").executorService("mySynchronousExecutorService")
wlp8pajw

wlp8pajw2#

假设你的UUID可能是一个简单的字符串(而不是一个真实的的,格式良好的UUID),一个替代方案可能是使你的测试顺序独立。例如,通过使用位掩码。
3次窃听=〉使用3位数掩码

001 which is 1
010 which is 2
100 which is 4

因此,通过在不同的窃听模拟中分别添加+1、+2和+4,您可以**无论执行顺序如何。

  • 如果最终UUID为7(=1+2+4),则检查是否调用了所有窃听
  • 在任何时刻知道哪些已经被调用(通过测试掩码值)

相关问题