@Override public Flux<ConsumerRecord<K, V>> receiveAtmostOnce() { this.ackMode = AckMode.ATMOST_ONCE; atmostOnceOffsets = new AtmostOnceOffsets(); return createConsumerFlux() .concatMap(cr -> Flux .fromIterable(cr) .concatMap(r -> { long offset = r.offset(); TopicPartition partition = new TopicPartition(r.topic(), r.partition()); long committedOffset = atmostOnceOffsets.committedOffset(partition); atmostOnceOffsets.onDispatch(partition, offset); long commitAheadSize = receiverOptions.atmostOnceCommitAheadSize(); CommittableOffset committable = new CommittableOffset(partition, offset + commitAheadSize); if (offset >= committedOffset) return committable.commit() .then(Mono.just(r)) .publishOn(scheduler); else if (committedOffset - offset >= commitAheadSize / 2) committable.commit().subscribe(); return Mono.just(r); }, Integer.MAX_VALUE), Integer.MAX_VALUE) .transform(this::withDoOnRequest); }
@Override public Flux<ConsumerRecord<K, V>> receiveAtmostOnce() { this.ackMode = AckMode.ATMOST_ONCE; atmostOnceOffsets = new AtmostOnceOffsets(); return createConsumerFlux() .concatMap(cr -> Flux .fromIterable(cr) .concatMap(r -> { long offset = r.offset(); TopicPartition partition = new TopicPartition(r.topic(), r.partition()); long committedOffset = atmostOnceOffsets.committedOffset(partition); atmostOnceOffsets.onDispatch(partition, offset); long commitAheadSize = receiverOptions.atmostOnceCommitAheadSize(); CommittableOffset committable = new CommittableOffset(partition, offset + commitAheadSize); if (offset >= committedOffset) return committable.commit() .then(Mono.just(r)) .publishOn(scheduler); else if (committedOffset - offset >= commitAheadSize / 2) committable.commit().subscribe(); return Mono.just(r); }, Integer.MAX_VALUE), Integer.MAX_VALUE) .transform(this::withDoOnRequest); }
ImmutableReceiverOptions(ReceiverOptions<K, V> options) { this( options.consumerProperties(), options.assignListeners(), options.revokeListeners(), options.keyDeserializer(), options.valueDeserializer(), options.pollTimeout(), options.closeTimeout(), options.commitInterval(), options.commitBatchSize(), options.atmostOnceCommitAheadSize(), options.maxCommitAttempts(), options.subscriptionTopics(), options.assignment(), options.subscriptionPattern(), options.schedulerSupplier() ); }
ImmutableReceiverOptions(ReceiverOptions<K, V> options) { this( options.consumerProperties(), options.assignListeners(), options.revokeListeners(), options.keyDeserializer(), options.valueDeserializer(), options.pollTimeout(), options.closeTimeout(), options.commitInterval(), options.commitBatchSize(), options.atmostOnceCommitAheadSize(), options.maxCommitAttempts(), options.subscriptionTopics(), options.assignment(), options.subscriptionPattern(), options.schedulerSupplier() ); }
int commitAhead = 5; receiverOptions = receiverOptions .atmostOnceCommitAheadSize(commitAhead) .subscription(Collections.singleton(topic)); sendMessages(topic, 0, 50);