3

我正在尝试实现一个 Camel 组件/处理器,它接受一个输入并产生多个输出消息,类似于拆分器。与 Splitter 一样,输出应该发送到路由中的下一个处理器/端点。

我查看了 Splitter 和 MulticastProcessor 类,希望可以重用它们或使用类似的逻辑。据我了解,这个想法是为每个输出创建一个新的 Exchange 并发出它们。为此,我需要提供要写入输出的端点。如果我在处理器类中动态创建端点,则此方法有效;我的要求是将输出发送到路由中配置的端点。也就是在下面的路径中,mycomponent 需要写入(多次)到 file:output。

    <route>
        <from uri="file:input"/>
        <to uri="mycomponent:OrderFlow?multi.output=true"/>
        <to uri="file:output" />
    </route>

在 Splitter 的情况下,它由可以访问输出处理器/端点的 SplitDefinition 类实例化。

a) 从处理器内部是否可以访问配置的输出处理器/端点?

b)如果不是,我应该为我的处理器编写一个 ProcessorDefinition 类吗?对此的任何指示都会有所帮助。

Petter 在下面建议的两个解决方案是,

a) 注入 Producer 模板 b) 将 Splitter 组件与方法调用一起使用,而不是编写新组件。

4

1 回答 1

2

我假设你已经阅读了这个页面

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

正如您所指出的,这是在 Camel 核心的分离器组件(以及其他组件)中完成的。以多播处理器基类为例。但是,由于路由生成器,处理器知道路由中的以下处理器。你的定制处理器就没那么幸运了。

但是,您可以从 CamelContext 中提取该信息。掌握您的路线,您可以在那里找到路线中的处理器。然而,这似乎使事情过于复杂。

更新:不要试图改变 DSL,而是利用已经存在的 DSL 和组件。

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

您的 OrderFlow 方法不需要发出新的交换,只需要创建一个 List<..> 与结果消息。

于 2014-03-01T13:24:19.607 回答