I create a Reactive Kafka producer that works in Spring. See code below:
KafkaPayload payload = new KafkaPayload(1, "value 1");
String topic = "a.kafka.topic";
Map<String, Object> props = kafkaProperties.buildProducerProperties();
ReactiveKafkaProducerTemplate<String, KafkaPayload> reactiveKafkaProducerTemplate = new ReactiveKafkaProducerTemplate<String, KafkaPayload>(SenderOptions.create(props));
Mono<SenderResult<Void>> senderMono = reactiveKafkaProducerTemplate.send(topic, payload);
senderMono.log().subscribe();
However the the reactive kafka consumer that wrote see not to work. What am I doing wrong? See consumer code below:
String topic = "a.kafka.topic";
ReceiverOptions<String, KafkaPayload> kafkaReceiverOptions = ReceiverOptions.create(kafkaProperties.buildConsumerProperties());
kafkaReceiverOptions.consumerProperty(ConsumerConfig.GROUP_ID_CONFIG, "kafka.id.1");
kafkaReceiverOptions.subscription(Collections.singletonList(topic));
ReactiveKafkaConsumerTemplate<String, KafkaPayload> reactiveKafkaConsumerTemplate = new ReactiveKafkaConsumerTemplate<String, KafkaPayload>(kafkaReceiverOptions);
Flux<KafkaPayload> kafkaFlux = reactiveKafkaConsumerTemplate
.receiveAutoAck()
// .delayElements(Duration.ofSeconds(2L)) // BACKPRESSURE
.doOnNext(
consumerRecord -> System.out.println(
"received key=" + consumerRecord.key() + ", " +
"value="+ consumerRecord.value() + ", " +
"from topic=" + consumerRecord.topic() + " ," +
"offset=" + consumerRecord.offset()))
.map(ConsumerRecord::value)
.doOnNext(kafkaPaload -> System.out
.println("successfully consumed KafkaPlayload="
+ kafkaPaload.getValue()))
.doOnError(throwable -> System.out.println(
"something bad happened while consuming" +
throwable.getMessage()))
.log();
// kafkaFlux.subscribe();
StepVerifier.create(kafkaFlux)
.consumeNextWith(payload -> {
System.out.println(
"-------ONNEXT AFTER SUBSCRIPTION ----------");
System.out.println("id: " + payload.getId() + " value: " + payload.getValue())
})
.verifyComplete();
The following kafka listener in Spring Boot works with the producer above.
@KafkaListener(id = "kafka.id.1", topics = "a.kafka.topic")
public void listner(KafkaPayload payload) {
System.out.println("id: " + payload.getId() + " value: " + payload.getValue())
}