接收两种不同JMS消息的方法

时间:2014-01-29 13:57:41

标签: jms spring-jms

假设我有一条JMS消息FooCompleted

{"businessId": 1,"timestamp": "20140101 01:01:01.000"}

和另一条JMS消息BazCompleted

{"businessId": 1,"timestamp": "20140101 01:02:02.000"}

用例是我希望在收到有关业务ID的两条消息时触发某些操作 - 实际上是接收这两条消息的连接点。这两条消息发布在两个不同的队列中,FooCompletedBazCompleted的接收之间的顺序可能会发生变化。实际上,我可能需要加入接收有关businessId的几个不同消息。

天真的方法是将消息的接收存储在数据库中,并检查是否已收到其依赖连接臂的消息,然后才启动所需的操作。鉴于问题看起来很通用,我们想知道是否有更好的方法来解决这个问题。

另一个想法是在接收时将这两个队列中的消息移动到第三个队列中。第三个队列上的侦听器将使用DefaultMessageListenerContainer的特殊化身,它会覆盖doReceiveAndExecute以便为队列中的所有未完成消息调用receiveMessage,并将消息添加回所有依赖的队列消息尚未到达 - 剩余的消息将被确认并因此被删除。鉴于消息量很低,探测队列并再次添加消息应该不是问题。优点是避免了DB依赖关系和相关的脚手架代码。想看看这个

是否有什么明显的坏事

大师,请批评并指出实现这一目标的更好方法。

提前致谢!

1 个答案:

答案 0 :(得分:1)

带有JMS消息驱动适配器的

Spring Integration和带有自定义关联和释放策略的聚合器,以及一个持久(JDBC)消息存储将提供您的第一个解决方案,而无需编写太多(或任何)代码。