如何在使用Splitter和其他一些组件后保持相同的关联ID?

时间:2014-07-02 12:50:52

标签: java spring spring-integration

我正在使用Spring Integration XPath Splitters和Header Enrichers,如下所示:

    <!-- split the folders-->
    <int-xml:xpath-splitter input-channel="PQAdditionalContactHistory-Split-Filtered-Folders-Channel" output-channel="PQAdditionalContactHistory-Split-Filtered-Folders-Channel" >
    <int-xml:xpath-expression expression="//response/results/PQCallHistory/row"/>
    </int-xml:xpath-splitter>

<int:chain  input-channel="PQAdditionalContactHistory-Split-Filtered-Folders-Channel" output-channel="PQContactHistory-InputChannel" >
    <int:service-activator  ref="msgHandler" method="buildMessageFromExtSysResponse" />
    <int-xml:xslt-transformer xsl-resource="${stylesheet.PQAdditionalContactHistory-To-PQContactHistory-Request}" />
</int:chain>   

<int:channel id="PQContactHistory-InputChannel" />              
    <int:chain input-channel="PQContactHistory-InputChannel" output-channel="PQContactHistory-OutputChannel">

        <int-xml:xpath-splitter>
            <int-xml:xpath-expression expression="//PQCallHistory"  namespace-map="xmlMessageNamespace" />
        </int-xml:xpath-splitter>

        <int-xml:xslt-transformer xsl-resource="${stylesheet.PQContactHistoryStoredProcData}"  />

        <!-- Store the original payload in header for future purpose -->
        <int:header-enricher default-overwrite="true"  should-skip-nulls="true"  >
            <int:header name="${headerNames.originalPayload}" expression="payload" />   
        </int:header-enricher>  
    </int:chain>            

此处,计划是使用聚合器并在使用这些拆分消息执行某些操作后合并所有拆分消息。令人惊讶的是,所有拆分消息列表都没有立即到达聚合器。当我进一步调查以了解根本原因时,我发现拆分消息的相关ID在第二个拆分器之后发生了变化。但是,我需要将第一个拆分器拆分的所有消息列表作为聚合器端的一个块到达。有关如何实现这一目标的任何想法?如果我的问题不明确,请告诉我。

我使用的是默认<aggregator>行为:<int:aggregator input-channel="test" ref="xmlAggregator" method="aggreagateAdditionalFolders"></int:aggregator>

1 个答案:

答案 0 :(得分:1)

这是事实,因为任何splitter默认在其范围内提供SequenceDetailssequenceIdsequenceSize等)并将其存储在{{1通过MessageHeaders方式。

不幸的是stack doesn't support <int-xml:xpath-splitter>

但是你可以按照JIRA的方法来处理Pull Request。

这只是克服你的用例的一方。

另一个问题是apply-sequence="false"。您需要了解<aggregator>correlate在那里的组合。

我猜可能只是依赖于默认的release行为 - 处理<aggregator>标头。

那不好。在第一个SequenceDetails之后,xpath-splitter标头获得了许多回复消息的值。由于您将再次sequenceSize每次split,所以<aggregator>没有任何信息。

同样是关于sequenceNumber标头,这意味着<aggregator>的标记将消息应用于goup。

所以,请显示您的聚合器配置。之后我们会尝试一起提供解决方案。

无论如何,在这种情况下,您应该为聚合器提供一些自定义ReleaseStrategyCorrelationStrategy可能仍为默认值。

<强>更新

示例如何将XPathMessageSplitter配置为通用bean:

<int:service-activator>
    <beans:bean class="org.springframework.integration.xml.splitter.XPathMessageSplitter">
        <beans:constructor-arg type="org.springframework.xml.xpath.XPathExpression">
            <int-xml:xpath-expression expression="//PQCallHistory" namespace-map="xmlMessageNamespace" />
        </beans:constructor-arg>
    </beans:bean>
</int:service-activator>