作者:hang | 来源:互联网 | 2023-09-23 16:50
还记不记得,在创建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发送消息给mqmessageProducer.send(textMessage);}// 上面设置了开启事务,所以需要手动提交session.commit();// 按照资源打开的相反顺序关闭资源messageProducer.close();session.close();connection.close();// 事务需要回滚的场景try {// 执行一系列send()方法,其中可能会有一条报错} catch (Exception e) {session.rollback();} finally {// 关闭资源}}
}