RabbitMQ 事务-异步发送消息事务
maven配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>parent</artifactId>
<groupId>com.hry.spring</groupId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>rabbitmq</artifactId>
<dependencies>
<!-- rabbitmq 没有集成到spring boot时的配置
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.1.1</version>
</dependency>
-->
<!-- spring boot: 此版本使用的amqp-client的4.x版本,所有需要注释掉上面的amqp-client配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
</project>
异步发送消息事务-示例
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeoutException;
public class AsynConfirmSend {
public final static String EXCHANGE_NAME = "publisherconfirm-exchange";
public static void execute(String host, String userName, String password,String routingKey, int num) {
// 配置连接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(host);
factory.setUsername(userName);
factory.setPassword(password);
Connection connection = null;
Channel channel = null;
try {
connection = factory.newConnection();// 建立TCP连接
channel = connection.createChannel();// 在TCP连接的基础上创建通道
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);// 声明一个direct交换机
String message = "Transactional!" + System.currentTimeMillis();
channel.addConfirmListener(new ConfirmListener(){ // 添加回调对象,处理返回值
@Override
public void handleAck(long deliveryTag, boolean multiple) throws IOException {
System.out.println("[AsynConfirmSend] handleAck : deliveryTag = " + deliveryTag + " multiple = " + multiple);
}
@Override
public void handleNack(long deliveryTag, boolean multiple) throws IOException {
System.out.println("[AsynConfirmSend] handleNack : deliveryTag = " + deliveryTag + " multiple = " + multiple);
}
});
channel.confirmSelect(); // 开启confirm模式:
while(num-- > 0) { // 发送消息
// 发送一个持久化消息到特定的交换机
channel.basicPublish(EXCHANGE_NAME, routingKey, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes("UTF-8"));
System.out.println(" [AsynConfirmSend] Sent '" + message + "'");
}
Thread.sleep(1 * 1000); // 等待消息的回执
}catch (Exception e){
e.printStackTrace();
}finally {
try {
channel.close();
connection.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// 测试线程池
ExecutorService executorService = Executors.newFixedThreadPool(10);
String rabbitmq_host = "192.168.2.10";// rabbitmq的IP地址
String rabbitmq_user = "root";// rabbitmq的用户名称
String rabbitmq_pwd = "888888";// rabbitmq的用户密码
String routingKey = "publisher-confirm1";
executorService.submit(() -> { // 发送端
AsynConfirmSend.execute(rabbitmq_host, rabbitmq_user, rabbitmq_pwd, routingKey, 2);
});
}
}
==============================
QQ群:143522604
群里有相关资源
欢迎和大家一起学习、交流、提升!
==============================