在一文读懂RocketMQ生产者DefaultMQProducer的使用一篇我们详细介绍了RockerMQ生产者的使用,本篇我们介绍RocketMQ消费者的使用,RocketMQ的消费者有两个实现分别为DefaultMQPushConsumer和DefaultMQPullConsumer,它们分别为pull模式和push模式。其中pull模式为消费者主动发送请求,每隔一段时间去消息服务端拉取消息,push模式是采取长轮询的机制,消费者轮询方式主动发送请求到服务端Broker,Broker如果检测到有新的消息,则立即返回,否则暂时不返回任何消息,将请求挂起缓存到本地,Broker有一个线程检测挂起请求,等到有新消息时,对请求进项响应。而本篇我们主要介绍DefaultMQPushConsumer的使用。
相对于DefaultMQProducer生产者提供的多个发送消息的API,DefaultMQPushConsumer提供的消费消息的方法比较简单,它提供了registerMessageListener方法注册一个监听器用于消费消息。如下为DefaultMQPushConsumer提供的方法:
//注册一个回调,在有消息存在时执行并发消费。
public void registerMessageListener(MessageListenerOrderly messageListener) {}
//注册一个回调,以便在消息到达时执行顺序消费。
public void registerMessageListener(MessageListenerConcurrently messageListener) {}
DefaultMQPushConsumer主要使用上面的两个方法消息生产者发送的消息,如下为DefaultMQPushConsumer的一个示例,它的重点 主要在DefaultMQPushConsumer的配置,不同的配置可能会有不同的效果,我们先看一个示例,在介绍它的核心配置,代码如下:
public class Consumer {
public static void main(String[] args) throws InterruptedException, MQClientException {
//实例化消费者,传入消费者组,表示消费同一类消息
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("OnewayProducer");
//设置nameserver地址
consumer.setNamesrvAddr("127.0.0.1:9876");
//设置订阅的主图
consumer.subscribe("BenchmarkTest", "*");
//设置如何从何处开始消费
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
//注册消息监听器,用于消费生产者生产的消息
consumer.registerMessageListener(new MessageListenerConcurrently() {
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();
}
}
上面代码示例了一个简单的RocketMQ的消费者,实例化消费者与设置nameServer这里不再讲解,如下为RocketMQ消费者的核心配置:
//订阅主题为topic的消息,并且可以通过subExpression过滤消息
public void subscribe(String topic, String subExpression){}
//订阅主题为topic的消息,可以订阅某Class实例的消息
public void subscribe(String topic, String fullClassName, String filterClassSource){}
//订阅主题为topic的消息,使用MessageSelector过滤消息
public void subscribe(final String topic, final MessageSelector messageSelector){}
//取消订阅主题为topic的消息
public void unsubscribe(String topic){}
//消息模型,支持集群消费和广播消费,默认为集群消费
public void setMessageModel(MessageModel messageModel){}
//Consumer 启动后,默认从什么位置开始消费,默认为CONSUME_FROM_LAST_OFFSET
public void setConsumeFromWhere(ConsumeFromWhere consumeFromWhere) {}
//集群模式下消息队列Rebalance 算法实现策略
public void setAllocateMessageQueueStrategy(AllocateMessageQueueStrategy allocateMessageQueueStrategy){}
//消费进度存储
public void setOffsetStore(OffsetStore offsetStore){}
//消费线程池数量的最大值
public void setConsumeThreadMax(int consumeThreadMax) {}
//消费线程池数量的最小值
public void setConsumeThreadMin(int consumeThreadMin){}
//单队列并行消费允许的最大跨度
public void setConsumeConcurrentlyMaxSpan(int consumeConcurrentlyMaxSpan){}
//默认值为1000,每1000次流控后打印流控日志
public void setPullThresholdForQueue(int pullThresholdForQueue) {}
//推模式下拉取任务间隔时间,默认一次拉取任务完成继续拉取
public void setPullInterval(long pullInterval) {}
//每次消息拉取拉取的消磁条数,默认为32条
public void setPullBatchSize(int pullBatchSize) {}
//消息并发消费时一次消费的消息条数
public void setConsumeMessageBatchMaxSize(int consumeMessageBatchMaxSize) {}
//是否每次拉取消息都更新订阅信息,默认为false
public void setPostSubscriptionWhenPull(boolean postSubscriptionWhenPull) {}
//最大消费重试次数
public void setMaxReconsumeTimes(final int maxReconsumeTimes){}
//延迟将队列的消息提交到消费线程的等待时长,默认为延迟1秒
public void setSuspendCurrentQueueTimeMillis(final long suspendCurrentQueueTimeMillis) {}
//信息消费超时时间,默认为15秒
public void setConsumeTimeout(final long consumeTimeout) {}
上面我们介绍了消费者的核心配置,下面我们挑选其中的重要的配置进行详细详解,我们先介绍AllocateMessageQueueStrategy 负载均衡策略的配置。它的根接口为AllocateMessageQueueStrategy,下面我们介绍它的实现,如下类图所示:
- AllocateMessageQueueAveragely 平均分配,也是默认使用的策略
- AllocateMessageQueueAveragelyByCircle 环形分配策略
- AllocateMessageQueueByConfig 手动配置
- AllocateMessageQueueConsistentHash 一致性Hash分配
- AllocateMessageQueueByMachineRoom 机房分配策略
介绍完分配策略之后,我们再来看setMessageModel配置,该配置用于配置消息模型,支持集群消费和广播消费,默认为集群消费。如下为MessageModel的定义:
public enum MessageModel {
/**
* 广播,消费组中的每个消费者都可以消费所有消息
*/
BROADCASTING("BROADCASTING"),
/**
* 集群,消费组中的每个消费者都可以消费消息中的一部分消息
*/
CLUSTERING("CLUSTERING");
......
}
setConsumeFromWhere用于配置默认从什么位置开始消费,默认为CONSUME_FROM_LAST_OFFSET,如下为ConsumeFromWhere的定义:
public enum ConsumeFromWhere {
//从上次消费的位点开始消费,相当于断电继续
CONSUME_FROM_LAST_OFFSET,
//从ConsumeQueue最小位点开始消费
CONSUME_FROM_FIRST_OFFSET,
//从指定的时间开始消费
CONSUME_FROM_TIMESTAMP,
@Deprecated
CONSUME_FROM_LAST_OFFSET_AND_FROM_MIN_WHEN_BOOT_FIRST,
@Deprecated
CONSUME_FROM_MIN_OFFSET,
@Deprecated
CONSUME_FROM_MAX_OFFSET,
}
更多消费者的示例这里不再展示,其实官方也便写了很多RocketMQ的使用示例,感兴趣的可以查找官方github示例,后续我们会介绍RocketMQ的高可用。