Spring JMS中setConcurrency方法工作机制相关问题咨询
Spring JMS setConcurrency相关问题解答
1. 负载分配规则与第二个消费者触发条件
Spring JMS的setConcurrency方法的消费者调度逻辑,同时依赖Spring自身的线程池调度规则和底层ActiveMQ的预取策略:
- 如果你配置的是范围格式的并发值比如
"1-2",初始会先启动最小数量的消费者(这里是1个) - 新消费者的触发条件:当已启动的消费者的本地预取缓冲区被填满,且Broker端仍然有未分配的积压消息时,Spring才会创建新的消费者,直到达到你设置的最大并发数。
ActiveMQ队列的默认预取值是1000,默认场景下第一个消费者会先从Broker预取1000条消息到本地缓存消费,如果此时队列中还有未被预取的积压消息,才会触发第二个消费者的创建。你可以通过修改ActiveMQ连接工厂的预取参数调整这个阈值,比如把预取值设为10,那么第一个消费者取满10条未消费时,只要队列还有消息就会启动第二个消费者。
2. 队列场景的消息投递规则
JMS队列本身是点对点通信模型,正常消费场景下同一条消息只会被投递给唯一的消费者,Broker会全局保证消息不会被多个消费者重复接收。只有当消费者消费失败触发消息重发策略时,重发的消息才可能被投递给其他在线的消费者。
3. 并发场景下的线程安全要求
需要保证业务代码的线程安全性。
多个并发消费者对应独立的工作线程,会并行执行你写的消息监听逻辑,如果业务代码中使用了共享可变资源(比如类的成员变量、未加锁的公共存储资源),多个线程同时操作就会出现线程安全问题,因此并发消费场景下必须确保消费逻辑的线程安全。
内容的提问来源于stack exchange,提问作者amitabh pandey
相关产品推荐
相关产品推荐

