我正在尝试使用 Java DSL Fluent Builders 实现 WireTap,它提供了以下示例代码片段。
from("direct:start")
.to("log:foo")
.wireTap("direct:tap")
.to("mock:result");
如果我运行模拟示例(例如camel-example-jms-file),这将起作用。 但是,如果我采用示例代码并尝试替换真实的 Broker 实例和队列来替换模拟对象,则会失败并出现以下错误。
from("tcp://localhost:61616")
.to("ativemq:atsUpdateQueue")
.wireTap("activemq:fdmCaptureQueue");
然后就失败了
org.apache.camel.FailedToCreateRouteException: Failed to create route route2: Route(route2)[[From[tcp://localhost:61616?queue=atsUpdateQue... because of Failed to resolve endpoint: tcp://localhost:61616?queue=atsUpdateQueue due to: No component found with scheme: tcp
我在谷歌上进行了广泛的搜索,我发现的所有示例都使用虚拟模拟队列,似乎都没有说明如何与真正的代理一起工作,但我找不到任何有关骆驼 URI 规范的文档。
错误消息的重要部分描述了问题
No component found with scheme: tcp
,这是因为camel没有“tcp”组件,但是如果您想与tcp端点交互,可以使用netty组件:
from("netty:tcp://localhost:61616")
更多信息在这里 - http://camel.apache.org/netty.html
“tcp://localhost:61616”看起来像 activemq 代理地址。 您需要在 Java DSL 中将代理地址设置为 activemq 组件
camelContext.addComponent("activemq", activeMQComponent("tcp://localhost:61616"));
或者在 spring 配置文件中
<bean id="activemq"
class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="brokerURL" value="tcp://somehost:61616"/>
</bean>
您可以在这里找到有关camel-activemq的更多信息
谢谢您的建议,虽然有助于增加我的理解,但并没有真正解决我的问题。 我的代码是错误的,为了其他人的利益,我应该使用以下名称。
final String sourceQueue = "activemq:queue:atsUpdateQueue";
final String destinationQueue = "activemq:queue:atsEndPoint";
final String wiretapQueue = "activemq:queue:fdmCaptureQueue";
from(sourceQueue).wireTap(wiretapQueue).copy().to(destinationQueue);