1

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())

}

0 Answers0