ActiveMQ学习笔记(二):点对点方式学习

介绍

点对点的消息发送方式主要建立在消息(Message),队列(Queue),发送者(Sender),消费者(Receiver)上,Queue存储消息,Sender发送消息,Receiver接收消息,具体流程是Sender Client通过Queue发送message,Receiver Client从Queue中接收消息。消息的发送客户端和消息接收客户端没有时间上的依赖,可以异步进行

通过jms编码接口之间的关系

  1. ConnectionFactory创建连接Connection
  2. Connection创建会话Session
  3. 通过Session创建其它的(MessageProducer、MessageConsumer、Destination、TextMessage)
  4. 将生产者和消费者指向Destination
  5. 生产者向目标发送TextMessage消息send()
  6. 消费者设置监听器,监听消息
    jms

创建项目

新建maven项目
maven
创建文件目录,先删除之前的src目录
src
创建完成
dir

创建生产者

package org.emample.jms;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * @author: lxk
 * @date: 2021/8/1 10:03
 * @description: 生产者
 * @modified By:
 */
public class producer {
    // ActiveMQ的服务器tcp连接方式
    private static final String url = "tcp://127.0.0.1:61616";
    // 定义队列的名称
    private static final String queueName = "queue-test";

    public static void main(String[] args) throws JMSException {
        // 1.创建connectionFactory
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        // 2.创建connection
        Connection connection = connectionFactory.createConnection();
        // 3.启动连接
        connection.start();
        // 4.创建session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 5.创建destination
        Destination destination = session.createQueue(queueName);
        // 6.创建生产者
        MessageProducer producer = session.createProducer(destination);

        for (int i=0; i<100; i++){
            TextMessage textMessage = session.createTextMessage("发送文本" + i);
            producer.send(textMessage);
            if ((i+1)%10 == 0) {
                System.out.println("已发送" + (i+1)/10 + "组");
            }
        }
        // 7.关闭连接
        connection.close();
    }
}

创建消费者

package org.emample.jms;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * @author: lxk
 * @date: 2021/8/1 10:05
 * @description: 消费者
 * @modified By:
 */
public class consumer {

    // ActiveMQ的服务器tcp连接方式
    private static final String url = "tcp://127.0.0.1:61616";
    // 定义队列的名称
    private static final String queueName = "queue-test";

    public static void main(String[] args) throws JMSException {
        // 1.创建connectionFactory
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        // 2.创建connection
        Connection connection = connectionFactory.createConnection();
        // 3.启动连接
        connection.start();
        // 4.创建session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 5.创建destination
        Destination destination = session.createQueue(queueName);
        // 6.创建消费者
        MessageConsumer consumer = session.createConsumer(destination);
        // 7.创建监听器
        consumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {

                TextMessage textMessage = (TextMessage) message;
                try {
                    System.out.println("收到消息" + textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });

        // 8.关闭连接(监听器是异步的还没有监听到消息的时候,就关闭连接了)
        // connection.close();
    }
}

启动

注: 启动时会有一个slf4j的报错信息
error
在pom文件中添加下图内容就可以解决,具体原因参考大佬的文章:https://blog.csdn.net/weixin_39548940/article/details/100015174

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-nop</artifactId>
      <version>1.7.2</version>
    </dependency>

生产者发送信息
producer
然后启动消费者
consumer

测试两个消费者

启动方式:

  1. 选择消费者
  2. 点击 Edit Configurations...
    点击
    3.勾选 Allow parallel run 按钮
    勾选

测试

先启动两个消费者
consumer
然后启动生产者
producer
观察消费者消息接收情况
consumer1
consumer2
可以看到两个消费者收到的消息并不重复

posted @ 2021-08-01 10:16  蒟-蒻  阅读(115)  评论(0)    收藏  举报