从Camel处理器/组件生成多个输出

时间:2014-03-01 09:48:00

标签: java apache-camel messaging eip

我正在尝试实现一个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组件和方法调用,而不是编写新组件。

1 个答案:

答案 0 :(得分:2)

我假设您已阅读this page

是的,您可以从自定义处理器发送多个交换,但不能真正发送到流中的下一个处理器。与上面的链接一样,您可以通过向生成器模板注入特定目标来解耦组件实现。您可以使用直接或seda传输将路径切割成多个部分,并使组件在那里发送消息。这样,您就可以在多个路径中重用代码。

正如您所指出的,这是在Camel核心中的分离器组件(以及其他组件)中完成的。例如,查看multicastprocessor baseclass。但是,由于路由构建器,处理器知道路由中有以下处理器。你自定义处理器并不是那么幸运。

您可以从CamelContext中提取该信息。抓住您的路线,在那里您可以找到路线中的处理器。然而,这似乎过于复杂。

更新: 不要试图改变DSL,而是利用现有的DSL和组件。

.split().method("mycomponent", "OrderFlow")

您的OrderFlow方法只需创建一个List&lt; ..&gt;而不是发出新的交换。结果消息。