正确的 ActiveMQ 生产者并发
Correct ActiveMQ producers concurrency
ActiveMQ 文档指出 Session 和 MessageProducer 对象不是线程安全的。如果我有一组可以产生持久消息的线程,那么如何将它们正确地发送到 ActiveMQ 并知道特定的发送操作是否成功?
- 每个工作线程都有一个单独的 Session/MessageProducer。
- 显式创建生产者线程集并通过 BlockingQueue 将消息传递给它们(如何确定发送是否成功?)。
- 在前面的案例中使用 Future<> 以获得在 ActiveMQ 中持久化消息的成功状态。
- 只需将每个 MessageProducer.sendMessage() 调用包装在一个同步块中。
或者对于这种情况可能有任何最佳实践。谢谢。
访问线程间共享会话的一个问题,如您在 2-4 中所述,是事务管理。
如果您在 JMS 会话中执行操作,那么您希望确保知道事务何时提交或回滚。这发生在会话对象上。多个线程在同一个会话上提交会导致错误。
常见的(例如,如果您查看来自 Spring 的 JmsTemplate)是您打开一个新的 Connection/Session/MessageProducer,发送一条消息,然后将它们全部关闭。这是非常低效的,但是线程安全的。要解决效率问题,您可以将 ConnectionFactory 包装在 PooledConnectionFactory 中。该池将在需要时将 sessions/connections 借给您的线程,并且在会话上调用关闭时,它将放回池中。这样一来,您根本不必关心线程安全。阅读有关主题 here 的更多信息。
当然,如果您需要进行一些手动管理,则可以使用方法 1 并为每个线程保存一个会话。如果您有几个发送大量消息的线程,那应该是最有效的方法。
ActiveMQ 文档指出 Session 和 MessageProducer 对象不是线程安全的。如果我有一组可以产生持久消息的线程,那么如何将它们正确地发送到 ActiveMQ 并知道特定的发送操作是否成功?
- 每个工作线程都有一个单独的 Session/MessageProducer。
- 显式创建生产者线程集并通过 BlockingQueue 将消息传递给它们(如何确定发送是否成功?)。
- 在前面的案例中使用 Future<> 以获得在 ActiveMQ 中持久化消息的成功状态。
- 只需将每个 MessageProducer.sendMessage() 调用包装在一个同步块中。
或者对于这种情况可能有任何最佳实践。谢谢。
访问线程间共享会话的一个问题,如您在 2-4 中所述,是事务管理。
如果您在 JMS 会话中执行操作,那么您希望确保知道事务何时提交或回滚。这发生在会话对象上。多个线程在同一个会话上提交会导致错误。
常见的(例如,如果您查看来自 Spring 的 JmsTemplate)是您打开一个新的 Connection/Session/MessageProducer,发送一条消息,然后将它们全部关闭。这是非常低效的,但是线程安全的。要解决效率问题,您可以将 ConnectionFactory 包装在 PooledConnectionFactory 中。该池将在需要时将 sessions/connections 借给您的线程,并且在会话上调用关闭时,它将放回池中。这样一来,您根本不必关心线程安全。阅读有关主题 here 的更多信息。
当然,如果您需要进行一些手动管理,则可以使用方法 1 并为每个线程保存一个会话。如果您有几个发送大量消息的线程,那应该是最有效的方法。