1.引入依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.23.3</version>
</dependency>
2、注入redissonClient
@Autowired
private RedissonClient redissonClient;
3、发送者代码(假设:我需要检查订单15分钟内是否付款,如果没有付款就取消订单)
/**
* 发送延迟消息
* 该方法通过使用Redisson客户端创建一个阻塞队列,并将该队列添加到延迟队列中,然后将订单ID作为消息发送到延迟队列
* 主要用于处理需要在特定时间后进行处理的任务,例如订单超时取消
*
* @param orderId 订单ID,作为消息内容发送到延迟队列
*/
private void sendDelayMessage(Long orderId) {
try {
//1.创建队列
RBlockingQueue<String> queueCancel = redissonClient.getBlockingQueue("queue_cancel");
//2.把队列放到延迟队列里面去
RDelayedQueue<String> delayedQueue = redissonClient.getDelayedQueue(queueCancel);
//3.发信息到延迟队列里面
// 将订单ID转换为字符串,设置延迟时间为15分钟
delayedQueue.offer(orderId.toString(),15,TimeUnit.MINUTES);
}catch (Exception e) {
// 异常处理:打印异常堆栈跟踪信息
e.printStackTrace();
}
}
4、接收者代码
// 使用@Component注解标记该类为Spring管理的组件
@Component
public class RedisDelayHandle {
// 自动装配RedissonClient,用于操作Redis
@Autowired
private RedissonClient redissonClient;
// 自动装配OrderInfoService,用于处理订单相关业务
@Autowired
private OrderInfoService orderInfoService;
// 在组件实例化后执行该方法
@PostConstruct
public void listener() {
// 启动一个新的线程来监听Redis中的延迟队列
new Thread(() -> {
while (true) {
// 1. 获取到延迟队列里面的阻塞队列
RBlockingQueue<String> queueCancel = redissonClient.getBlockingQueue("queue_cancel");
// 2. 从阻塞队列获取消息
try {
String orderId = queueCancel.take();
// 取消订单
if (StringUtils.hasText(orderId)) {
orderInfoService.orderCancel(Long.parseLong(orderId));
}
} catch (Exception e) {
// 打印异常信息,这里可以添加更多的异常处理逻辑
e.printStackTrace();
}
}
}).start();
}
}
完成。
标签:orderId,SpringBoot,队列,private,redissonClient,订单,redission,延迟 From: https://blog.csdn.net/2301_81717523/article/details/142885205