【问题标题】:Tracking the progress of async service activators跟踪异步服务激活器的进度
【发布时间】:2016-03-25 21:31:21
【问题描述】:

我有一个以特定顺序调用某些组件的 spring 集成流程。在最后阶段,通过在 publish-subscribe-channel 上使用 task-executor 并行调用 3 个组件。

<int:publish-subscribe-channel id="pubSubChannel"
    task-executor="executor" />

<int:service-activator id="configure1"
    input-channel="pubSubChannel">
    <bean class="..." />
</int:service-activator>

<int:service-activator id="configure2"
    input-channel="pubSubChannel">
    <bean class="..." />
</int:service-activator>

<int:service-activator id="configure3"
    input-channel="pubSubChannel">
    <bean class="..." />
</int:service-activator>

我想弄清楚所有这些组件何时完成它们的工作,以在正在处理的项目上标记某种成功完成状态。

什么 spring 集成组件或模式可以帮助我实现这一目标?

我想跟踪所有 3 个组件是否已完成且没有错误,并且我想等到所有 3 个组件都完成。

几乎就像这个流程之后的一个通道,它接收所有 3 条消息,并且能够跟踪哪个消息来自哪个激活器/通道,以了解何时收到所有 3 条消息并且工作已经完成。

【问题讨论】:

    标签: spring-integration


    【解决方案1】:

    PublishSubscribeChannelapplySequence 选项,可以打开true

    PublishSubscribeChannel 使用 SecuneceDetails 标头向每个订阅者发送消息。

    &lt;aggregator&gt;(作为默认值)可以查阅这些标头以形成message group,并在所有序列都到达&lt;aggregator&gt; 后准确地产生结果。

    您可以在参考手册中找到有关此问题的更多信息。

    【讨论】:

    • Sine apply-sequence 创建一个新消息并使用一个新的correlation-id,有没有办法指定或覆盖发布订阅通道使用的相关 ID。我曾尝试在此频道之前设置相关 id,但由于生成了新消息,它也会创建一个新的相关 id。
    • 不,你不能。我(还)找不到论据来解释没有对此事进行定制的原因。但是您愿意分享一下为什么基于传入消息id 的默认算法对您来说不够用吗?
    • 让我理解这一点 - 因此,如果我有 2 条消息进入发布-订阅通道,听起来会生成两个唯一的相关 ID,因此我的聚合器应该能够识别这两个组(可能来自 6 条消息)并在每个组的序列号与序列大小匹配时释放它们。如果是这样的话,那我觉得我没问题。
    • 是的。这是正确的。发布订阅通道使用传入消息的 Id 作为传出消息的相关键。聚合器将知道为此构建哪个组。最后,您将在一条请求消息和它的回复组之间建立关联。
    • 谢谢,这是有道理的。这似乎是此release-strategy-expression="[0].headers.sequenceNumber == [0].headers.sequenceSize" 的有效发布策略表达式。我从参考手册中得到了这个,但我不确定为什么 [0] (集合中的第一条消息),其次它实际上不起作用。聚合器未使用此表达式发布消息
    猜你喜欢
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2019-11-16
    • 1970-01-01
    相关资源
    最近更新 更多