ActiveMQ安装与使用

ActiveMQ


  ActiveMQ是一款开源的JMS(Java Message Service)的具体实现。ActiveMQ是一个易于使用的消息中间件(Message Orient Middleware, MOM)

Apache ActiveMQ ™ is the most popular and powerful open source messaging and Integration Patterns server.
Apache ActiveMQ is fast, supports many Cross Language Clients and Protocols, comes with easy to use Enterprise Integration Patterns and many advanced features while fully supporting JMS 1.1 and J2EE 1.4. Apache ActiveMQ is released under the Apache 2.0 License

  ActiveMQ是一款最流行的,能力很强的开源消息和集成模式服务器。ActiveMQ快速,支持很多跨语言客户端和协议,很容易嵌入到企业应用环境,并且拥有很多高级功能。

1. 下载

  官方网站:http://activemq.apache.org/

2. 启动服务

  解压后,运行以下文件启动服务。

/d/DevTool/apache-activemq-5.15.3/bin/win64/activemq.bat

3. 测试服务是否启动成功

  ActiveMQ默认使用TCP连接,端口是61616,查看该端口的信息以测试ActiveMQ是否启动成功。

  netstat -an | find "61616"
  # 输出
  TCP    0.0.0.0:61616          0.0.0.0:0              LISTENING
  TCP    [::]:61616             [::]:0                 LISTENING

4. 监控

  ActiveMQ默认启动时,启动了内置的jetty服务器,提供一个用于监控ActiveMQ的Admin应用。应用地址:http://localhost:8161/admin/,默认用户名和密码都是admin

5. 使用

5.1 消息生产者
package net.mrliuli;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * Created by li.liu on 2018/3/23.
 */
public class JMSProducer {

    private static final int SENDNUM = 10;

    public static void main(String[] args){

        // 连接工厂
        ConnectionFactory connectionFactory;

        // 连接
        Connection connection = null;

        // 会话 接受或者发送消息的线程
        Session session;

        // 消息的目的地
        /**
         * 可以是一个 Queue,也可以是一个 Topic,本例是一个 ActiveMQQueue
         */
        Destination destination;

        // 消息生产者
        MessageProducer messageProducer;

        // 实例化连接工厂
        /**
         * ConnectionFactory是一个受管对象,用于创建连接Connection。
         * ActiveMQConnectionFactory也实现了QueueConnectionFactory和TopicConnectionFactory。
         * 因此ActiveMQConnectionFactory可以创建QueueConnection和TopicConnection。
         */
        connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, ActiveMQConnection.DEFAULT_BROKER_URL);

        try{

            // 通过连接工厂获取连接
            /**
             * 返回一个 ActiveMQConnection,会抛出 JMSException 异常
             */
            connection = connectionFactory.createConnection();

            // 启动连接
            /**
             * 启动(或重启)该连接的消息传递。如果连接已经启动,再次调用start,将会忽略调用。
             * 如果由于某些内部错误使得启动消息传递失败,将会抛出 JMSException 异常。
             */
            connection.start();

            // 创建session
            /**
             * 创建一个 ActiveMQSession 对象。
             * 第一个参数 transacted :指示会话是否是事务性的。如是,则忽略第二个参数。
             * 第二个参数 acknowledgedMode: 指示消费者或客户端是否告之它已接收到消息。如果会话是事务性的,则该参数会被忽略。
             */
            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);

            // 创建一个名称为HelloWorld的消息队列,队列名用来标识不同身份队列。
            /**
             * 如果队列名称以“ID:”开头,则返回一个 ActiveMQTempQueue 队列对象,否则返回一个 ActiveMQQueue 队列对象。
             * 该方法用于客户端需要动态控制队列身份的极少情况。它允许创建指定名称的队列。依赖于这一能力的客户端不够便携。
             * 注意该方法不用于物理队列的创建。物理队列的创建是管理任务,不是JMS API指示的。
             * 一个参数 queueName :要创建队列的名称。
             */
            destination = session.createQueue("HelloWorld");

            // 创建消息生产者
            /**
             * 创建一个指定目的地的 ActiveMQMessageProducer,用于发送消息到指定的目的地(ActiveMQQueue)。
             * 客户端通过消息生产者 ActiveMQMessageProducer 对象来发送消息到目的地。
             *
             * 一个参数 destination:由于队列 Queue 和 主题 Topic 都是目的地 Destination 的实现,
             * 所以它们都可以作为该方法的参数用来创建一个消息生产者对象。
             */
            messageProducer = session.createProducer(destination);

