Fork me on github

ActiveMQ(三)之Java实现简单的activeMQ通讯(topic模式)

Java实现简单的activeMQ通讯(topic)

  • topic模式是什么?

例子:广播的形式,我发送一条广播信息,所有的人就会接收到这条广播。

  1. topic就是我发送一条消息,所有的消费者都会接收到。

  2. 生产者将消息发布到topic中,每个消息可以有多个消费者,属于1:N的关系

  3. 生产者和消费者之间有时间上的相关性。订阅某一个主题的消费者只能消费自它订阅之后发布的消息

  • 为什么topic模式下,必须先启动消费者,后启动生产者

生产者生产时,topic不保存消息它是无状态的不落地,假如无人订阅就去生产,那就是一条废消息,所以,一般先启动消费者再启动生产者。

  • 思考:在topic模式下, 生产者先启动,再发送10条消息,最后在启动消费者。问消费者是否接收到这个10消息?

不能接收到这10个消息因为在主题模式中: 只有提前进行订阅的消费者才能成功消费消息。

需求:生产者生产3条消息,3个消费者都会接收到3条消息。这就需要topic模式

  • 环境准备, 配置maven依赖
<!-- https://mvnrepository.com/artifact/org.apache.activemq/activemq-all -->
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-all</artifactId>
    <version>5.15.11</version>
</dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.xbean/xbean-spring -->
<dependency>
    <groupId>org.apache.xbean</groupId>
    <artifactId>xbean-spring</artifactId>
    <version>4.15</version>
</dependency>
  • 在过一下这张图,记住他的逻辑

1. 生成者生产消息

生成者生产消息基本流程:

  1. 创建工厂对象(连接的谁?)

    // ACTIVEMQ_URL: 连接的谁, activemq的url地址
    ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
    
  2. 通过工厂对象生成连接对象,并建立连接

    Connection connection = activeMQConnectionFactory.createConnection();
    connection.start();
    
  3. 通过连接对象,建立session会话对象

    // 第一个参数为是否开启事务,第二个参数为签收
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    
  4. 通过session会话对象建立目的地(topic模式)

    // TOPIC_NAME 话题名称
    Topic topic = session.createTopic(TOPIC_NAME);
    
  5. 通过session会话对象建立生成者(要与目的地建立联系)

    // topic: 建立联系
    MessageProducer producer = session.createProducer(topic);
    
  6. 发送消息

     for (int i = 0; i < 3; i++) {
         // 创建消息
         TextMessage textMessage = session.createTextMessage("msg" + i + ":hello world");
         // 将消息发送到MQ
         producer.send(textMessage);
     }
    
  7. 释放资源

    producer.close();
    session.close();
    connection.close();
    System.out.println("finish");
    

2. 消费者消费消息(创建3个消费者)

  1. 创建工厂对象(连接的谁?)

    // ACTIVEMQ_URL: 连接的谁, activemq的url地址
    ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
    
  2. 通过工厂对象生成连接对象,并建立连接

    Connection connection = activeMQConnectionFactory.createConnection();
    connection.start();
    
  3. 通过连接对象,建立session会话对象

    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    
  4. 通过session会话对象建立目的地(topic模式)

    Topic topic = session.createTopic(TOPIC_NAME);
    
  5. 通过session会话对象建立消费(要与目的地建立联系)

     MessageConsumer consumer = session.createConsumer(topic);
    
  6. 消费消息

    // 采用的是Lambda表达式,因为接口里只有一个方法
    consumer.setMessageListener(message -> {
        if (message != null && message instanceof TextMessage) {
            TextMessage textMessage = (TextMessage) message;
            try {
                System.out.println("监听器接受到的消息:" + textMessage.getText());
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    });
    
  7. 释放资源

    // 异步非阻塞需要等待
    System.in.read();
    consumer.close();
    session.close();
    connection.close();
    

此时,监控信息情况如下:
消费者:3
消息入队:3
消息出队:9(消费者*消息入队)

3. topic和queue的区别

image-20220123111825697

posted @ 2022-01-23 11:31  不想努力的小龙  阅读(490)  评论(0编辑  收藏  举报