在Spring Integration中有效地使用级联分割器和聚合器

时间:2017-03-03 13:06:12

标签: spring-integration

我有以下xml进来。

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <case>
      <issue>
         <issueid>123</issueid>
      </issue>
      <issue>

             <issueid>456</issueid>
          </issue>
       </case>
       <case>
          <issue>
             <issueid>789</issueid>
          </issue>
       </case>
    </root>

xml的摘要是每个案例都会有多个问题。每个问题可以有一个来源。  现在,我必须使用<issueid>值来处理每个问题并点击其余服务,以检索与该问题相关的源。  然后我必须按以下方式重构xml:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <case>
      <issue>
         <issueid>123</issueid>
         <source>s1</source>
      </issue>
      <issue>
         <issueid>456</issueid>
         <source>s2</source>
      </issue>
   </case>
   <case>
      <issue>
         <issueid>789</issueid>
         <source>s3</source>
      </issue>
   </case>
</root>

完成上述任务的最佳方法是什么,以便分割案例,拆分问题,为问题指定来源,汇总所有案例以及汇总与案例相关的所有问题变得更加容易?

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

你的问题不清楚。

Spring Integration提供了XPathMessageSplitter组件,可以应用于第一级//case。然后第二个XPathMessageSplitter必须处理//issue。流程中的下一个组件应该类似于XPathTransformer,以便为您的服务提取//issueid值。

后向逻辑有点棘手,因为Spring Integration中没有内置的xml-aggregator。但您可以通过某些自定义MessageGroupProcessor来实现这一目标,例如从组中的所有消息构建XML作为String。

答案 1 :(得分:0)

你的问题有点模糊,但无论如何我都会尽力回答。

让我们想起第一部分。你可以做类似下面的事情

<si:chain id="xmlInputchain" input-channel="xmlInputChannel"  output-channel="aggregatorChannel">   
    <si:service-activator id="xmlRequestHandler" method="xmlRequestProcessing" ref="xmlRequestService" />
    <si:splitter/>      
    <si:service-activator id="webService" method="webserviceMethod" ref="webServiceClient" />           
</si:chain>

这将分解每个案例,并且在您的webserviceClient中,您可以针对每个问题调用webserivce并将信息存储在数组中并将其转发到aggregatorChannel

对于第二部分(aggregatorChannel),这个Spring页面有一些关于聚合的例子

http://docs.spring.io/spring-integration/docs/2.0.0.RC1/reference/html/aggregator.html