activeMq安装及原理分析

1.下载地址:
activeMQ:window中的apache-activemq-5.15.8-bin.zip
2.安装
解压压缩包,
activeMq安装及原理分析
运行bin中的activemq.bat,qizh,根据本地环境决定运行win64还是win32,结果:
activeMq安装及原理分析
访问:http://127.0.0.1:8161/,出现以下界面即为安装成功,账户密码默认都是admin,
activeMq安装及原理分析
activeMq安装及原理分析
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便不再存储。
activeMq安装及原理分析
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条消息:
activeMq安装及原理分析
消费者1:
activeMq安装及原理分析
消费者2:
activeMq安装及原理分析
队列queue的特点:queue实现了负载均衡,producer生产的消息发送到消息队列中可以由多个消费者消费,但每一条消息只能被一个消费者消费且只能消费一次。
4.2 发布/订阅模式
topic实现了发布和订阅,当你发布一个消息,所有订阅这个topic的服务都能得到这个消息。
activeMq安装及原理分析
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,都可以收到此消息,

activeMq安装及原理分析

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

上一篇:《Android游戏编程入门经典》——第14章使用音频系统


下一篇:基于Tablestore的海量保险单查询平台