我正在尝试实现一个Camel组件/处理器,它接受一个输入并产生多个输出消息,类似于Splitter。与Splitter一样,输出应该转到路径中的下一个处理器/端点。
我看过Splitter& MulticastProcessor类希望我可以重用它们或使用类似的逻辑。据我所知,这个想法是为每个输出创建一个新的Exchange并发出它们。为此,我需要提供写入输出的端点。如果我在Processor类中动态创建端点,这是有效的;我的要求是将输出发送到路由中配置的端点。这是在下面的路线中,mycomponent需要写入(多次)file:output。
<route>
<from uri="file:input"/>
<to uri="mycomponent:OrderFlow?multi.output=true"/>
<to uri="file:output" />
</route>
对于Splitter,它由SplitDefinition类实例化,它可以访问输出Processor / Endpoint。
a)在处理器内是否可以访问配置的输出处理器/端点?
b)如果没有,我应该为我的处理器编写ProcessorDefinition类吗?任何关于此的指示都会有所帮助。
Petter下面提出的两个解决方案是,
a)注入Producer模板 b)使用Splitter组件和方法调用,而不是编写新组件。
答案 0 :(得分:2)
我假设您已阅读this page。
是的,您可以从自定义处理器发送多个交换,但不能真正发送到流中的下一个处理器。与上面的链接一样,您可以通过向生成器模板注入特定目标来解耦组件实现。您可以使用直接或seda传输将路径切割成多个部分,并使组件在那里发送消息。这样,您就可以在多个路径中重用代码。
正如您所指出的,这是在Camel核心中的分离器组件(以及其他组件)中完成的。例如,查看multicastprocessor baseclass。但是,由于路由构建器,处理器知道路由中有以下处理器。你自定义处理器并不是那么幸运。
您可以从CamelContext中提取该信息。抓住您的路线,在那里您可以找到路线中的处理器。然而,这似乎过于复杂。
更新: 不要试图改变DSL,而是利用现有的DSL和组件。
.split().method("mycomponent", "OrderFlow")
您的OrderFlow方法只需创建一个List&lt; ..&gt;而不是发出新的交换。结果消息。