RocketMQ测试ConsumeFromWhere

418 阅读1分钟

ConsumeFromWhere

消费者启动的时候从哪里开始消费

  • CONSUME_FROM_LAST_OFFSET:从最新的消息开始消费。
  • CONSUME_FROM_FIRST_OFFSET:从最新的位点开始消费。
  • CONSUME_FROM_TIMESTAMP:从指定的时间戳开始消费,这里的实现思路是从 Broker 服务器寻找消息的存储时间小于或等于指定时间戳中最大的消息偏移量的消息,从这条消息开始消费。

String consumeTimestamp

指定从什么时间戳开始消费,其格式为 yyyyMMddHHmmss,默认值为 30 分钟之前,该参数只在 consumeFromWhere 为 CONSUME_FROM_TIMESTAMP 时生效。

代码示例

 public static void main(String[] args) throws InterruptedException, MQClientException {

    DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(CONSUMER_GROUP);

    // Uncomment the following line while debugging, namesrvAddr should be set to your local address
    consumer.setNamesrvAddr(NAMESRV_ADDR);

    consumer.subscribe(TOPIC, "*");
    consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
    //wrong time format 2017_0422_221800
//        consumer.setConsumeTimestamp("20181109221800");
    consumer.registerMessageListener(new MessageListenerConcurrently() {

        @Override
        public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
            System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        }
    });
    consumer.start();
    System.out.printf("Consumer Started.%n");
}

上述代码配置了ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET从最新的位点消费,也就是最早的消息,那么就是说,消费者启动时会从头开始消费,执行一下发现并没有

ConsumeFromWhere 这个参数的含义是,初次启动从何处开始消费。更准确的表述是,如果查询不到消息消费进度时,从什么地方开始消费

测试

删除consumerOffset.json文件中的位点信息

image.png 然后重启一下broker

image.png

结果确实是从头开始消费了

image.png