maven配置:
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.16.6</version>
</dependency>
springboot配置文件:
spring:
# redis 配置
redis:
# 地址
host: localhost
# 端口,默认为6379
port: 6379
# 数据库索引
database: 0
# 密码
password:
延迟队列service:
import com.ruoyi.unionpay.service.DelayQueueListenerService;
import org.redisson.api.RBlockingQueue;
import org.redisson.api.RDelayedQueue;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 延迟队列、重试队列
*/
@Service
public class DelayQueueListenerServiceImpl implements DelayQueueListenerService, CommandLineRunner {
private static final Logger log = LoggerFactory.getLogger(DelayQueueListenerServiceImpl.class);
//线程池
@Resource
private ThreadPoolTaskExecutor taskExecutor;
//延迟参数
@Resource
private DelayQueueProperties delayQueueProperties;
@Resource
private RedissonClient redissonClient;
@Override
public void run(String... args) throws Exception {
//启动监控管控状态线程
taskExecutor.execute(this::RetryThread);
}
/**
* 延迟重试队列
*/
private void RetryThread() {
RBlockingQueue<String> blockingFairQueue = redissonClient.getBlockingQueue("test");
while (true) {
//解决项目重新启动并不会消费之前队列里的消息
RDelayedQueue<String> delayedQueue = redissonClient.getDelayedQueue(blockingFairQueue);
try {
String message= blockingFairQueue.take();
log.debug("触发延迟队列:{}", message);
String result = "ERROR";
//返回状态为错误,进入重试延迟队列
if (result.equals("ERROR")) {
log.debug("失败{},继续进入延迟队列", result.toString());
delayedQueue.offer(message, delayQueueProperties.getDelay(), delayQueueProperties.getTimeUnit());
}else {
log.debug("其他状态{},不进入延迟队列", result.toString());
}
delayedQueue.destroy();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 创建延迟重试队列
*
* @param message
* @return
*/
@Override
public boolean addDelayQueue(String message) {
log.debug("添加延迟队列:{}",message);
RBlockingQueue<String> blockingQueue = redissonClient.getBlockingQueue("test");
RDelayedQueue<String> delayedQueue = redissonClient.getDelayedQueue(blockingQueue);
delayedQueue.offer(message, delayQueueProperties.getDelay(), delayQueueProperties.getTimeUnit());
delayedQueue.destroy();
return true;
}
}