Spring集成声明检查模式 - 在失败时重新发送

时间:2016-12-09 13:31:19

标签: java spring-integration spring-amqp

所以,我的设置是:

<int-amqp:inbound-channel-adapter channel="input-channel" queue-names="probni" message-converter="jsonMessageConverter"
                                  channel-transacted="true"
                                  transaction-manager="dataSourceTransactionManager"/>
<int:chain input-channel="input-channel" output-channel="oc2">
    <int:service-activator ref="h1" method="handle" />
    <int:service-activator ref="h2" method="handle" />
    <int:service-activator ref="h3" method="handle" />
    <int:splitter  />
    <int:claim-check-in message-store="messageStore" />
</int:chain>


<int:channel id="oc2">
    <int:dispatcher task-executor="taskExecutor" />
</int:channel>

<int:channel id="oc3" />

<int:claim-check-out message-store="messageStore" input-channel="oc2" output-channel="oc3" auto-startup="true" remove-message="true" />

<int-amqp:outbound-channel-adapter exchange-name="someexc" channel="oc3" amqp-template="rabbitTemplate" />

我希望能够在与int-amqp:inbound-channel-adapter相同的事务中将消息存储到messageStore,然后有单独的线程将实际将此消息发送到其他amqp交换。此外,如果第一个线程将消息保存在messageStore中,然后完成进程被终止,则在重新启动声明检出时应该知道它需要加载未发送的消息并在这种情况下将其发送到oc3通道。

还有一件事 - 如果我有多个声明签入/签出工作人员共享同一个数据库表,他们如何知道哪个消息属于哪个声明检出工作人员(当我们有来自不同的多个消息时尤其重要关于组件启动的索赔 - ?

谢谢!

1 个答案:

答案 0 :(得分:1)

首先让我们再看一下Claim-Check描述:

  

在上面的配置中,input-channel上收到的消息将持久保存到使用message-store属性标识的消息存储库,并使用生成的ID编制索引。该ID是该消息的声明检查。 Claim Check也将成为将发送到output-channel的新(已转换)消息的有效负载。

因此,在Claim-Check-In中转换后,我们对存储的消息有一个id,并且Claim-Check-Out使用它来恢复存储的消息。

为此目的,您可以使用QueueChannel而不是执行程序与持久MessageStore

这是一个想法。

另一个就像通过常规INT_MESSAGE<int-jdbc:inbound-channel-adapter>列进行真正的投票MESSAGE_ID表格,并将结果发送到<claim-check-out>