consumer

MQClientInstance.findConsumerIdList

从broker服务根据consumerGroup获取consumer列表


# topic:topic  group:consumerGroup
public List<String> findConsumerIdList(final String topic, final String group) {
	String brokerAddr = this.findBrokerAddrByTopic(topic); // 根据topic得到broker地址
	if (null == brokerAddr) {
		this.updateTopicRouteInfoFromNameServer(topic);
		brokerAddr = this.findBrokerAddrByTopic(topic);
	}

	if (null != brokerAddr) {
		try {// 根据brokerAddr和group 得到消费者列表
			return this.mQClientAPIImpl.getConsumerIdListByGroup(brokerAddr, group, 3000);
		} catch (Exception e) {
			log.warn("getConsumerIdListByGroup exception, " + brokerAddr + " " + group, e);
		}
	}

	return null;
}

MQClientAPIImpl.getConsumerIdListByGroup

从broker服务根据consumerGroup获取consumer列表

public List<String> getConsumerIdListByGroup(
	final String addr,
	final String consumerGroup,
	final long timeoutMillis) throws RemotingConnectException, RemotingSendRequestException, RemotingTimeoutException,
	MQBrokerException, InterruptedException {
	GetConsumerListByGroupRequestHeader requestHeader = new GetConsumerListByGroupRequestHeader();
	requestHeader.setConsumerGroup(consumerGroup); // 参数consumerGroup
	RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.GET_CONSUMER_LIST_BY_GROUP, requestHeader); //GET_CONSUMER_LIST_BY_GROUP:38

	RemotingCommand response = this.remotingClient.invokeSync(MixAll.brokerVIPChannel(this.clientConfig.isVipChannelEnabled(), addr),
		request, timeoutMillis);
	assert response != null;
	switch (response.getCode()) {
		case ResponseCode.SUCCESS: { // 成功
			if (response.getBody() != null) {
				GetConsumerListByGroupResponseBody body =
					GetConsumerListByGroupResponseBody.decode(response.getBody(), GetConsumerListByGroupResponseBody.class);
				return body.getConsumerIdList();  // 获取消费者列表
			}
		}
		default:
			break;
	}

	throw new MQBrokerException(response.getCode(), response.getRemark(), addr);
}

返回

consumer从broker获取consumer列表_rocketmq

broker

ConsumerManageProcessor

processRequest

public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request)
	throws RemotingCommandException {
	switch (request.getCode()) {
		case RequestCode.GET_CONSUMER_LIST_BY_GROUP:  // todo consumer 获取 consumer列表
			return this.getConsumerListByGroup(ctx, request);
		case RequestCode.UPDATE_CONSUMER_OFFSET:
			return this.updateConsumerOffset(ctx, request);
		case RequestCode.QUERY_CONSUMER_OFFSET:
			return this.queryConsumerOffset(ctx, request);
		default:
			break;
	}
	return null;
}

getConsumerListByGroup

public RemotingCommand getConsumerListByGroup(ChannelHandlerContext ctx, RemotingCommand request)
	throws RemotingCommandException {
	final RemotingCommand response =
		RemotingCommand.createResponseCommand(GetConsumerListByGroupResponseHeader.class);
	final GetConsumerListByGroupRequestHeader requestHeader =
		(GetConsumerListByGroupRequestHeader) request
			.decodeCommandCustomHeader(GetConsumerListByGroupRequestHeader.class);

	ConsumerGroupInfo consumerGroupInfo =
		this.brokerController.getConsumerManager().getConsumerGroupInfo(
			requestHeader.getConsumerGroup()); // requestHeader.getConsumerGroup() 请求的consumerGroup
	if (consumerGroupInfo != null) {
		List<String> clientIds = consumerGroupInfo.getAllClientId(); // 获取consumer列表
		if (!clientIds.isEmpty()) {
			GetConsumerListByGroupResponseBody body = new GetConsumerListByGroupResponseBody();
			body.setConsumerIdList(clientIds); // 返回consumer列表
			response.setBody(body.encode());
			response.setCode(ResponseCode.SUCCESS);
			response.setRemark(null);
			return response;
		} else {
			........
		}
	} else {
		........
	}

	response.setCode(ResponseCode.SYSTEM_ERROR);
	response.setRemark("no consumer for this group, " + requestHeader.getConsumerGroup());
	return response;
}