在Spring Integration中使用多个线程时声明签出

时间:2016-10-04 21:38:46

标签: spring multithreading spring-integration

我有一个巨大的xml作为Spring集成流的输入有效负载。所以我在变压器中使用声明检查而不是标头更丰富来保留我的有效负载。我正在使用内存中的消息存储。

稍后在我的SI流程中,我有一个拆分器,它将有效负载分成多个线程,每个线程将根据一个属性有效负载调用不同的通道。我正在使用路由器来实现这一目标。每个流程或每个线程使用声明检出变换器来检索初始有效负载,然后使用它来构建所需的响应。每个线程都会产生一个响应,我不必聚合它们。因此,我将从我的流程中发出多个响应,然后将其放入队列中。

我无法在结账时删除该消息,因为其他线程也会尝试检出相同的消息。从邮件存储中删除邮件的最佳方法是什么?

示例配置

`<int:chain input-channel="myInputChannel"
    output-channel="myOutputchannel">
    <int:claim-check-in />
    <int:header-enricher>
        <int:header name="myClaimCheckID" expression="payload"/>
    </int:header-enricher>
 </int:chain>`

在拆分器

之前调用流中的所有其他组件

<int:splitter input-channel="mySplitterChannel" output-channel="myRouterChannel" expression="mySplitExpression"> </int:splitter>

`<int:router input-channel="myRouterChannel" expression="routerExpression"
    resolution-required="true">
    <int:mapping value="A" channel="aChannel" />
    <int:mapping value="B" channel="bChannel" />
    <int:mapping value="C" channel="cChannel" />
</int:router>`

每个频道都有一个声明检出变压器用于初始有效载荷。那么如何确保在处理完所有线程后删除消息?

1 个答案:

答案 0 :(得分:0)

当您知道完成了消息后,您只需调用消息存储的remove()方法即可。您可以使用服务激活器

... expression="@store.remove(headers['myClaimCheckID'])" ...

但是,如果您使用的是内存中的邮件存储,则使用声明检查模式确实没有意义。

如果您只是将有效负载提升为标头,它将不会使用内存而不是将其放入存储中。

即使它在多个线程上的多个消息中结束,也没有区别,因为它们都将指向堆上的同一个对象。