|
|
@@ -16,6 +16,7 @@ import org.redisson.api.RedissonClient;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
|
|
import org.springframework.context.annotation.Configuration;
|
|
|
+import org.springframework.scheduling.annotation.Async;
|
|
|
|
|
|
import javax.annotation.PostConstruct;
|
|
|
import java.util.*;
|
|
|
@@ -32,34 +33,61 @@ import java.util.concurrent.TimeUnit;
|
|
|
@AutoConfigureAfter({RedissonClient.class})
|
|
|
public class RedissonDelayMessageManager implements DelayMessageManager {
|
|
|
|
|
|
- private final RBlockingQueue<DelayMessage> blockingQueue;
|
|
|
+ private RBlockingQueue<DelayMessage> blockingQueue;
|
|
|
|
|
|
- private final RDelayedQueue<DelayMessage> delayedQueue;
|
|
|
+ private RDelayedQueue<DelayMessage> delayedQueue;
|
|
|
|
|
|
private final List<DelayMessageHandler> handlers;
|
|
|
+
|
|
|
+ private final RedissonClient redissonClient;
|
|
|
|
|
|
private static final String NAME="redisson-delay-message-queue";
|
|
|
+
|
|
|
@Autowired
|
|
|
public RedissonDelayMessageManager(RedissonClient redissonClient,
|
|
|
List<DelayMessageHandler> handlers) {
|
|
|
- this.blockingQueue = redissonClient.getBlockingQueue(NAME);
|
|
|
- this.delayedQueue = redissonClient.getDelayedQueue(blockingQueue);
|
|
|
- this.handlers=handlers;
|
|
|
+ this.redissonClient = redissonClient;
|
|
|
+ this.handlers = handlers;
|
|
|
if(CollectionUtil.isEmpty(handlers)){
|
|
|
log.warn("the size of DelayMessageHandler is zero");
|
|
|
}
|
|
|
- //将头结点取出后触发该方法
|
|
|
- blockingQueue.subscribeOnElements(this::handler);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
@PostConstruct
|
|
|
+ @Async
|
|
|
public void init(){
|
|
|
+ // 延迟初始化Redisson队列,确保在应用启动的最后阶段才初始化
|
|
|
+ initializeRedissonQueues();
|
|
|
+
|
|
|
//初始化时并不会监听延迟队列,故先测试数据进入,开启监听
|
|
|
this.add(new DelayMessage(Value.simple("初始化数据"),"无", DelayMessageProperties.of(TimeUnit.SECONDS,3)));
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 延迟初始化Redisson队列
|
|
|
+ */
|
|
|
+ private void initializeRedissonQueues() {
|
|
|
+ try {
|
|
|
+ // 可选:添加延迟确保其他组件完全初始化
|
|
|
+ Thread.sleep(2000);
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ Thread.currentThread().interrupt();
|
|
|
+ }
|
|
|
+
|
|
|
+ this.blockingQueue = redissonClient.getBlockingQueue(NAME);
|
|
|
+ this.delayedQueue = redissonClient.getDelayedQueue(blockingQueue);
|
|
|
+
|
|
|
+ //将头结点取出后触发该方法
|
|
|
+ blockingQueue.subscribeOnElements(this::handler);
|
|
|
+ }
|
|
|
|
|
|
@Override
|
|
|
public void add(DelayMessage message) {
|
|
|
+ // 确保队列已初始化
|
|
|
+ if (delayedQueue == null) {
|
|
|
+ initializeRedissonQueues();
|
|
|
+ }
|
|
|
+
|
|
|
log.info("redisson-delay-queue ,add message = 【{}】",JSONUtil.toJsonStr(message));
|
|
|
long expire = message.getProperties().getExpire();
|
|
|
if(expire<=0){
|
|
|
@@ -72,11 +100,21 @@ public class RedissonDelayMessageManager implements DelayMessageManager {
|
|
|
|
|
|
@Override
|
|
|
public boolean remove(DelayMessage message) {
|
|
|
+ // 确保队列已初始化
|
|
|
+ if (delayedQueue == null) {
|
|
|
+ initializeRedissonQueues();
|
|
|
+ }
|
|
|
+
|
|
|
return delayedQueue.remove(message);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void destroy() {
|
|
|
+ // 确保队列已初始化
|
|
|
+ if (delayedQueue == null) {
|
|
|
+ initializeRedissonQueues();
|
|
|
+ }
|
|
|
+
|
|
|
delayedQueue.destroy();
|
|
|
}
|
|
|
|
|
|
@@ -105,4 +143,4 @@ public class RedissonDelayMessageManager implements DelayMessageManager {
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
-}
|
|
|
+}
|