我使用Spring Integration XPath拆分器和Header充实器,如下所示:
<!-- 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
在其作用域内默认提供SequenceDetails
(sequenceId
, sequenceSize
等),并通过stack
方式将它们存储在MessageHeaders
中。
遗憾的是<int-xml:xpath-splitter>
还不支持apply-sequence="false"
。
但是你可以遵循JIRA的工作方式来处理这个Pull Request。
这只是克服用例的一面。
另一个问题是围绕<aggregator>
。有必要知道你的correlate
和release
组那里。
我猜你只是依赖默认的<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>