一文读懂RocketMQ消费者DefaultMQPushConsumer的使用

一文读懂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的高可用。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值