【RocketMQ】 (三)定時消息

定時消息:

        是指消息發到 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 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章