如何实现延时的消息队列?

比如,A用户的一个队列,需要在10分钟后触发,B用户进来则需要20分钟后触发,现在只有一个MQ,如何实现呢??

阅读 2.9k
2 个回答

a和b进来都十分钟后作处理,检测到是b的时候,再把b以a的形式插入一遍就好了。就是打印一个tag

疑问,A10分钟,B20分钟C30分钟依次类推?如果是那你需要累计时间

  • 下面是一个rabbitMQ 的简单案例
    public void delayMsgTwo(String exchange, String routingKey, Object msg) {
        delayMsgTwoTemplate.convertAndSend(exchange, routingKey, msg, new MessagePostProcessor() {
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
                message.getMessageProperties().setExpiration(60*1000);
                return message;
            }
        });
    }
  • redis 使用设置过期时间来实现
@Service
public class ExpireServiceByRedis implements ExpireService {

    AtomicInteger atomicInteger = new AtomicInteger();
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

 
    @Override
    public void setExpireWorkOrder(String msg, Long sec, TimeUnit timeUnit) {
        int i = atomicInteger.incrementAndGet();
        // 数据类型可以换成其他类型
        stringRedisTemplate.opsForValue().set(RedisKey.EXP+ i, msg, sec, timeUnit);
        stringRedisTemplate.opsForValue().set(RedisKey.EXP_COPY+ i, msg);
    }

}
  • 监听器
@Service
public class RemindListenerService extends KeyExpirationEventMessageListener {
    public static final String REDIS_SPLIT_KEY = ":";
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    public RemindListenerService(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    @Override
    public void onMessage(Message message, byte[] pattern) {
        // 失效 key
        String expiredKey = message.toString();
        String[] split = expiredKey.split(REDIS_SPLIT_KEY);
        String rk = split[0] + REDIS_SPLIT_KEY;
        if (rk.equalsIgnoreCase(RedisKey.EXP)) {
            String value = stringRedisTemplate.opsForValue().get(RedisKey.EXP_COPY + split[1]);
            System.out.println("过期key  " + expiredKey + " value " + value);
            
        }

    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进