activeMq安装及原理分析

本文详细介绍ActiveMQ的安装配置与使用,涵盖点对点模式和发布/订阅模式的Java消息服务(JMS)示例代码,包括消息生产者、消费者的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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入门教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值