如何在camel routebuilder中拆分对象

时间:2014-05-23 19:04:04

标签: java apache-camel

您好,我是Java,骆驼等新手。以下是我的问题:

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

目前,此处理器使用ProducerTemplate显式实现此目的。我想将此行为移至RouteBuilder本身,而不是使用ProducerTemplate。我看过Splitter和MessageTranslator,但我认为我还没有完成所有的部分。

所以基本上我想使用Splitter在RouteBuilder中拆分消息,但是我想提供将接收消息的自定义代码,然后将其反序列化为Order对象,然后创建多个Order对象,然后将它们全部发送为将消息分隔到下一个端点。我该如何做到这一点?

e.g。我希望能够做类似

的事情
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.

1 个答案:

答案 0 :(得分:2)

您的路线中可以有一个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 docs显示了两者。这是一些实际的春季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>