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进行消息取消发布
以上纯属个人见解,如有问题请联系本人!