简介

ActiveMQ是Apache出品, 最流行的, 能力强劲的开源消息总线, 是一个完全支持JMS1.1和J2EE1.4规范的JMS Provider实现。

安装

version: '3.1'
services:
    #activemq容器
  activemq:
    #使用的镜像
    image: webcenter/activemq
    restart: always
    #容器的映射端口
    ports:
      - 61613:61613
      - 61616:61616
      - 8161:8161
    #定义挂载点
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./data/data/activemq:/data/activemq
      - ./data/var/log/activemq:/var/log/activemq
    #环境变量
    environment:
      - ACTIVEMQ_ADMIN_LOGIN=admin
      - ACTIVEMQ_ADMIN_PASSWORD=admin
      - ACTIVEMQ_CONFIG_MINMEMORY=512
      - ACTIVEMQ_CONFIG_MAXMEMORY=2048
      - TZ=Asia/Shanghai

API

Connection方法

当一个Connection被创建时, 它的传输默认是关闭的, 必须使用start方法开启。一个Connection可以建立一个或多个的Session。

当一个程序执行完成后, 必须关闭之前创建的Connection, 否则ActiveMQ不能释放资源, 关闭一个Connection同样也关闭了Session, MessageProducer和MessageConsumer

Session方法

一旦从ConnectionFactory中获得一个Connection, 必须从Connection中创建一个或者多个Session. Session是一个发送或者接收消息的线程, 可以使用Session创建MessageProducer, MessageConsumer和Messsage.

MessageProducer

MessageProducer是一个由Session创建的对象, 用来向Destination发送消息

deliveryMode为传送模式, priority为消息优先级, timeToLive为消息过期时间。

ActiveMQ支持两种消息传递模式: PERSISTENT和NON_PERSISTENT两种。如果不指定传送模式, 那么默认是持久性消息。如果容忍消息丢失, 那么使用非持久性消息可以改善性能和减少存储的开销

messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

消息优先级从0-9十个级别, 0-4是普通消息, 5-9是加急消息。如果不指定优先级, 则默认为4.JMS不要求严格按照这十个优先级发送小, 但必须保证加急消息要先于普通消息到达。

默认情况下, 消息永不会过期。如果消息在特定周期内失去意义, 那么可以设置过期时间, 时间单位为毫秒

MessageConsumer

MessageConsumer是一个由Session创建的对象, 用来从Destination接收消息。

其中messageSelector为消息选择器; noLocal标志默认为false, 当设置为true时限制消费者只能接收和自己相同的连接所发布的消息, 此标志只适用于主题, 不适用于队列: name标识订阅主题所对应的订阅名称, 持久订阅时需要设置此参数。

public final String SELECTOR=”JMS_TYPE=’MY_TAG1’”, 该选择器检查了传入消息的JMS_TYPE属性, 并确定了这个属性的值是否等于MY_TAG1。如果相等, 则消息被消费; 如果不相等, 那么消息被忽略

示例

public class Sender {
    public static void main(String[] args) throws JMSException {
        // 第一步: 建立ConnectionFactory工厂对象, 需要填入用户名, 密码, 以及需要连接的地址
        ConnectionFactory connectionFactory=new ActiveMQConnectionFactory(
                ActiveMQConnectionFactory.DEFAULT_USER,
                ActiveMQConnectionFactory.DEFAULT_PASSWORD,
                "tcp://192.168.25.137:61616"
                );
        // 第二步: 通过ConnectionFactory工厂对象创建一个Connection连接, 并调用Connection的start方法开启连接, connection默认是关闭的
        Connection connection=connectionFactory.createConnection();
        connection.start();
        // 第三步: 通过Connection对象创建Session会话(上下文环境对象), 用于接收消息, 参数配置1为是否启用事务, 参数配置2为签收模式, 一般我们设置为自动签收
        Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
        // 第四步: 通过Session创建Destination对象, 指的是一个客户端用来指定生产消息目标和消费消息来源的对象, 在PTP模式中, Destination被称为Queue即队列: 在Pub/Sub模式中, Destination被称为Topic即主题。在程序中可以使用多个Queue和Topic.
        Destination destination=session.createQueue("queue1");
        // 第五步: 通过Session对象创建消息的发送和接收对象(生产者和消费者)MessageProducer/MessageConsumer
        MessageProducer messageProducer=session.createProducer(destination);
        //第六步: 可以使用MessageProdcer的setDeliveryMode方法为其设置持久化特性和非持久化特性(DeliveryMode)
        messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
        //第七步: 最后使用JMS规范的TextMessage形式创建数据, 并用MessageProducer的send方法发送数据
        for(int i=1; i<=5; i++) {
            TextMessage textMessage = session.createTextMessage("我是消息内容, id为: "+i);
            messageProducer.send(textMessage);
        }
        if(connection!=null) {
            connection.close();
        }
    }
}
public class Receiver {
    public static void main(String[] args) throws JMSException {
        // 第一步: 建立ConnectionFactory工厂对象, 需要填入用户名, 密码, 以及需要连接的地址
        ConnectionFactory connectionFactory=new ActiveMQConnectionFactory(
                ActiveMQConnectionFactory.DEFAULT_USER,
                ActiveMQConnectionFactory.DEFAULT_PASSWORD,
                "tcp://192.168.25.137:61616"
        );
        // 第二步: 通过ConnectionFactory工厂对象创建一个Connection连接, 并调用Connection的start方法开启连接, connection默认是关闭的
        Connection connection=connectionFactory.createConnection();
        connection.start();
        // 第三步: 通过Connection对象创建Session会话(上下文环境对象), 用于接收消息, 参数配置1为是否启用事务, 参数配置2为签收模式, 一般我们设置为自动签收
        Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
        // 第四步: 通过Session创建Destination对象, 指的是一个客户端用来指定生产消息目标和消费消息来源的对象, 在PTP模式中, Destination被称为Queue即队列: 在Pub/Sub模式中, Destination被称为Topic即主题。在程序中可以使用多个Queue和Topic.
        Destination destination=session.createQueue("queue1");
        // 第五步: 通过Session对象创建消息的发送和接收对象(生产者和消费者)MessageProducer/MessageConsumer
        MessageConsumer messageConsumer=session.createConsumer(destination);
        while(true){
            TextMessage msg=(TextMessage)messageConsumer.receive();
            if(msg==null) break;
            System.out.println("收到的内容: "+msg.getText());
        }

        if(connection!=null) {
            connection.close();
        }
    }
}