按顺序处理来自ServiceActivators的消息到多个出站通道适配器

时间:2017-08-10 03:51:12

标签: spring spring-data-jpa spring-integration

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

  1. 为传入任务(带有status=1的行)
  2. 轮询几个数据库表
  3. 处理上述行中的每一行并更新多个表格A, B and C
    1. 这些更新可能是顺序依赖,即BC应该在A持久化后更新稍后将需要信息。
    2. 以下是BC的约束:B将使用A的ID加上使用投票找到的行中的信息。
  4. 将步骤1中的status标记设置为0
  5. 我们到现在为止:

    1. inbound-channel-adapter用于投票第1步。

      <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:chain> <int:payload-type-router>,它会将ABC发送到不同的渠道,并且会有outbound-channel-adapter那里将写入DB。 然而,无法保证订单的设计! 我们如何形成链条,以便在A持续存在后我们将id传递回来,以便BC可以使用它。基本满足上述2.2中的条件。

    4. 注意:int:jpa&#39; outbound-channel-adapter似乎无法传回持久对象。

1 个答案:

答案 0 :(得分:1)

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

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