ActiveMQ学习之队列和主题

什么是ActiveMQ

MQ全称为MessageQueue(消息队列),是一个消息的接收和转发的容器,可用于消息推送。ActiveMQ是Apache提供的一个开源的消息系统,完全采用Java来实现,因此,它能很好地支持J2EE提出的JMS(Java Message Service,即Java消息服务)规范。ActiveMQ是对JMS(Java消息服务)的一个具体实现,除了ActiveMQ以外,还有RabbitMQ、Kafka、Jafka等产品。

ActiveMQ的应用场景

activeMQ的应用主要是3个场景,异步、解耦、削峰。

使用

P2P模式

p2p模式是基于队列。

消息生产者
public class JmsProduce {

    public static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
    public static final String QUEUE_NAME = "queue01";

    public static void main(String[] args) throws JMSException {

        //1.创建连接工厂,按照给定Url地址,采用默认的用户名和密码
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();

        //2通过连接工厂,获得连接connection并启动访问
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();

        //3.创建回话session,第一个参数是事务,第二个参数是签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //4.创建目的地(是队列还是主题(topic))
        Queue queue = session.createQueue(QUEUE_NAME);

        //5.创建消息的生产者
        MessageProducer messageProducer = session.createProducer(queue);

        //6.通过使用messageProducer生产3条消息发送到MQ的队列里面
        for (int i = 1; i <= 3; i++) {
            //7.创建消息
            TextMessage textMessage = session.createTextMessage("msg---" + i);
            //8.通过messageProducer发送给mq
            messageProducer.send(textMessage);
        }

        //关闭资源
        messageProducer.close();
        session.close();
        connection.close();

        System.out.println("消息发送到MQ");

    }
}

运行程序以后,在activemq控制台查看可以看到以下信息。在这里插入图片描述

这些信息的意思如下
在这里插入图片描述

消息消费者

两种消费方式:

  1. 同步阻塞方式(receive())
    • 订阅者或接受者调用MessageConsumer的receive()方法来接收消息,receive方法在能够接收到消息之前将一直阻塞
  2. 异步非阻塞方式(监听器onMessage())
    • 订阅者或接收者通过MessageConsumer的setMessageListener注册一个消息监听器,当消息到达之后,系统自动调用监听器的onMessage方法。

消息消费者代码

public class JmsConsumer {

    public static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
    public static final String QUEUE_NAME = "queue01";

    public static void main(String[] args) throws JMSException, IOException {
        //1.创建连接工场,按照给定的Url地址,采用默认的用户名和密码
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
        //2.通过连接工场,获得连接connection并启动访问
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();

        //创建会话session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //创建目的地
        Queue queue = session.createQueue(QUEUE_NAME);
        //创建消费者
        MessageConsumer messageConsumer = session.createConsumer(queue);

/*        while (true) {
            //循环等待接收消息,消费消息
            TextMessage textMessage = (TextMessage) messageConsumer.receive();
            System.out.println(textMessage);
            if (null != textMessage) {
                System.out.println("***消费者接受到消息***:" + textMessage.getText());
            } else {
                System.out.println("****");
                break;
            }
        }

        messageConsumer.close();
        session.close();
        connection.close();*/

        //通过监听的方式来消费消息
        messageConsumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {
                if (null != message && message instanceof TextMessage) {
                    TextMessage textMessage = (TextMessage) message;
                    try {
                        System.out.println("消费者接收到消息" + textMessage.getText());
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        //留出一定时间,让消费者消费消息,不加的话消息没有被消费程序就停止运行了
        System.in.read();
        //关闭资源
        messageConsumer.close();
        session.close();
        connection.close();
    }
}

下面这个图展示的是运行后的结果。这里需要注意的是如果consumer的receive方法的参数为空,这个消费者会一直等待消息,程序不会停止运行,如果带参数的话,就是等待消息一定时间以后停止运行。
在这里插入图片描述

发布订阅模式

与上面的

消息生产者
public class JmsProduceTopic {

    public static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
    public static final String TOPIC_NAME = "topic01";

    public static void main(String[] args) throws JMSException {
        //1.创建连接工厂,按照给定Url地址,采用默认的用户名和密码
        ActiveMQConnectionFactory mqConnectionFactory = new ActiveMQConnectionFactory();

        //2通过连接工厂,获得连接connection并启动访问
        Connection connection = mqConnectionFactory.createConnection();
        connection.start();

        //3.创建回话session,第一个参数是事务,第二个参数是签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //4.创建目的地(是队列还是主题(topic))
        Topic topic = session.createTopic(TOPIC_NAME);

        //5.创建消息的生产者
        MessageProducer messageProducer = session.createProducer(topic);

        //6.通过使用messageProducer生产3条消息发送到MQ的队列里面
        for (int i = 1; i <= 3; i++) {
            //7.创建消息
            TextMessage textMessage = session.createTextMessage("msg---" + i);
            //8.通过messageProducer发送给mq
            messageProducer.send(textMessage);
        }

        //关闭资源
        messageProducer.close();
        session.close();
        connection.close();

        System.out.println("消息发送到MQ");
    }
}
消息消费者
public class JmsConsumerTopic {

    public static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
    public static final String TOPIC_NAME = "topic01";


    public static void main(String[] args) throws JMSException, IOException {
        //1.创建连接工厂,按照给定的Url地址,采用默认的用户名和密码
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
        //2.通过连接工厂,获得连接connection并启动访问
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();

        //创建会话session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //创建目的地
        Topic topic = session.createTopic(TOPIC_NAME);
        //创建消费者
        MessageConsumer messageConsumer = session.createConsumer(topic);

        //通过监听的方式来消费消息
        messageConsumer.setMessageListener(message -> {
            System.out.println("执行了");
            if (null != message && message instanceof TextMessage) {
                TextMessage textMessage = (TextMessage) message;
                try {
                    System.out.println("消费者接收到消息" + textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });

        //留出一定时间,让消费者消费消息,不加的话消息没有被消费程序就停止运行了
        System.in.read();
        //关闭资源
        messageConsumer.close();
        session.close();
        connection.close();
    }
}

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值