ActiveMQ-通过案例理解Queue与Topic

本文在基于下文的基础上做阐述:
ActiveMQ-通过javax.jms调用

ActiveMQ有两种消息模式:Queue与Topic
Queue:即点对点模式、队列模式
Topic:即订阅模式

环境

操作系统:Win10
IDE:Eclipse
JDK:1.8
ActiveMQ服务IP及端口:192.168.142.154:61616
ActiveMQ控制中心URL:http://192.168.142.154:8161/
jmsDemo:包含消息生产者和消息消费者的一个java工程
ActiveMQ-通过案例理解Queue与Topic

队列模式(Queue)

消息生产者不需要知道接收方的状态
  • 消息生产者产生消息的时候,消息消费者处于接收状态

    先启动QueueConsumer
    ActiveMQ-通过案例理解Queue与Topic

    再启动QueueProducer
    ActiveMQ-通过案例理解Queue与Topic
    此时,这种情况下消息已被成功接收

  • 消息生产者产生消息的时候,消息消费者处于关闭状态 ,之后才处于接收状态
    先启动QueueProducer
    ActiveMQ-通过案例理解Queue与Topic

    Number Of Pending Message就是待处理的消息,可以看出此时生产者产生的一个消息被存放在了ActiveMQ服务器上。消费方的数量还是0。

    再启动QueueConsumer
    ActiveMQ-通过案例理解Queue与Topic
    可看出,此时已经有了一个消费者,待处理的消息变为了0,已经处理的消息变成了1。即之前那个待处理的消息已经被消费方接收到了。

消息可以有多个接收方,同一个消息只能被接收一次
  1. 启动3个消息消费者
    启动3次QueueConsumer
    ActiveMQ-通过案例理解Queue与Topic

  2. 启动2个消息生产者(即产生两个消息)
    启动2次QueueConsumer
    ActiveMQ-通过案例理解Queue与Topic
    两个消息均被成功接收

  3. 通过查看消息消费者的日志,能发现消息被不同的(随机的)消费者接收到了,并且,只有两个接收到消息的日志。即一个消息只能被接收到一次

订阅模式(Topic)

消息只有在接收方正在接收时,才能被成功接收
  • 消息生产者产生消息的时候,消息消费者处于接收状态
  1. 先启动TopicConsumer
    ActiveMQ-通过案例理解Queue与Topic

  2. 再启动TopicProducer
    ActiveMQ-通过案例理解Queue与Topic
    消息已被成功接收

  • 消息生产者产生消息的时候,消息消费者处于关闭状态 ,之后才处于接收状态
  1. 先启动TopicProducer
    ActiveMQ-通过案例理解Queue与Topic
    即有一个消息处于消息队列中,但还没被接收

  2. 再启动TopicConsumer
    ActiveMQ-通过案例理解Queue与Topic
    新增了一个消费方,但可以看到,之前的那个消息的处理状态并没有改变,还是没有被接收。

  3. 再次启动TopicProducer(即再发布一个消息)
    ActiveMQ-通过案例理解Queue与Topic
    可以看到,消息队列里有2个消息,但只有一个消息被成功接收。因为发布第二个消费的时候,消费方已经是接收状态了,所以只有第二个消息被成功接收。

消息可以有多个接收方,同一个消息会被每个消费者接收
  1. 启动3个消息消费者
    启动3次TopicConsumer
    ActiveMQ-通过案例理解Queue与Topic

  2. 启动2个消息生产者(即产生两个消息)
    启动2次TopicProducer
    ActiveMQ-通过案例理解Queue与Topic
    可看到,进入队列的有2个消息,接收到了6个消息,即3个消费方都接收到了2个消息。通过查看消息消费者的日志,能发现确实每个消费者都接收到了2个消息