还记不记得,在创建session的时候,我们传了两个参数,第一个是事务,第二个是签收,在这篇博客中,我们来说说事务。

connection.createSession();方法的第一个参数就是事务,它的值可以是true或false,代表session的提交是事务提交还是非事务提交。

当事务的值是false时,只要执行了messageProducer.send()方法,消息就到了队列中,也就是自动提交了。

当事务的值是true时,在执行完messageProducer.send()方法后,在session关闭之前需要多加一个session.commit()方法提交事务。

事务的提交,用于实际复杂的业务场景,可能有多个消息需要入队列,假设有一条入队列报错了,我希望这一批次的都要回滚,这就要提到session.rollback();方法了,可以将session.rollback();方法放在catch语句块中来执行。

package com.wsy.activemq.queue;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class JmsProducer_Transaction {
public static final String ACTIVEMQ_URL = "tcp://192.168.0.123:61616";
public static final String QUEUE_NAME = "queue01";

public static void main(String[] args) throws JMSException {
// 创建连接工厂,按照给定的url地址采用默认的用户名和密码
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
// 通过连接工厂,获取Connection并启动
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
// 创建Session
// 有两个参数,第一个是事务,第二个是签收,后面详细介绍
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
// 创建目的地(目的地有两个子接口,分别是Queue和Topic)
Queue queue = session.createQueue(QUEUE_NAME);
// 创建消息生产者,生产的消息放到queue中
MessageProducer messageProducer = session.createProducer(queue);
// 使用messageProducer生产消息发送到队列中
for (int i = 0; i < 3; i++) {
// 创建一条消息,可以理解成字符串
TextMessage textMessage = session.createTextMessage("message-" + i);
// 通过messageProducer发送消息给mq
messageProducer.send(textMessage);
}
// 上面设置了开启事务,所以需要手动提交
session.commit();
// 按照资源打开的相反顺序关闭资源
messageProducer.close();
session.close();
connection.close();
// 事务需要回滚的场景
try {
// 执行一系列send()方法,其中可能会有一条报错
} catch (Exception e) {
session.rollback();
} finally {
// 关闭资源
}
}
}