RDelayedQueue 实现延时对列功能。写出工具类及测试类
时间: 2024-09-23 16:06:02 浏览: 46
java利用delayedQueue实现本地的延迟队列
`RDelayedQueue`(Redis Delayed Queue)是在Redis中实现的一个高效、持久化的延时任务队列。它支持存储并按指定时间延迟后再处理的消息。下面简单地概述一下如何创建一个基础的工具类和测试类:
**工具类(例如:RedisDelayQueue.java):**
```java
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
public class RedisDelayQueue {
private final StringRedisTemplate redisTemplate;
private final String queueName;
public RedisDelayQueue(RedisTemplate<String, Object> redisTemplate, String queueName) {
this.redisTemplate = (StringRedisTemplate) redisTemplate;
this.queueName = queueName;
}
// 添加延迟任务
public void addTask(String taskId, long delayMs) {
redisTemplate.opsForValue().expireAt(queueName + ":" + taskId, System.currentTimeMillis() + delayMs);
}
// 从队列中取出并删除过期的任务
public boolean pollTask(String taskId) {
Long timestamp = redisTemplate.opsForValue().getExpireAt(queueName + ":" + taskId);
if (timestamp != null && timestamp < System.currentTimeMillis()) {
redisTemplate.delete(queueName + ":" + taskId);
return true; // 返回true表示取出了一个任务
}
return false;
}
// 清空整个队列
public void clearQueue() {
redisTemplate.flushQueue(queueName);
}
}
```
**测试类(例如:RedisDelayQueueTest.java):**
```java
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import static org.mockito.Mockito.*;
public class RedisDelayQueueTest {
@Mock
private RedisTemplate<String, Object> mockRedisTemplate;
@InjectMocks
private RedisDelayQueue redisDelayQueue;
@Test
public void testAddAndPollTask() {
when(mockRedisTemplate.opsForValue()).thenReturn(mockRedisTemplate.opsForValue());
redisDelayQueue.addTask("task1", 1000); // 假设延迟1秒
verify(mockRedisTemplate.opsForValue(), times(1)).expireAt(eq("queueName:task1"), eq(System.currentTimeMillis() + 1000));
// 检查是否能成功取走任务
assertTrue(redisDelayQueue.pollTask("task1"));
// 再次尝试取走任务应该返回false,因为已经处理过了
assertFalse(redisDelayQueue.pollTask("task1"));
}
@Test
public void testClearQueue() {
// 添加一些模拟任务
redisDelayQueue.addTask("task1", 1000);
redisDelayQueue.addTask("task2", 2000);
redisDelayQueue.clearQueue();
// 验证所有任务都被清空了
verify(mockRedisTemplate).flushQueue(eq("queueName"));
}
}
```
请注意,这是一个简化的例子,实际使用时你可能还需要处理异常、连接池管理等细节,并确保你的Spring配置已经正确设置了RedisTemplate。
阅读全文