假设我有一条JMS消息FooCompleted
{"businessId": 1,"timestamp": "20140101 01:01:01.000"}
和另一条JMS消息BazCompleted
{"businessId": 1,"timestamp": "20140101 01:02:02.000"}
用例是我希望在收到有关业务ID的两条消息时触发某些操作 - 实际上是接收这两条消息的连接点。这两条消息发布在两个不同的队列中,FooCompleted
和BazCompleted
的接收之间的顺序可能会发生变化。实际上,我可能需要加入接收有关businessId的几个不同消息。
天真的方法是将消息的接收存储在数据库中,并检查是否已收到其依赖连接臂的消息,然后才启动所需的操作。鉴于问题看起来很通用,我们想知道是否有更好的方法来解决这个问题。
另一个想法是在接收时将这两个队列中的消息移动到第三个队列中。第三个队列上的侦听器将使用DefaultMessageListenerContainer
的特殊化身,它会覆盖doReceiveAndExecute
以便为队列中的所有未完成消息调用receiveMessage
,并将消息添加回所有依赖的队列消息尚未到达 - 剩余的消息将被确认并因此被删除。鉴于消息量很低,探测队列并再次添加消息应该不是问题。优点是避免了DB依赖关系和相关的脚手架代码。想看看这个
大师,请批评并指出实现这一目标的更好方法。
提前致谢!
答案 0 :(得分:1)
Spring Integration和带有自定义关联和释放策略的聚合器,以及一个持久(JDBC)消息存储将提供您的第一个解决方案,而无需编写太多(或任何)代码。