Rocket源码分析之-DefaultPushConsumer 拉取源码分析

这是一段RocketMq经典的consumer异步获取broker消息的代码:

    DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumerGroup");
    consumer.setNamesrvAddr(Constants.NameServerAddr);
    consumer.subscribe("topic01","*");
    consumer.setMessageModel(MessageModel.BROADCASTING);//广播消息,所有相同组,定于topic的消费端都能收到消息
    //consumer.setMessageModel(MessageModel.CLUSTERING);//集群消息--默认(相同组内的topic,集群消息只有一端会接收到)
    consumer.registerMessageListener(new MessageListenerConcurrently(){
      @Override
      public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list,
          ConsumeConcurrentlyContext consumeConcurrentlyContext) {
        for (MessageExt messageExt:list){
          System.out.println(new java.lang.String(messageExt.getBody()));
        }
        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
      }
    });
    consumer.start();
  }

consumer start()方法跟踪

  1. this.defaultMQPushConsumerImpl.start();

  2. 刚启动serviceState状态为 CREATE_JUST,进入这个状态的switch处理逻辑

  3. 先用checkCoing()检查consumer的各个配置是否配置ok

  4. 然后 copySubscription()用于根据subject构建本地的rebalance的conhurrentHashMapInner

  5. 接着构建MqClientFactory的一个Instance

  6. 构建PullWrapper,用于去Broker注册过滤消息

  7. 再根据MessageMode是广播模式还是集群模式获取offset。(广播模式是从consumer本地的store获取,集群模式则是需要去broker去请求获取)

  8. 根据监听消息的类型是OrderLy还是Concurrently去构建一个consumeMessageService对象

9.启动刚才创建的consumerMessageService对象,调用其start方法

  1. 使用MqClientFactory Instance实例registerConsumer进行注册

  2. 把当前的serviceState状态变为Running状态

12.然后就开始从broker获取消息,请看下面的pushConsumer拉取消息流程

pushConsumer拉取消息流程介绍

consumer --DefaultMqPushConsumerImpl 使用pullMessage(pullRequest)拉取消息,pullAPIWrapper.pullKernelImpl(传递pullReuest,回调callback等参数)根据是否同步pullMessageSync还是异步pullMessageAsync, 拉取回来的消息PullResult经过解析处理存放到ProcessQueue 队列里的TreeMap(offset,messageExt)

整体源码分析图例如下:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值