上一篇介绍了消费者请求拉取消息,最后发送给消费者。本章介绍消费者接收。
一、客户端消息接收入口
public class ClientCnx {
protected void handleMessage(CommandMessage cmdMessage, ByteBuf headersAndPayload) {
checkArgument(state == State.Ready);
ConsumerImpl<?> consumer = consumers.get(cmdMessage.getConsumerId());
if (consumer != null) {
List<Long> ackSets = Collections.emptyList();
if (cmdMessage.getAckSetsCount() > 0) {
ackSets = new ArrayList<>(cmdMessage.getAckSetsCount());
for (int i = 0; i < cmdMessage.getAckSetsCount(); i++) {
ackSets.add(cmdMessage.getAckSetAt(i));
}
}
// 接收
consumer.messageReceived(cmdMessage.getMessageId(), cmdMessage.getRedeliveryCount(), ackSets, headersAndPayload, this);
}
}
}
继续consumer.messageReceived
二、单个消费者ConsumerImpl接收消息处理
public class ConsumerImpl<T> {
void messageReceived(MessageIdData messageId, int redeliveryCount, List<Long> ackSet, ByteBuf headersAndPayload, ClientCnx cnx) {
if (!verifyChecksum(headersAndPayload, messageId)) {
// discard message with checksum error
discardCorruptedMessage(messageId, cnx, ValidationError.ChecksumMismatch);
return;
}
MessageMetadata msgMetadata;
try {
msgMetadata = Commands.parseMessageMetadata(headersAndPayload);
} catch (Throwable t) {
discardCorruptedMessage(messageId, cnx, ValidationError.ChecksumMismatch);
return;
}
// 批量发送可能>1
final int numMessages = msgMetadata.getNumMessagesInBatch();
final int numChunks = msgMetadata.hasNumChunksFromMsg() ? msgMetadata.getNumChunksFromMsg() : 0;
// 分块
final boolean isChunkedMessage = numChunks > 1 && conf.getSubscriptionType() != SubscriptionType.Shared;
MessageIdImpl msgId = new MessageIdImpl(messageId.getLedgerId(), messageId

本文深入解析了Pulsar客户端的消费者如何接收消息,包括单个ConsumerImpl的`messageReceived`处理流程,以及MultiTopicsConsumerImpl中多个消费者协作的机制。重点讲解了`consumer.receiveAsync()`和消息确认处理,以及多消费者之间的消息传递和队列管理策略。
最低0.47元/天 解锁文章
3412

被折叠的 条评论
为什么被折叠?



