定時消息:
是指消息發到 Broker 後,不能立刻被Consumer 消費,要到特定的時間點或者等待特定的時間後才能被消費。
如果要支持任意的時間精度,在 Broker 層面,必須要做消息排序,如果再涉及到持久化,那麼消息排序要不可避免的產生巨大性能開銷。 RocketMQ 支持定時消息,但是不支持任意時間精度,支持特定的 level,例如定時1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h。
生產者代碼:
/**
* @author lucifer
* @date 2020/4/9 0:12
* @description 延時隊列 生產者
*/
public class ScheduledMessageProducer {
public static final String NAME_SERVER_ADDR = "192.168.160.131:9876";
public static void main(String[] args) throws MQClientException, UnsupportedEncodingException, RemotingException, InterruptedException, MQBrokerException {
//1.創建生產者對象
DefaultMQProducer defaultMQProducer = new DefaultMQProducer("GROUP_TEST");
//2.設置NameServer的地址
defaultMQProducer.setNamesrvAddr(NAME_SERVER_ADDR);
//3.啓動生產者
defaultMQProducer.start();
for (int i = 0; i < 10; i++) {
String content = "Hello scheduled message " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS").format(new Date());
Message message = new Message("TopicTest", content.getBytes(RemotingHelper.DEFAULT_CHARSET));
//4.設置延時等級,此消息將在10秒後傳遞給消費者
// 可以在broker服務器端自行配置messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
message.setDelayTimeLevel(3);
//5.發送消息
SendResult result = defaultMQProducer.send(message);
System.out.println("發送結果:"+result+",發送時間:"+ LocalTime.now());
}
//6.停止生產者
defaultMQProducer.shutdown();
}
}
生產者啓動,控制檯打印:
發送結果:SendResult [sendStatus=SEND_OK, msgId=24098A1E7A3ECE402C3D4AADC1A10079000018B4AAC2467B74AE0000, offsetMsgId=C0A8A08300002A9F00000000000133A9, messageQueue=MessageQueue [topic=TopicTest, brokerName=localhost.localdomain, queueId=8], queueOffset=80],發送時間:16:28:15.932
發送結果:SendResult [sendStatus=SEND_OK, msgId=24098A1E7A3ECE402C3D4AADC1A10079000018B4AAC2467B74BC0001, offsetMsgId=C0A8A08300002A9F00000000000134D1, messageQueue=MessageQueue [topic=TopicTest, brokerName=localhost.localdomain, queueId=9], queueOffset=81],發送時間:16:28:15.934
發送結果:SendResult [sendStatus=SEND_OK, msgId=24098A1E7A3ECE402C3D4AADC1A10079000018B4AAC2467B74BE0002, offsetMsgId=C0A8A08300002A9F00000000000135F9, messageQueue=MessageQueue [topic=TopicTest, brokerName=localhost.localdomain, queueId=10], queueOffset=82],發送時間:16:28:15.936
發送結果:SendResult [sendStatus=SEND_OK, msgId=24098A1E7A3ECE402C3D4AADC1A10079000018B4AAC2467B74C10003, offsetMsgId=C0A8A08300002A9F0000000000013722, messageQueue=MessageQueue [topic=TopicTest, brokerName=localhost.localdomain, queueId=11], queueOffset=83],發送時間:16:28:15.938
發送結果:SendResult [sendStatus=SEND_OK, msgId=24098A1E7A3ECE402C3D4AADC1A10079000018B4AAC2467B74C30004, offsetMsgId=C0A8A08300002A9F000000000001384B, messageQueue=MessageQueue [topic=TopicTest, brokerName=localhost.localdomain, queueId=12], queueOffset=84],發送時間:16:28:15.940
發送結果:SendResult [sendStatus=SEND_OK, msgId=24098A1E7A3ECE402C3D4AADC1A10079000018B4AAC2467B74C40005, offsetMsgId=C0A8A08300002A9F0000000000013974, messageQueue=MessageQueue [topic=TopicTest, brokerName=localhost.localdomain, queueId=13], queueOffset=85],發送時間:16:28:15.942
發送結果:SendResult [sendStatus=SEND_OK, msgId=24098A1E7A3ECE402C3D4AADC1A10079000018B4AAC2467B74C60006, offsetMsgId=C0A8A08300002A9F0000000000013A9D, messageQueue=MessageQueue [topic=TopicTest, brokerName=localhost.localdomain, queueId=14], queueOffset=86],發送時間:16:28:15.944
發送結果:SendResult [sendStatus=SEND_OK, msgId=24098A1E7A3ECE402C3D4AADC1A10079000018B4AAC2467B74C80007, offsetMsgId=C0A8A08300002A9F0000000000013BC6, messageQueue=MessageQueue [topic=TopicTest, brokerName=localhost.localdomain, queueId=15], queueOffset=87],發送時間:16:28:15.947
發送結果:SendResult [sendStatus=SEND_OK, msgId=24098A1E7A3ECE402C3D4AADC1A10079000018B4AAC2467B74CC0008, offsetMsgId=C0A8A08300002A9F0000000000013CEF, messageQueue=MessageQueue [topic=TopicTest, brokerName=localhost.localdomain, queueId=0], queueOffset=88],發送時間:16:28:15.950
發送結果:SendResult [sendStatus=SEND_OK, msgId=24098A1E7A3ECE402C3D4AADC1A10079000018B4AAC2467B74CE0009, offsetMsgId=C0A8A08300002A9F0000000000013E17, messageQueue=MessageQueue [topic=TopicTest, brokerName=localhost.localdomain, queueId=1], queueOffset=89],發送時間:16:28:15.952
16:28:15.964 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[192.168.160.131:10911] result: true
16:28:15.967 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[192.168.160.131:9876] result: true
消費者代碼:
/**
* @author lucifer
* @date 2020/4/9 0:20
* @description 延時隊列 消費者
*/
public class ScheduledMessageConsumer {
public static final String NAME_SERVER_ADDR = "192.168.160.131:9876";
public static void main(String[] args) throws MQClientException {
//1.創建消費者(push)對象
DefaultMQPushConsumer defaultMQPushConsumer = new DefaultMQPushConsumer("GROUP_TEST");
//2.設置NameServer的地址
defaultMQPushConsumer.setNamesrvAddr(NAME_SERVER_ADDR);
//3.訂閱對應的主題和Tag
defaultMQPushConsumer.subscribe("TopicTest","*");
//4.註冊消息接收到Broker消息後的處理接口
defaultMQPushConsumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
MessageExt messageExt = list.get(0);
try {
System.out.printf("%-25s 接收到新消息 --- %s %n", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS").format(new Date()), new String(messageExt.getBody(), RemotingHelper.DEFAULT_CHARSET));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
//5.啓動消費者(必須在註冊完消息監聽器後啓動,否則會報錯)
defaultMQPushConsumer.start();
System.out.println("已啓動消費者");
}
}
消費者啓動,控制檯打印:10秒後纔打印出信息
2020-04-14 16:28:25.925 接收到新消息 --- Hello scheduled message 2020-04-14 16:28:14.832
2020-04-14 16:28:25.938 接收到新消息 --- Hello scheduled message 2020-04-14 16:28:15.932
2020-04-14 16:28:25.938 接收到新消息 --- Hello scheduled message 2020-04-14 16:28:15.934
2020-04-14 16:28:25.940 接收到新消息 --- Hello scheduled message 2020-04-14 16:28:15.936
2020-04-14 16:28:25.942 接收到新消息 --- Hello scheduled message 2020-04-14 16:28:15.938
2020-04-14 16:28:25.948 接收到新消息 --- Hello scheduled message 2020-04-14 16:28:15.940
2020-04-14 16:28:25.949 接收到新消息 --- Hello scheduled message 2020-04-14 16:28:15.944
2020-04-14 16:28:25.949 接收到新消息 --- Hello scheduled message 2020-04-14 16:28:15.942
2020-04-14 16:28:25.962 接收到新消息 --- Hello scheduled message 2020-04-14 16:28:15.950
2020-04-14 16:28:25.962 接收到新消息 --- Hello scheduled message 2020-04-14 16:28:15.948