在java的延迟队列中,无法支持集群的延迟。
Redis可以做到对应的延迟功能,但是自己封装毕竟局限于业务。而且封装也需要耗费一定时间。
今天我们就讲一个现有的延迟队列,不仅支持分布式服务,而且解耦业务代码,而且支持不同延迟时间的造好的轮子吧。 ~ 那就是 RocketMQ 延时队列。
RocketMQ将延时队列的延时延时时间分为18个级别
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 分别对应下面的延迟时间,在使用时,直接传递 level即可。
messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
当然这个时间可以自己修改,如果不维护 则按照默认的
在发送MQ消息的时候只需要设置
Message.setDelayTimeLevel(delayLevel);
MQ发送的代码:
public class DelayMQProducerTest {
public static void main(String[] args) throws MQClientException, InterruptedException {
DefaultMQProducer producer = new DefaultMQProducer("delay_test_group");
producer.setNamesrvAddr("127.0.0.1:9876");
producer.start();
try {
for (int i = 0; i < 3; i++) {
Message msg = new Message("Topic_Delay_Test",// topic
"Tag_Delay",// tag
(new Date() + "Topic_Delay_Test" + i).getBytes()// body
);
msg.setDelayTimeLevel(2); // 设置延迟级别为2 也就是 5s
SendResult sendResult = producer.send(msg);
System.out.println(sendResult);
}
} catch (Exception e) {
e.printStackTrace();
}
producer.shutdown();
}
}
接下来就跟进到代码里看是RocketMQ是如何是做到延迟发送消息的。
本人使用的是rocketMQ 4.2 下载地址
进入Message可以看到两个方法:
// 获取延迟等级
public int getDelayTimeLevel() {
String t = this.getProperty(MessageConst.PROPERTY_DELAY_TIME_LEVEL);
if (t != null) {
return Integer.parseInt(t);
}
return 0;
}
// 设置延迟等级
public void setDelayTimeLevel