队列分点对点和订阅。
1.JMS中定义
JMS规范目前支持两种消息模型:点对点(point to point, queue)和发布/订阅(publish/subscribe,topic)。
点对点:
队列:生产者(负责发送消息至队列),消费者(消费生产者发的消息)。
点对点(即Queue):一条消息只能被一个消费者消费。先进先出
(相对消息而言,也就是说消费者对消息是一对一)
(被消费过的消息不能重复使用)
但是一个对列中的生产者可以实现多个消费者共享,比如生产者生产5条消息,可以配置3个消费者进行消费,消费者优先级可以自己设置。
订阅:将消息发布到topic,发布到topic的消息会被所有订阅者消费。
队列的顺序性指的是多个消费者共享消息时的执行顺序。
解决顺序性办法:
1consumer之独有消费者(exclusive consumer)
只用主消费者进行消费的接受,但是消费者将闲置,达不到负载均衡分配(pass)
2.利用Activemq的高级特性:messageGroups
Message Groups特性是一种负载均衡的机制。
Message Groups 可以看成是一种并发的Exclusive Consumer。跟所有的消息都由唯一的consumer处理不同,JMS 消息属性JMSXGroupID 被用来区分message group。Message Groups特性保证所有具有相同JMSXGroupID的消息会被分发到相同的consumer(只要这个consumer保持active)。
在一个消息被分发到consumer之前,broker首先检查消息JMSXGroupID属性。如果存在,那么broker会检查是否有某个consumer拥有这个message group。如果没有,那么broker会选择一个consumer,并将它关联到这个message group。此后,这个consumer会接收这个message group的所有消息,直到:
1.Consumer被关闭
2.Message group被关闭,通过发送一个消息,并设置这个消息的JMSXGroupSeq为-1
配置如下:
bytesMessage.setStringProperty("JMSXGroupID", "constact-20100000002");
bytesMessage.setIntProperty("JMSXGroupSeq", -1);
如上图所示,同一个queue中,拥有相同JMSXGroupID的消息将发往同一个消费者,解决顺序问题,不同分组的消息又能被其他消费者并行消费,解决负载均衡的问题
(例如我们承保系统,送再报提交审核和审核通过,是根据保单号做为JMSXGroupID,同一个保单是被同一个消费者进行消费的)