简介
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();
}
}
}