下面是关于rabbitmq事物的测试性代码, 当Integer result = 1/0抛出异常后,catch后执行txRollback,进行事物的回滚, 然后再次发送消息;
但是,发现无论是对应的交换机还是队列都没有任何变化,仿佛没有执行再次发送消息一样?
请高手指教,还有rabbitmq 中的txRollback究竟有什么作用?我是否可以在catch住后不执行txRollback
public void learnSelect() throws IOException
{
//获取信道连接
Channel channel = this.rabbitmq.getChannel();
//交换机
channel.exchangeDeclare("learn@select", BuiltinExchangeType.DIRECT, true, false, null);
//队列
channel.queueDeclare("select", true, false, false, null);
//绑定
channel.queueBind("select", "learn@select", "select");
try {
//开始事物
channel.txSelect();
//发布消息
String message = " learn select message ";
channel.basicPublish("learn@select", "select", false, MessageProperties.TEXT_PLAIN, message.getBytes());
//模拟出现异常
Integer result = 1/0;
//提交事物
channel.txCommit();
} catch (Exception e) {
e.printStackTrace();
channel.txRollback();
//发布消息
String message = " learn select message ";
channel.basicPublish("learn@select", "select", false, MessageProperties.TEXT_PLAIN, message.getBytes());
}
}
}
rabbitmq里面的事务与数据库,spring里的事务不一样,rabbitmq的事务只为了确认消息是否到达rabbitmq,事务提交成功,消息一定到达rabbitmq,事务提交前rabbitmq崩溃,事务才回滚,rabbitmq事务非常影响性能,通常用发送方确认(publish confirm)机制代替