activeMq安装及原理分析

简介: 1.下载地址:activeMQ:window中的apache-activemq-5.15.8-bin.zip2.安装解压压缩包,运行bin中的activemq.bat,qizh,根据本地环境决定运行win64还是win32,结果:访问:http://127.

1.下载地址:
activeMQ:window中的apache-activemq-5.15.8-bin.zip
2.安装
解压压缩包,
image
运行bin中的activemq.bat,qizh,根据本地环境决定运行win64还是win32,结果:
image
访问:http://127.0.0.1:8161/,出现以下界面即为安装成功,账户密码默认都是admin,
image
image
Queues:是队列方式消息
Topics:是主题方式消息
Subscribers:消息订阅监控查询
Connections:可以查看链接数,分别可以查看xmpp、ssl、stomp、openwire、ws和网络链接
Network:是网络链接数监控
Send:可以发送消息数据。
3.消息中间件构建信息
Broker
消息服务器,为server提供消息核心服务
Producer
消息生产者,业务的发起方,负责生产消息传输给broker
Consumer
消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理
Topic
主题,发布订阅模式下的消息统一汇集地,不同生产者向topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的广播
Queue
队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收
Message
消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输
4.消息中间件模式
4.1 点对点模式
消息生产者生产消息发送到queue中,消息消费者从queue中取出并且消费消息。Queue支持存在多个消费者,但是每一个消息,只会有一个消费者可以消费,此消息消费后,队里queue便不再存储。
image
Java消息服务(Java Message Service,JMS)应用程序是一个Java平台中关于面向消息中间件的API,用于在两个应用程序之间或分布式系统中发送消息,进行异步通信。
demo示例:
生成者生成消息

public class JMSProducer {


   /* private static final String USERNAME = ActiveMQConnection.DEFAULT_USER; // 默认用户名
    private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD; // 默认密码
    private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL; // 默认连接地址*/
    private static final int SENDNUM = 10;
    private static final String BROKEURL = "tcp://localhost:61616";// 默认连接地址
    private static final String USERNAME = ActiveMQConnection.DEFAULT_USER; // 默认用户名
    private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD; // 默认密码

    public static void main(String [] args){
        // 连接工厂,用来生产Connection
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USERNAME,PASSWORD,BROKEURL);
        Connection connection = null; // 连接
        Session session = null; // 会话,接收或者发送消息的线程
        Destination destination; // 消息的目的地
        MessageProducer messageProducer; // 消息发送者
        String queenName = "FirstQueue.mq.queen";//消息队列名为FirstQueue.mq.queen

        System.out.println("producer"+USERNAME+PASSWORD+BROKEURL);

        try {
            connection = connectionFactory.createConnection(); // 通过连接工厂创建连接
            connection.start();  // 启动连接
            session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); // 获取Session
            destination = session.createQueue(queenName); // 创建消息队列,名为FirstQueue.mq.queen
            messageProducer = session.createProducer(destination); // 创建消息生产者
            // 设置持久化模式
            messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
            sendMessage(session, messageProducer); // 发送消息
            session.commit(); // 因为上面加了事务Boolean.TRUE表示有事务,所以要commit
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(session != null){
                    session.close();
                }
                if(connection != null){
                    connection.close();
                }
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }

    }

    public static void sendMessage(Session session, MessageProducer messageProducer) throws JMSException {
        for(int i = 0; i < JMSProducer.SENDNUM; i++) {
            TextMessage message = session.createTextMessage("ActiveMQ 发送的消息" + i);
            System.out.println("ActiveMQ 发送的消息" + i);
            messageProducer.send(message);
        }
    }

}

消费者消费消息

public class JMSConsumer {
    private static final String USERNAME = ActiveMQConnection.DEFAULT_USER; // 默认用户名
    private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD; // 默认密码
    private static final String BROKEURL = "tcp://localhost:61616"; // 默认连接地址


    public static void main(String[] args) {
        ConnectionFactory connectionFactory; // 连接工厂,用来生产Connection

        Connection connection = null; // 连接
        Session session = null; // 会话,接收或者发送消息的线程
        Destination destination; // 消息的目的地
        MessageConsumer messageConsumer; // 消息消费者
        String queenName = "FirstQueue.mq.queen";//消息队列名为FirstQueue.mq.queen
        // 实例化连接工厂
        connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, ActiveMQConnection.DEFAULT_BROKER_URL);
        System.out.println(USERNAME+PASSWORD+ActiveMQConnection.DEFAULT_BROKER_URL);
        try {
            connection = connectionFactory.createConnection(); // 通过连接工厂获取连接
            connection.start();  // 启动连接
            session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); // 获取Session,不需要加事务了
            destination = session.createQueue(queenName); // 创建消息队列,名为FirstQueue1
            messageConsumer = session.createConsumer(destination); // 创建消息消费者
            //注册消息监听
            messageConsumer.setMessageListener(new Listener());
        } catch (JMSException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
          /*  try {
                if(session != null){
                    session.close();
                }
                if(connection != null){
                    connection.close();
                }
            } catch (JMSException e) {
                e.printStackTrace();
            }*/
        }
    }

}

在写一个消息的消费者2,和以上代码一样,
结果如下:
生产者生成10条消息:
image
消费者1:
image
消费者2:
image
队列queue的特点:queue实现了负载均衡,producer生产的消息发送到消息队列中可以由多个消费者消费,但每一条消息只能被一个消费者消费且只能消费一次。
4.2 发布/订阅模式
topic实现了发布和订阅,当你发布一个消息,所有订阅这个topic的服务都能得到这个消息。
image
demo示例:
topic的消息生产者

