线程和Jms事务

时间:2010-08-03 07:47:23

标签: java multithreading jms

我陷入了以下情况。请在此建议我

有一个入站队列 有一个主线程正在运行(我们没有使用JMS侦听器) 并从队列中选择一条消息并处理该消息 并启动另一个子线程再次处理。

现在的问题是我如何处理主线程和子线程中的事务。 这意味着当我在主线程中处理消息时说发生了一些数据库访问错误 所以我想将消息回滚到入站队列。 如果在主线程创建的子线程中发生相同的故障,则检索到的消息应该回滚到入站队列。

我已经浏览了JMS Spring Reference,但他们只是将事务划分为JMS Listeners

那么如何在我的场景中应用交易概念

请告诉我,如果您有任何示例程序,请与我分享。了解您的概念会更好

2 个答案:

答案 0 :(得分:2)

我认为你在这里处境艰难。在同一个交易中有两个线程在我看来充满了竞争条件和其他危险 - 实际上我甚至不确定它是否可能。我熟悉的JTA事务API使用从线程到事务的一对一映射。

为什么你不能拥有一个线程池,每个线程从队列中获取消息并完成所有工作。然后,在接收消息后,无需产生新线程。您可以获得良好的并行性和更高的简单性。

然后您发现您已经有效地重新发明了标准的Java方法。那么为什么不使用MDB?

答案 1 :(得分:0)

如果我理解的话,你有一个主线程来获取消息,并产生其他线程进行处理。

JMS支持拥有多个侦听器,这些侦听器以事务方式同时获取消息。这实际上是JMS的一个好处:您可以进行交易,并发消息传递。

所以我建议你使用一个线程池,每个线程都有自己的监听器。线程获取消息并在一个事务中处理它,然后循环。这样,如果处理失败,则消息将保留在队列中。每个线程都有一个监听器,因此您不再需要主线程。

另外goolge for Message Driven Bean,看看Spring是否支持某种类似的概念。