一、概念
Rabbitmq的事务是针对于发送端来说的,有两种事务机制,一种是AMQP事务,另一种是将channel设置成confirm事务模式(同步和异步两种)。
二、AMQP事务
- AMQP提供三个方法进行事务管理,分别是txSelect()用于设置事务、txCommit()用于提交事务、txRollback()用于回滚事务
- 代码实现(基于简单队列做例子)
- 创建MQ连接工具类
public class RabbitmqUntil {
//获取连接
public static Connection getRabbitmqConnection() throws Exception{
//定义连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置服务地址
factory.setHost("127.0.0.1");
//设置端口(这里的端口号指定是AMQP协议所用的端口号)
factory.setPort(5672);
//设置数据库
factory.setVirtualHost("/test");
//设置用户名
factory.setUsername("test");
//设置密码
factory.setPassword("test");
return factory.newConnection();
}
}
- 消息发送者(设置事务)
public class AmqpSender {
//队列名称
final static String QUEUE_NAME = "amqp queue";
public static void sendMessage(String message)throws Exception{
//获取连接
Connection rabbitmqConnection = RabbitmqUntil.getRabbitmqConnection();
//获取管道
Channel channel = rabbitmqConnection.createChannel();
/**
* 队列创建(如果队列存在,则不进行创建)
* 参数1:队列名
* 参数2:是否支持持久化,默认队列在内存中,重启会丢失。设置为true,会保存到erlang自带的数据库中
* 参数3:当连接关闭后是否自动删除队列;是否私有队列,如果私有,其他通道不能访问当前队列
* 参数4:当没有消费者,是否自动删除队列
* 参数5:其他参数(通过BasicProperties进行传输)
*/
channel.queueDeclare(QUEUE_NAME,true,false,false,null);
//设置事务
channel.txSelect();
try{
//发布消息
channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
//休眠5秒
Thread.sleep(5000);
//提交事务
channel.txCommit();
}catch (Exception e){
//事务回滚
channel.txRollback();
}finally {
//关闭资源
channel.close();
rabbitmqConnection.close();
}
}
public static void main(String[] args)throws Exception {
AmqpSender.sendMessage("hello I am amqp transaction");
}
}
注:该事务进行也可以进行批处理
- 消息接收者(跟之前消息接收者没啥区别)
public class AmqpReceiver {
//队列名称
final static String QUEUE_NAME = "amqp queue";
public static void receiveMessage() throws Exception{
//获取连接
Connection rabbitmqConnection =