RabbitMQ:发布者消息事务TX的使用

1.声明

当前内容主要用于本人学习和复习之用,当前内容为如何使用发布者事务

2.测试使用发布者事务

这里直接使用txSelect()开启事务确认,通过txCommit()进行事务提交,通过txRollback()进行事务回滚

public class TxTest {
	public static void main(String[] args) throws IOException, TimeoutException {
		ConnectionFactory factory = new ConnectionFactory();
		Connection conn = factory.newConnection();
		Channel channel = conn.createChannel();

		try {
			channel.addShutdownListener((x) -> {
				System.out.println("shutdown原因:" + x.getReason());
			});
			SelectOk selectOk = channel.txSelect();// 和confirmSelect一样,表示开启事务确认,但是事务确认中不能使用事务
			System.out.println("selectOk====>" + selectOk);
			
			channel.basicPublish("test", "", false, null, "支付订单===>0001".getBytes());
			//	然后进行其他业务逻辑的处理,比如
			channel.basicPublish("test", "", false, null, "修改库存===>0002".getBytes());
			//	写入数据出现错误
			
			if (3 > 2) {
				throw new IllegalArgumentException("写入数据错误====>");
			}
			
			CommitOk txCommit = channel.txCommit();
			System.out.println("txCommit====>" + txCommit);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("出现异常进行事务回滚");
			RollbackOk txRollback = channel.txRollback();
			System.out.println("txRollback====>" + txRollback);
		} finally {
			RabbitMqUtils.close(channel);
			RabbitMqUtils.close(conn);
		}

	}
}

创建事务消息的消费者

/**
 * @description 用于处理事务消息
 * @author hy
 * @date 2020-05-19
 */
public class TxMsgConsumerTest {

	public static void main(String[] args) throws IOException {
		RabbitMqUtils mqUtils = new RabbitMqUtils();
		 Connection connection = mqUtils.getConnection();
		final Channel chan = connection.createChannel();
		try {
			
			chan.basicConsume("hello", true, "a-consumer-tag", new DefaultConsumer(chan) {

				@Override
				public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
						byte[] body) throws IOException {
					System.out.println("消费者开始处理【事务】消息===>" + new String(body, "utf-8")); 
				}
			});

		} catch (IOException e) {

			e.printStackTrace();
		}

	}

}

此时启动消费者
在这里插入图片描述

在这里插入图片描述
由于出现了异常所以出现了事务回滚,导致队列中并没有任何消息数据

此时将异常注释掉,再次启动消费者和消息发布者

在这里插入图片描述
在这里插入图片描述
实现消费者消费成功

3.分析发布者事务确认和发布者确认

1.发布者事务确认的开启是使用txSelect而,发布者确认使用的是confirmSelect()

2.发布者确认后什么都不用做,只需要写回调即可,而发布者事务确认则需要编写commit和rollback方法进行处理

3.发布者确认不能同时和发布者事务确认一起使用,否者报错

4.发布者确认是由server发送确认信息给消息发布者,而发布者事务确认则可以实现发布者手动取消消息!

4.总结

1.发布者事务使用txSelect开启,使用txCommit提交消息,使用txRollback进行消息取消发布

以上纯属个人见解,如有问题请联系本人!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值