我正在使用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>

最佳答案

没错,因为默认情况下任何splitter都会在其范围内提供SequenceDetailssequenceIdsequenceSize等),并通过MessageHeaders方式将其存储在stack中。

不幸的是<int-xml:xpath-splitter> doesn't support apply-sequence="false"呢。

但是,您可以遵循该拉取请求的JIRA解决方法。

那只是克服用例的一方面。

另一个问题是关于<aggregator>的。需要知道您如何在correlaterelease那里分组。

我可能猜测您只是依靠默认的<aggregator>行为-处理该SequenceDetails标头。

这不好。在第一个xpath-splitter之后,sequenceSize标头已获得该值作为许多回复消息。由于您将要再次访问每个split,因此没有信息将有多少物品进入<aggregator>

关于sequenceNumber标头的操作相同,这意味着<aggregator>将消息应用于或不应用于组的标记。

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

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

更新

该示例如何将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>

10-06 12:52