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版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
7月前
|
NoSQL Java Redis
SpringBoot原理分析 | Redis集成
SpringBoot原理分析 | Redis集成
63 0
|
消息中间件 Java Linux
activeMQ入门安装
activeMQ入门安装
261 0
activeMQ入门安装
|
6月前
|
消息中间件 Java Kafka
SpringBoot实用开发篇第六章(整合第三方技术,ActiveMQ,RabbitMQ,RocketMQ,Kafka)
SpringBoot实用开发篇第六章(整合第三方技术,ActiveMQ,RabbitMQ,RocketMQ,Kafka)
|
消息中间件 NoSQL 中间件
SpringBoot+Redis实现系统的发布订阅功能
SpringBoot+Redis实现系统的发布订阅功能
1028 0
java初中级面试题(SSM+Mysql+微服务(SpringCloud+Dubbo)+消息队列(RocketMQ)+缓存(Redis+MongoDB)+设计模式+搜索引擎(ES)+JVM
java初中级面试题(SSM+Mysql+微服务(SpringCloud+Dubbo)+消息队列(RocketMQ)+缓存(Redis+MongoDB)+设计模式+搜索引擎(ES)+JVM
520 0
|
消息中间件 负载均衡 安全
RabbitMQ设计原理解析
RabbitMQ现在用的也比较多,但是没有过去那么多啦。现在很多的流行或者常用技术或者思路都是从过去的思路中演变而来的。了解一些过去的技术,对有些人来说可能会产生众里寻他千百度的顿悟,加深对技术的理解,更好的应用于工作中去。
141 0
|
消息中间件 Java 数据安全/隐私保护
SpringBoot整合RabbitMQ及其原理分析
SpringBoot整合RabbitMQ及其原理分析
172 0
|
消息中间件 Java Apache
消息中间件学习笔记--ActiveMQ(一、安装)
消息中间件学习笔记--ActiveMQ(一、安装)
135 3
消息中间件学习笔记--ActiveMQ(一、安装)
|
消息中间件 中间件
ActiveMQ - 基础篇(上)
ActiveMQ - 基础篇(上)
140 0
ActiveMQ - 基础篇(上)
|
消息中间件
ActiveMQ - 基础篇(下)
ActiveMQ - 基础篇(下)
137 0
ActiveMQ - 基础篇(下)
下一篇
无影云桌面