public class JMSTopicProducer {
   /* private static final String USERNAME = ActiveMQConnection.DEFAULT_USER; // 默认用户名
    private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD; // 默认密码
    private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL; // 默认连接地址*/
    private static final int SENDNUM = 10;
    private static final String BROKEURL = "tcp://localhost:61616";// 默认连接地址
    private static final String USERNAME = ActiveMQConnection.DEFAULT_USER; // 默认用户名
    private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD; // 默认密码

    public static void main(String [] args){
        // 连接工厂,用来生产Connection
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USERNAME,PASSWORD,BROKEURL);
        Connection connection = null; // 连接
        Session session = null; // 会话,接收或者发送消息的线程
        Destination destination; // 消息的目的地
        MessageProducer messageProducer; // 消息发送者
        String queenName = "FirstTopic.mq";//消息队列名为FirstQueue.mq.queen

        System.out.println("producer"+USERNAME+PASSWORD+BROKEURL);

        try {
            connection = connectionFactory.createConnection(); // 通过连接工厂创建连接
            connection.start();  // 启动连接
            session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); // 获取Session
            destination = session.createTopic(queenName); // 创建topic,名为FirstTopic.mq
            messageProducer = session.createProducer(destination); // 创建消息生产者
            // 设置持久化模式
            messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
            sendMessage(session, messageProducer); // 发送消息
            session.commit(); // 因为上面加了事务Boolean.TRUE表示有事务,所以要commit
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(session != null){
                    session.close();
                }
                if(connection != null){
                    connection.close();
                }
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }

    }

    public static void sendMessage(Session session, MessageProducer messageProducer) throws JMSException {
        for(int i = 0; i < JMSTopicProducer.SENDNUM; i++) {
            TextMessage message = session.createTextMessage("ActiveMQ 发送的消息" + i);
            System.out.println("ActiveMQ 发送的消息" + i);
            messageProducer.send(message);
        }
    }

}

topic需要两个消费者进行订阅,这里 只写一个:

public class JMSTopicConsumer2 {
    private static final String USERNAME = ActiveMQConnection.DEFAULT_USER; // 默认用户名
    private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD; // 默认密码
    private static final String BROKEURL = "tcp://localhost:61616"; // 默认连接地址


    public static void main(String[] args) {
        ConnectionFactory connectionFactory; // 连接工厂,用来生产Connection

        Connection connection = null; // 连接
        Session session = null; // 会话,接收或者发送消息的线程
        Destination destination; // 消息的目的地
        MessageConsumer messageConsumer; // 消息消费者
        String queenName = "FirstTopic.mq";//消息队列名为FirstQueue.mq.queen
        // 实例化连接工厂
        connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKEURL);
        try {
            connection = connectionFactory.createConnection(); // 通过连接工厂获取连接
            connection.start();  // 启动连接
            session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); // 获取Session,不需要加事务了
            destination = session.createTopic(queenName); // 创建消息topic,名为FirstTopic.mq
            messageConsumer = session.createConsumer(destination); // 创建消息消费者
            //注册消息监听
            messageConsumer.setMessageListener(new Listener());
            session.commit();
        } catch (JMSException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
          /*  try {
                if(session != null){
                    session.close();
                }
                if(connection != null){
                    connection.close();
                }
            } catch (JMSException e) {
                e.printStackTrace();
            }*/
        }
    }

}

结果:每一个订阅了topic,都可以收到此消息,

image

参考:
消息中间件(一)MQ详解及四大MQ比较
ActiveMQ入门教程

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
消息中间件 Java Linux
activeMQ入门安装
activeMQ入门安装
197 0
activeMQ入门安装
|
11月前
|
消息中间件 Java 数据安全/隐私保护
SpringBoot整合RabbitMQ及其原理分析
SpringBoot整合RabbitMQ及其原理分析
127 0
|
消息中间件 网络协议 Java
Springboot 整合RabbitMq ,用心看完这一篇就够了
Springboot 整合RabbitMq ,用心看完这一篇就够了
1323 0
Springboot 整合RabbitMq ,用心看完这一篇就够了
|
消息中间件 中间件
ActiveMQ - 基础篇(上)
ActiveMQ - 基础篇(上)
112 0
ActiveMQ - 基础篇(上)
|
消息中间件
ActiveMQ - 基础篇(下)
ActiveMQ - 基础篇(下)
114 0
ActiveMQ - 基础篇(下)
|
消息中间件 Java Apache
消息中间件学习笔记--ActiveMQ(一、安装)
消息中间件学习笔记--ActiveMQ(一、安装)
108 0
消息中间件学习笔记--ActiveMQ(一、安装)
|
消息中间件 存储 网络协议
SpringBoot-RabbitMQ02-原理介绍
本文来介绍下RabbitMQ的工作原理。在具体介绍之前最好对java的观察者模式有所了解,那么对于消息中间件就非常好理解了
SpringBoot-RabbitMQ02-原理介绍
|
消息中间件 Java Spring
消息队列1:RabbitMQ解析并基于Springboot实战
目录 RabbitMQ简介 RabitMQ 概念模型 Exchange 类型 代码实战 RabbitMQ简介 AMQP:Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。
4222 0
|
消息中间件 Java Spring
精通SpringBoot——第八篇:整合RabbitMQ消息队列
springboot 整合消息队列RabbitMQ
5171 0