java - 如何在camel路线构建器中分割对象

标签 java apache-camel

您好,我对 Java、camel 等还很陌生。这是我的问题:

我有代码将包含订单项和 xml 格式的其他一些信息的订单从一个 Camel 处理器传递到另一个。然后,这个特定的处理器将订单拆分并创建多个订单,然后将它们作为单独的消息全部传递到下一个端点。

目前,该处理器使用 ProducerTemplate 来显式完成此任务。我想将此行为移至 RouteBuilder 本身,而不是使用 ProducerTemplate。我已经研究过 Splitter 和 MessageTranslator,但我认为我还没有掌握所有部分。

所以基本上我想使用 Splitter 在 RouteBuilder 中拆分消息,但我想提供自定义代码来获取消息,然后将其反序列化为 Order 对象,然后创建多个 Order 对象,然后将它们全部发送为将消息单独发送到下一个端点。我该如何实现这个目标?

例如我希望能够做类似的事情

from("startPoint").split(MyCustomStrategy).to("endPoint")

//where MyCustomStrategy will take the message, 
//and split it up and pass all the newly created messages to endPoint.

最佳答案

您可以在 route 使用一个 bean 或处理器来创建 Order对象并将它们作为集合返回(例如 List<Order> 或类似的)。然后可以使用分离器 EIP 来处理每个 Order在该系列中,一次一个,例如将每个订单传递到处理单个订单的另一个处理器/bean,可能根据需要继续到另一个端点,等等。

// Pseudocode:
from(input).
to(bean-which-returns-a-collection-of-orders).
split(on-the-body).
to(bean-which-processes-a-single-order).
to(anywhere-else-needed-for-your-purposes).
// etc...

或者类似的东西;抱歉,我使用 Spring DSL 而不是 Java DSL,但 Camel 文档显示了两者。下面是一些实际的 spring DSL 代码,其中集合被拆分以处理集合中的每个项目:

        <split>
              <simple>${body}</simple>
              <doTry>
                 <log message="A.a1 -- splitting batches for transfer" loggingLevel="DEBUG" />
                 <setHeader headerName="currentBatchNumber">
                    <simple>${body.batchNumber}</simple>
                 </setHeader>
                 <setHeader headerName="CamelFileName">
                    <simple>${body.batchNumber}.xml</simple>
                 </setHeader>
                 <log message="A.a2 -- marshalling a single batch to XML" loggingLevel="DEBUG" />
                 <marshal>
                     <jaxb prettyPrint="true" contextPath="generated.gov.nmcourts.ecitation"
                       partClass="generated.gov.nmcourts.ecitation.NMCitationEFileBatch"
                       partNamespace="EFileBatch" />
                 </marshal>

                 <log message="A.a3 -- xslt transform to add schema location" loggingLevel="DEBUG" />
                 <to uri="{{addSchemaLocationXsltUri}}"/>

                 <log message="A.a4 -- ftp now initiating" loggingLevel="DEBUG" />
                 <log message="ftping $simple{in.header.CamelFileName}" loggingLevel="DEBUG"/>

                 <bean ref="markFtpStatusOnTickets"/>
                 <to uri="{{ftpOdysseyInputPath}}"/>
                 <log message="A.a5 -- ftp now complete" loggingLevel="DEBUG" />
                 <doCatch>
                    <exception>java.lang.Exception</exception>
                    <handled>
                       <constant>true</constant>
                    </handled>
                    <bean ref="ticketExceptionHandler" method="handleException"/>
                 </doCatch>
              </doTry>
          </split>

关于java - 如何在camel路线构建器中分割对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23836705/

相关文章:

java - 自定义标签库的uri问题

java - JDBC 和 MS-Access 问题

java - 使用camel-bindy或beanio解析键值文本文件

java - 为 Apache Camel 配置数据源

java - 使用 Apache Camel 的 Spring Boot 应用程序在启动后立即关闭

java - Spring Boot中可以通过依赖注入(inject)来完成请求验证吗?

java - 获取NoClassDefFoundError : com. mysql.jdbc.Driver

java - Android 版本 6 和 7 上的代号一个相机权限

java - NoClassDefFound错误: ComponentExtension in Apache Camel

apache-camel - Camel Exchange getbody 的文件对象为空