按顺序处理从服务激活器到多个出站通道适配器的消息



我们有以下一个简单的要求,我们正在使用Spring Integration:

  1. 轮询几个数据库表以查找传入任务(带有status=1的行(
  2. 处理上述行中的每一行并更新多个表,例如A, B and C
    1. 这些更新可能是顺序的和依赖的,即BC应在持久保存A后更新,因为稍后将需要该信息。
    2. 以下是对BC的限制:B将使用A的 id 以及使用投票找到的行中的信息。
  3. 将步骤 1. 中的status标志设置为0

我们目前拥有的:

  1. 轮询步骤 1 的inbound-channel-adapter

    <int-jpa:inbound-channel-adapter channel="inboundWFOne"
    entity-manager="entityManagerFactory"
    jpa-query="select en from WorkflowOne en where en.status=1"
    delete-after-poll="true">
    <int:poller>
    <int:transactional propagation="REQUIRED" transaction-manager="transactionManager" />
    <!-- Note: This is not working for us.. hence the delete-after-poll for timebeing <int:transactional propagation="REQUIRED" transaction-manager="transactionManager" synchronization-factory="txSyncFactory"/>-->
    </int:poller>
    </int-jpa:inbound-channel-adapter>
    
  2. 将返回List<Message<?>>的服务激活器,因为它将是ABC实体的组合。

    <int:service-activator input-channel="inboundWFOne" ref="wfOneService"
    method="processWFOne" output-channel="outboundWFOne" />
    
  3. 我们当时在考虑一个带有<int:payload-type-router><int:chain>,它将ABC路由到不同的通道,并且那里将有outbound-channel-adapter写入DB。但是,不能保证订单与设计!我们如何形成链,以便在持久化A后,我们将id传回,以便BC可以使用它。基本满足上述2.2中的条件。

注意:int:jpaoutbound-channel-adapter似乎没有任何方法可以传回持久化的对象。

有。如果您没有任何线程移位,则所有操作都在同一线程中按顺序执行。因此,您的List<Message<?>>被迭代,项目被发送到路由器的通道。路由器知道将此消息进一步发送到何处 - 到相应的出站通道适配器进行保存。并且只有在保存后,调用才会返回到开头提到的循环中,以处理下一条消息。

因此,您只需要确保来自该服务激活器的消息列表中的正确顺序。

相关内容

最新更新