ActiveMQ Artemis ClientSession多线程独占共享是否安全?
关于ActiveMQ Artemis 2.42.0
ClientSession多线程使用的疑问 核心疑问
ActiveMQ Artemis 2.42.0文档对ClientSession的说明如下:
ClientSession是用于生产和消费消息的单线程父对象。仅单个线程可操作会话及其子生产者、消费者,close()方法可由其他线程调用。为消费者设置MessageHandler后,会话及其子对象将专用于会话范围内的处理程序交付线程。
请问上述说明是否意味着ClientSession完全不能用于多线程环境,哪怕同一时间仅由单个线程独占使用?
示例场景
现有N个线程池和M个ClientSession池,通过BasePooledObjectFactory<ClientSession>管理会话。线程T1从池中借出会话S1,执行创建地址/队列、向ActiveMQ broker发送消息等操作后归还S1,任何失败场景下都会归还S1。即同一时间内Sj仅由Ti使用。该行为是否安全?
回答
这种池化使用ClientSession的行为是安全的,具体原因如下:
- 文档的核心限制是同一时间只能有单个线程操作会话及其子对象,而非禁止会话在不同时间段被不同线程使用。只要保证每个会话在借出期间完全由单个线程独占操作,归还后再交给其他线程使用,就符合文档的单线程使用要求。
- 你的场景中,会话的所有业务操作(创建地址/队列、发送消息等)都由独占线程完成,归还时确保操作已结束,不存在多线程并发操作同一会话的情况,完全契合文档的约束。
- 需要注意的例外情况:如果在使用会话时为消费者设置了
MessageHandler,该会话会绑定到处理程序的交付线程,此时不能再将该会话归还到池子里供其他线程使用,必须解除绑定或销毁该会话,否则会违反使用限制。
内容的提问来源于stack exchange,提问作者t0ry
相关产品推荐
相关产品推荐

