我们有以下一个简单的要求,我们正在使用Spring Integration:
- 轮询几个数据库表以查找传入任务(带有
status=1
的行( - 处理上述行中的每一行并更新多个表,例如
A, B and C
。- 这些更新可能是顺序的和依赖的,即
B
和C
应在持久保存A
后更新,因为稍后将需要该信息。 - 以下是对
B
和C
的限制:B
将使用A
的 id 以及使用投票找到的行中的信息。
- 这些更新可能是顺序的和依赖的,即
- 将步骤 1. 中的
status
标志设置为0
我们目前拥有的:
-
轮询步骤 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>
-
将返回
List<Message<?>>
的服务激活器,因为它将是A
、B
和C
实体的组合。<int:service-activator input-channel="inboundWFOne" ref="wfOneService" method="processWFOne" output-channel="outboundWFOne" />
-
我们当时在考虑一个带有
<int:payload-type-router>
的<int:chain>
,它将A
、B
和C
路由到不同的通道,并且那里将有outbound-channel-adapter
写入DB。但是,不能保证订单与设计!我们如何形成链,以便在持久化A
后,我们将id
传回,以便B
和C
可以使用它。基本满足上述2.2中的条件。
注意:int:jpa
的outbound-channel-adapter
似乎没有任何方法可以传回持久化的对象。
有。如果您没有任何线程移位,则所有操作都在同一线程中按顺序执行。因此,您的List<Message<?>>
被迭代,项目被发送到路由器的通道。路由器知道将此消息进一步发送到何处 - 到相应的出站通道适配器进行保存。并且只有在保存后,调用才会返回到开头提到的循环中,以处理下一条消息。
因此,您只需要确保来自该服务激活器的消息列表中的正确顺序。