@Override public void received(Consumer<T> consumer, Message<T> msg) { readerListener.received(ReaderImpl.this, msg); consumer.acknowledgeCumulativeAsync(msg); }
@Override protected CompletableFuture<Void> doAcknowledge(MessageId messageId, AckType ackType, Map<String,Long> properties) { checkArgument(messageId instanceof TopicMessageIdImpl); TopicMessageIdImpl topicMessageId = (TopicMessageIdImpl) messageId; if (getState() != State.Ready) { return FutureUtil.failedFuture(new PulsarClientException("Consumer already closed")); } if (ackType == AckType.Cumulative) { Consumer individualConsumer = consumers.get(topicMessageId.getTopicPartitionName()); if (individualConsumer != null) { MessageId innerId = topicMessageId.getInnerMessageId(); return individualConsumer.acknowledgeCumulativeAsync(innerId); } else { return FutureUtil.failedFuture(new PulsarClientException.NotConnectedException()); } } else { ConsumerImpl<T> consumer = consumers.get(topicMessageId.getTopicPartitionName()); MessageId innerId = topicMessageId.getInnerMessageId(); return consumer.doAcknowledge(innerId, ackType, properties) .thenRun(() -> unAckedMessageTracker.remove(topicMessageId)); } }
@Override public void received(Consumer<T> consumer, Message<T> msg) { readerListener.received(ReaderImpl.this, msg); consumer.acknowledgeCumulativeAsync(msg); }
@Override protected CompletableFuture<Void> doAcknowledge(MessageId messageId, AckType ackType, Map<String,Long> properties) { checkArgument(messageId instanceof TopicMessageIdImpl); TopicMessageIdImpl topicMessageId = (TopicMessageIdImpl) messageId; if (getState() != State.Ready) { return FutureUtil.failedFuture(new PulsarClientException("Consumer already closed")); } if (ackType == AckType.Cumulative) { Consumer individualConsumer = consumers.get(topicMessageId.getTopicPartitionName()); if (individualConsumer != null) { MessageId innerId = topicMessageId.getInnerMessageId(); return individualConsumer.acknowledgeCumulativeAsync(innerId); } else { return FutureUtil.failedFuture(new PulsarClientException.NotConnectedException()); } } else { ConsumerImpl<T> consumer = consumers.get(topicMessageId.getTopicPartitionName()); MessageId innerId = topicMessageId.getInnerMessageId(); return consumer.doAcknowledge(innerId, ackType, properties) .thenRun(() -> unAckedMessageTracker.remove(topicMessageId)); } }
@Override public void received(Consumer<T> consumer, Message<T> message) { String topicName; // If more than one topics are being read than the Message return by the consumer will be TopicMessageImpl // If there is only topic being read then the Message returned by the consumer wil be MessageImpl if (message instanceof TopicMessageImpl) { topicName = ((TopicMessageImpl<?>) message).getTopicName(); } else { topicName = consumer.getTopic(); } Record<T> record = PulsarRecord.<T>builder() .message(message) .topicName(topicName) .ackFunction(() -> { if (pulsarSourceConfig .getProcessingGuarantees() == FunctionConfig.ProcessingGuarantees.EFFECTIVELY_ONCE) { consumer.acknowledgeCumulativeAsync(message); } else { consumer.acknowledgeAsync(message); } }).failFunction(() -> { if (pulsarSourceConfig.getProcessingGuarantees() == FunctionConfig.ProcessingGuarantees.EFFECTIVELY_ONCE) { throw new RuntimeException("Failed to process message: " + message.getMessageId()); } }) .build(); consume(record); }