ActiveMQ笔记(一)基本用法

一 前言

1.1 为什么要使用 MQ

耦合调用、异步模型、抵御洪峰流量,保护了主业务,削峰.
即:以前有A、B两服务,A直接请求B。现在是,A请求到MQ,B从MQ拿到请求。解耦了,并且,A放完请求就ok了,不用等B相应(异步)。A不会在短时间内收到大量的请求(削峰

二 实际生产案例存在的问题

微服务架构中,一个功能需要多个接口的协调工作才能实现
在这里插入图片描述

2.1 耦合严重

后期扩展困难
在这里插入图片描述

2.2 洪峰流量

秒杀场景
在这里插入图片描述

2.3 同步存在性能问题

木桶原理
在这里插入图片描述

2.4 解决办法

在这里插入图片描述

三 在Linux安装

  1. 在官网下载linux版本
  2. 解压
  3. 普通启动:进入bin目录,执行./activemq start。默认端口:61616

在这里插入图片描述

四 JAVA API编程-queue

在这里插入图片描述

4.1 创建生产者

package com.zyc.activemqdemo.proceduer;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;


public class JmsProduce {
    public static final String URL = "tcp://192.168.196.4:61616";
    public static final String queue_name = "queue01";

    public static void main(String[] args) throws JMSException {
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
        Connection connection = factory.createConnection();
        connection.start();

        //第一个参数是是否创建session,第二个参数表示应答模式
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);

        //创建queue
        Queue queue = session.createQueue(queue_name);
        MessageProducer producer = session.createProducer(queue);

        for (int i = 1; i < 3; i++) {
            TextMessage textMessage = session.createTextMessage("mag..." + i);
            producer.send(textMessage);
        }
		//关闭资源,从下往上关闭
        producer.close();
        session.close();
        connection.close();
        System.out.println("....");
    }
}

4.2 控制台参数说明

在这里插入图片描述

4.3 消费者

同步模式

package com.zyc.activemqdemo.consumer;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;


public class JmsConsumer {
    public static final String URL = "tcp://192.168.196.4:61616";
    public static final String queue_name = "queue01";

    public static void main(String[] args) throws JMSException {
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
        Connection connection = factory.createConnection();
        connection.start();

        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        Queue queue = session.createQueue(queue_name);
        MessageConsumer consumer = session.createConsumer(queue);//创建消费者
        while (true){
            TextMessage receive = (TextMessage) consumer.receive();
            if (null != receive){
                System.out.println("消息:"+receive.getText());
            }
            else {
                System.out.println("结束");
                break;
            }
        }
        consumer.close();
        session.close();
        connection.close();
        System.out.println("完成....");
    }
}

receive方法

receive方法是阻塞的,还有两个类似的方法

    Message receive() throws JMSException;

    Message receive(long var1) throws JMSException;

    Message receiveNoWait() throws JMSException;

Listener方式


		//前面一样
        consumer.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();//这行代码不写,很有可能主线程马上执行完毕。虚拟机关闭!!!看不到监听效果

消费者3种情况

在这里插入图片描述
轮询效果
在这里插入图片描述
在这里插入图片描述

小结

在这里插入图片描述

五 JAVA API编程-Topic

5.1 Topic介绍

在这里插入图片描述

5.2 生产者

package com.zyc.activemqdemo.proceduer;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;


public class JmsProduce_Topic {
    public static final String URL = "tcp://192.168.196.4:61616";
    public static final String topic_name = "topic01";

    public static void main(String[] args) throws JMSException {
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
        Connection connection = factory.createConnection();
        connection.start();

        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        Topic topic = session.createTopic(topic_name);
        MessageProducer producer = session.createProducer(topic);

        for (int i = 1; i < 3; i++) {
            TextMessage textMessage = session.createTextMessage("Topic mag..." + i);
            producer.send(textMessage);
        }
        producer.close();
        session.close();
        connection.close();
        System.out.println("完成....");
    }
}


5.3 消费者

一样,也有两种接收方式

package com.zyc.activemqdemo.consumer;



import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;
import java.io.IOException;


public class JmsConsumer_Topic {
    public static final String URL = "tcp://192.168.196.4:61616";
    public static final String topic_name = "topic01";

    public static void main(String[] args) throws JMSException, IOException, InterruptedException {
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
        Connection connection = factory.createConnection();
        connection.start();

        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        Topic topic = session.createTopic(topic_name);
        MessageConsumer consumer = session.createConsumer(topic);
//        while (true){
//            TextMessage receive = (TextMessage) consumer.receive();
//            if (null != receive){
//                System.out.println("消息:"+receive.getText());
//            }
//            else {
//                System.out.println("结束");
//                break;
//            }
//        }
        consumer.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();
        Thread.sleep(100000);
        consumer.close();
        session.close();
        connection.close();
        System.out.println("qq完成....");
    }
}




5.4 Topic和Queue的对比

  1. Topic是无状态的
  2. Topic可能会被丢弃
    在这里插入图片描述
发布了82 篇原创文章 · 获赞 1 · 访问量 1956

猜你喜欢

转载自blog.csdn.net/m0_38060977/article/details/103546245
今日推荐