            // 发送消息
            for(int i = 0; i < JMSProducer.SENDNUM; i++){
                // 创建一条文本消息
                /**
                 * 创建一个 ActiveMQTextMessage 对象。用于发送一条包含字符串的消息。
                 */
                TextMessage message = session.createTextMessage("ActiveMQ 发送消息" + i);
                System.out.println("发送消息:Activemq 发送消息" + i);

                // 通过消息生产者发出消息
                /**
                 * 发送消息到目的地,标明传递模式,优先级和存活时间。
                 * 通常,消息生产者在创建的时候会分配一个目的地,
                 * 然而,JMS API 也支持没有目的地的消息生产者,
                 * 这意味着,每当消息生产者需要发送消息时,都要提供一个目的地。
                 *
                 * 参数 destination:发送消息要去的目的地
                 * 参数 message:要发送的消息
                 * 参数 deliveryMode:使用的传递模式
                 * 参数 priority:消息优先级
                 * 参数 timeToLive:消息的存活时间(毫秒)
                 */
                messageProducer.send(message);
            }

            // 提交会话,否则消息不会发送到 destination
            /**
             * 提交该事务中所有完成的消息,并释放当前持有的一些锁。
             *  如果提交会话失败,抛出 JMSException异常
             *  如果提交过程中如果发生事务回滚,抛出 TransactionRolledBackException 异常
             *  如果该方法没有被事务性会话调用,抛出 javax.jms.IllegalStateException 异常
             */
            session.commit();

        }catch (JMSException e){
            e.printStackTrace();
        }finally {            
            if(connection != null){
                try{
                    /**
                     * 关闭连接。
                     * JMS提供者通常会在JVM之外分配资源,所以客户端应在不需要提供者时关闭资源。
                     * 依赖GC最终回收这些资源不够及时。
                     * 不需要关闭一个关着的连接的会话,消息生产者和消息消费者。
                     * 关闭连接会使所有的临时队列删除。
                     *
                     * 关闭连接会使正在处理的会话事务回滚。
                     *
                     */
                    connection.close();
                }catch (JMSException e){
                    e.printStackTrace();
                }
            }
        }

    }

}
5.2 消息消费者
package net.mrliuli;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * Created by li.liu on 2018/3/23.
 */
public class JMSConsumer {

    public static void main(String[] args) {

        // 连接工厂
        ConnectionFactory connectionFactory;

        // 连接
        Connection connection = null;

        // 会话 接受或者发送消息的线程
        Session session;

        // 消息的目的地
        Destination destination;

        // 消息的消费者
        MessageConsumer messageConsumer;

        // 实例化连接工厂
        connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, ActiveMQConnection.DEFAULT_BROKER_URL);

        try {

            // 通过连接工厂获取连接
            connection = connectionFactory.createConnection();

            // 启动连接
            connection.start();

            // 创建session
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            // 创建一个连接HelloWorld的消息队列
            destination = session.createQueue("HelloWorld");

            // 创建消息消费者
            /**
             * 创建一个指定目的地的 ActiveMQMessageConsumer,用于接收目的地发布的消息。
             * 如果目的地是一个 Topic,该方法可以指定它的连接是否应当传递它发布的消息。
             *
             * 参数 destination:要访问的目的地(Queue 或 Topic)
             * 参数 messageSelector:只有匹配消息选择器表达式的消息才被传递。null 或空字符串表示消息费者没有消息选择器。
             * 参数 noLocal:如果是真,且目的地是 Topic,则禁止消息传递。如果目的地是 Queue,NoLocal 的行为不指定。
             * 参数 messageListener:用于异步消费消息的监听器
             */
            messageConsumer = session.createConsumer(destination);

            while (true) {
                /**
                 * 接收在指定的超时间隔内到达的下一个消息 ActiveMQMessage。
                 * 该方法调用时会阻塞,直到接收到消息、超时或该消息消费者关闭。
                 * 参数 long timeout:超时时间(毫秒)。为 0 表示永不超时。
                 * 返回:为消息消费者生成的一个消息,如果超时或者该消息消费者同时关闭,则返回 null。
                 */
                TextMessage textMessage = (TextMessage) messageConsumer.receive(5000);
                if(textMessage != null){
                    System.out.println("收到的消息:" + textMessage.getText());
                }else {
                    System.out.println("break");
                    break;
                }
            }

        } catch (JMSException e) {
            e.printStackTrace();
        } finally {
            try{
                if(connection != null){
                    connection.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }

        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值