本文已参与「新人创作礼」活动,一起开启掘金创作之路
拉模式 代码上使用 DefaultMQPullConsumer 使用方式类似,但是更加复杂,除了像推模式一样需要设置各种参数之外,还需要处理额外三件事情: 1)获取 MessageQueues 并遍历(一个 Topic 包括多个 MessageQueue),如果是特殊情况,也可以选择指定的 MessageQueue 来读取消息 2)维护 Offsetstore,从一个 MessageQueue 里拉取消息时,要传入 Offset 参数,随着不断的读取消息,Offset 会不断增长。这个时候就需要用户把 Offset 存储起来,根据实际的情况存入内存、写入磁盘或者数据库中 3)根据不同的消息状态做不同的处理
1.创建消费者PullConsumer
package org.example.normal;
import org.apache.rocketmq.client.consumer.DefaultMQPullConsumer;
import org.apache.rocketmq.client.consumer.PullResult;
import org.apache.rocketmq.common.message.MessageQueue;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 消费者-拉模式
**/
public class PullConsumer {
private static final Map<MessageQueue, Long> OFFSET_TABLE = new HashMap<MessageQueue, Long>();
public static void main(String[] args) throws Exception {
DefaultMQPullConsumer consumer = new DefaultMQPullConsumer("pullconsumer");
consumer.setNamesrvAddr("192.168.42.112:9876");
consumer.start();
//1.获取MessageQueues并遍历(一个Topic包含多个MessageQueue)
Set<MessageQueue> mqs = consumer.fetchSubscribeMessageQueues("TopicA");
for (MessageQueue mq : mqs) {
System.out.println("queueID:" + mq.getQueueId());
//获取偏移量
long Offset = consumer.fetchConsumeOffset(mq,true);
SINGLE_MQ:
while (true) {
PullResult pullResult = consumer.pullBlockIfNotFound(mq, null, getOffset(mq), 32);
System.out.println(pullResult.toString());
//2.维护OffsetStore(存入一个Map)
putOffset(mq, pullResult.getNextBeginOffset());
//3.根据不同的状态做不同的处理
switch (pullResult.getPullStatus()) {
case FOUND:
for (int i = 0; i < pullResult.getMsgFoundList().size(); i++) {
System.out.println( new String(pullResult.getMsgFoundList().get(i).getBody()));
}
break;
case NO_MATCHED_MSG://没有匹配的消息
break;
case NO_NEW_MSG://没有新消息
break SINGLE_MQ;
case OFFSET_ILLEGAL://非法偏移量
break;
default:
break;
}
}
}
consumer.shutdown();
}
private static long getOffset(MessageQueue messageQueue) {
Long offset = OFFSET_TABLE.get(messageQueue);
if (offset!=null)
return offset;
return 0;
}
private static void putOffset(MessageQueue messageQueue, Long offset) {
OFFSET_TABLE.put(messageQueue, offset);
}
}
2.启动消费者,查看打印
queueID:1
PullResult [pullStatus=FOUND, nextBeginOffset=32, minOffset=0, maxOffset=36, msgFoundList=32]
Hello RocketMQ1
Hello RocketMQ5
Hello RocketMQ9
Hello RocketMQ0
Hello RocketMQ4
Hello RocketMQ8
Hello RocketMQ5
Hello RocketMQ1
Hello RocketMQ4
Hello RocketMQ6
Hello RocketMQ0
Hello RocketMQ4
Hello RocketMQ8
Hello RocketMQ1
Hello RocketMQ5
Hello RocketMQ9
Hello RocketMQ3
Hello RocketMQ7
Hello RocketMQ2
Hello RocketMQ6
Hello RocketMQ1
Hello RocketMQ5
Hello RocketMQ9
Hello RocketMQ2
Hello RocketMQ6
Hello RocketMQ2
Hello RocketMQ6
Hello RocketMQ1
Hello RocketMQ5
Hello RocketMQ9
Hello RocketMQ2
Hello RocketMQ6
PullResult [pullStatus=FOUND, nextBeginOffset=36, minOffset=0, maxOffset=36, msgFoundList=4]
Hello RocketMQ2
Hello RocketMQ6
Hello RocketMQ3
Hello RocketMQ7
PullResult [pullStatus=NO_NEW_MSG, nextBeginOffset=36, minOffset=0, maxOffset=36, msgFoundList=0]
queueID:0
PullResult [pullStatus=FOUND, nextBeginOffset=32, minOffset=0, maxOffset=36, msgFoundList=32]
Hello RocketMQ0
Hello RocketMQ4
Hello RocketMQ8
Hello RocketMQ3
Hello RocketMQ7
Hello RocketMQ2
Hello RocketMQ3
Hello RocketMQ7
Hello RocketMQ0
Hello RocketMQ4
Hello RocketMQ8
Hello RocketMQ2
Hello RocketMQ6
Hello RocketMQ1
Hello RocketMQ5
Hello RocketMQ9
Hello RocketMQ0
Hello RocketMQ4
Hello RocketMQ8
Hello RocketMQ1
Hello RocketMQ5
Hello RocketMQ9
Hello RocketMQ1
Hello RocketMQ5
Hello RocketMQ9
Hello RocketMQ0
Hello RocketMQ4
Hello RocketMQ8
Hello RocketMQ1
Hello RocketMQ5
Hello RocketMQ9
Hello RocketMQ1
PullResult [pullStatus=FOUND, nextBeginOffset=36, minOffset=0, maxOffset=36, msgFoundList=4]
Hello RocketMQ5
Hello RocketMQ9
Hello RocketMQ2
Hello RocketMQ6
PullResult [pullStatus=NO_NEW_MSG, nextBeginOffset=36, minOffset=0, maxOffset=36, msgFoundList=0]
queueID:3
PullResult [pullStatus=FOUND, nextBeginOffset=32, minOffset=0, maxOffset=35, msgFoundList=32]
Hello RocketMQ3
Hello RocketMQ7
Hello RocketMQ2
Hello RocketMQ6
Hello RocketMQ3
Hello RocketMQ9
Hello RocketMQ2
Hello RocketMQ6
Hello RocketMQ3
Hello RocketMQ7
Hello RocketMQ1
Hello RocketMQ5
Hello RocketMQ9
Hello RocketMQ0
Hello RocketMQ4
Hello RocketMQ8
Hello RocketMQ3
Hello RocketMQ7
Hello RocketMQ0
Hello RocketMQ4
Hello RocketMQ8
Hello RocketMQ0
Hello RocketMQ4
Hello RocketMQ8
Hello RocketMQ3
Hello RocketMQ7
Hello RocketMQ0
Hello RocketMQ4
Hello RocketMQ8
Hello RocketMQ0
Hello RocketMQ4
Hello RocketMQ8
PullResult [pullStatus=FOUND, nextBeginOffset=35, minOffset=0, maxOffset=35, msgFoundList=3]
Hello RocketMQ1
Hello RocketMQ5
Hello RocketMQ9
PullResult [pullStatus=NO_NEW_MSG, nextBeginOffset=35, minOffset=0, maxOffset=35, msgFoundList=0]
queueID:2
PullResult [pullStatus=FOUND, nextBeginOffset=32, minOffset=0, maxOffset=33, msgFoundList=32]
Hello RocketMQ2
Hello RocketMQ6
Hello RocketMQ1
Hello RocketMQ5
Hello RocketMQ9
Hello RocketMQ0
Hello RocketMQ7
Hello RocketMQ8
Hello RocketMQ1
Hello RocketMQ5
Hello RocketMQ9
Hello RocketMQ2
Hello RocketMQ6
Hello RocketMQ0
Hello RocketMQ4
Hello RocketMQ8
Hello RocketMQ3
Hello RocketMQ7
Hello RocketMQ2
Hello RocketMQ6
Hello RocketMQ3
Hello RocketMQ7
Hello RocketMQ3
Hello RocketMQ7
Hello RocketMQ2
Hello RocketMQ6
Hello RocketMQ3
Hello RocketMQ7
Hello RocketMQ3
Hello RocketMQ7
Hello RocketMQ0
Hello RocketMQ4
PullResult [pullStatus=FOUND, nextBeginOffset=33, minOffset=0, maxOffset=33, msgFoundList=1]
Hello RocketMQ8
PullResult [pullStatus=NO_NEW_MSG, nextBeginOffset=33, minOffset=0, maxOffset=33, msgFoundList=0]
Process finished with exit code 0