2015-02-11 84 views
1

ActiveMQ文档指出Session和MessageProducer对象不是线程安全的。如果我有一组线程可以产生持久性消息,那么如何正确地将它们发送到ActiveMQ,以了解特定的发送操作是否成功?正确的ActiveMQ生产者并发性

  1. 为每个工作线程都有一个单独的Session/MessageProducer。
  2. 创建显式的生产者线程集并通过BlockingQueue将消息传递给它们(如何确定发送是否成功?)。
  3. 使用未来<>为前一种情况在ActiveMQ中获得持久消息的成功状态。
  4. 只需将每个MessageProducer.sendMessage()调用包装在同步块中即可。

或者,也许有这种情况下的任何最佳做法。谢谢。

回答

1

访问线程之间共享会话的一个问题,就像您在2-4中说明的是事务管理。

如果您在JMS会话中执行某些操作,那么您需要确保知道事务何时被提交或回滚。这发生在会话对象上。多个线程在同一个会话上提交会导致错误。

什么是常见的(例如,如果你看看Spring的JmsTemplate)是你打开一个新的Connection/Session/MessageProducer,发送消息,然后关闭它们。这是非常低效的,但线程安全。为了解决效率问题,可以将ConnectionFactory包装在PooledConnectionFactory中。该池将在需要时借助会话/连接到您的线程,并且在会话上调用close时,它将被放回到池中。这样,你根本不必关心线程安全。有关主题here的更多信息,请参阅。

当然,如果您正在进行一些手动管理,您可以使用您的方法1并为每个线程保存一个会话。如果你有几个线程发送大量消息,那应该是最有效的方法。

相关问题