• RocketMQ源码之 consumer是怎样消费消息的


    DefaultMQPushConsumer(以push为例).start()调用mQClientFactory.start(),其中pullMessageService.start在一个循环中从pullRequestQueue中获取pullRequest,执行pullMessage方法,调用的是remotingClient的invokeAsync方法,传入一个封装了PullCallback的回调函数,等响应到来的时候,PullCallback的onSuccess方法consumeMessageService.submitConsumeRequest放入线程池消费(ConsumeRequest 的 run方法中有messageListener.consumeMessage),然后调用executePullRequestImmediately把新的pullRequest放入上面说的pullRequestQueue中,可以看出push其实还是pull。

    有个问题就是:pullRequestQueue中第一个pullRequest是什么时候放进去的?上面说的pullMessageService.start的下面有this.rebalanceService.start(),run方法的循环中,countDownlatch等待(最大20秒),被唤醒后会doRebalance一直到dispatchPullRequest(取出所有订阅的队列,分别发起拉取请求)再到熟悉的上面说的executePullRequestImmediately放入pullRequest。而mQClientFactory.start()方法的下面有this.mQClientFactory.rebalanceImmediately(),里面即时放行countDownlatch。

  • 相关阅读:
    BZOJ5104 二次剩余板子
    BZOJ5329 [Sdoi2018]战略游戏 圆方树+虚树
    BZOJ1095 动态点分治
    BZOJ3992: [SDOI2015]序列统计
    kd-tree板子
    thusc2018翻车记
    BZOJ5336 DP套DP
    BZOJ4316 仙人掌DP
    问题 F: 最小花费
    问题 C: 热浪
  • 原文地址:https://www.cnblogs.com/chuliang/p/12241116.html
Copyright © 2020-2023  润新知