java下mq同步调用,RocketMQ中PullConsumer的消息拉取源码分析,

本文详细分析了RocketMQ中PullConsumer的同步和异步消息拉取流程。从pullSyncImpl方法开始,讲解了同步拉取时的订阅检查、消息拉取、Broker地址查找等步骤。接着讨论了异步拉取,通过pullAsyncImpl方法和回调机制实现。文章深入源码,展示了RocketMQ消费者端的消息处理机制。
摘要由CSDN通过智能技术生成

RocketMQ中PullConsumer的消息拉取源码分析,

在PullConsumer中,有关消息的拉取RocketMQ提供了很多API,但总的来说分为两种,同步消息拉取和异步消息拉取

同步消息拉取

以同步方式拉取消息都是通过DefaultMQPullConsumerImpl的pullSyncImpl方法:

1 private PullResult pullSyncImpl(MessageQueue mq, SubscriptionData subscriptionData, long offset, int maxNums, booleanblock,2 longtimeout)3 throwsMQClientException, RemotingException, MQBrokerException, InterruptedException {4 this.makeSureStateOK();5

6 if (null ==mq) {7 throw new MQClientException("mq is null", null);8 }9

10 if (offset < 0) {11 throw new MQClientException("offset < 0", null);12 }13

14 if (maxNums <= 0) {15 throw new MQClientException("maxNums <= 0", null);16 }17

18 this.subscriptionAutomatically(mq.getTopic());19

20 int sysFlag = PullSysFlag.buildSysFlag(false, block, true, false);21

22 long timeoutMillis = block ? this.defaultMQPullConsumer.getConsumerTimeoutMillisWhenSuspend() : timeout;23

24 boolean isTagType =ExpressionType.isTagType(subscriptionData.getExpressionType());25 PullResult pullResult = this.pullAPIWrapper.pullKernelImpl(26 mq,27 subscriptionData.getSubString(),28 subscriptionData.getExpressionType(),29 isTagType ? 0L: subscriptionData.getSubVersion(),30 offset,31 maxNums,32 sysFlag,33 0,34 this.defaultMQPullConsumer.getBrokerSuspendMaxTimeMillis(),35 timeoutMillis,36 CommunicationMode.SYNC,37 null

38 );39 this.pullAPIWrapper.processPullResult(mq, pullResult, subscriptionData);40 if (!this.consumeMessageHookList.isEmpty()) {41 ConsumeMessageContext consumeMessageContext = null;42 consumeMessageContext = newConsumeMessageContext();43 consumeMessageContext.setConsumerGroup(this.groupName());44 consumeMessageContext.setMq(mq);45 consumeMessageContext.setMsgList(pullResult.getMsgFoundList());46 consumeMessageContext.setSuccess(false);47 this.executeHookBefore(consumeMessageContext);48 consumeMessageContext.setStatus(ConsumeConcurrentlyStatus.CONSUME_SUCCESS.toString());49 consumeMessageContext.setSuccess(true);50 this.executeHookAfter(consumeMessageContext);51 }52 returnpullResult;53 }

首先通过subscriptionAutomatically方法检查Topic是否订阅

1 public void subscriptionAutomatically(finalString topic) {2 if (!this.rebalanceImpl.getSubscriptionInner().containsKey(topic)) {3 try{4 SubscriptionData subscriptionData = FilterAPI.buildSubscriptionData(this.defaultMQPullConsumer.getConsumerGroup(),5 topic, SubscriptionData.SUB_ALL);6 this.rebalanceImpl.subscriptionInner.putIfAbsent(topic, subscriptionData);7 } catch(Exception ignore) {8 }9 }10 }

若是没有就新建一条订阅数据保存在rebalanceImpl的subscriptionInner中

之后调用pullKernelImpl方法:

1 publicPullResult pullKernelImpl(2 finalMessageQueue mq,3 finalString subExpression,4 finalString expressionType,5 final longsubVersion,6 final longoffset,7 final intmaxNums,8 final intsysFlag,9 final longcommitOffset,10 final longbrokerSuspendMaxTimeMillis,11 final longtimeoutMillis,12 finalCommunicationMode communicationMode,13 finalPullCallback pullCallback14 ) throwsMQClientException, RemotingException, MQBrokerException, InterruptedException {15 FindBrokerResult findBrokerResult =

16 this.mQClientFactory.findBrokerAddressInSubscribe(mq.getBrokerName(),17 this.recalculatePullFromWhichNode(mq), false);18 if (null ==findBrokerResult) {19 this.mQClientFactory.updateTopicRouteInfoFromNameServer(mq.getTopic());20 findBrokerResult =

21 this.mQClientFactory.findBrokerAddressInSubscribe(mq.getBrokerName(),22 this.recalculatePullFromWhichNode(mq), false);23 }24

25 if (findBrokerResult != null) {26 {27 //check version

28 if (!ExpressionType.isTag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值