您好,我是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.
答案 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>