KafkaClientService
For advanced use cases, SmallRye Reactive Messaging provides a bean of
type KafkaClientService that you can inject:
From there, you can obtain an
io.smallrye.reactive.messaging.kafka.KafkaProducer and an
io.smallrye.reactive.messaging.kafka.KafkaConsumer.
KafkaProducer and KafkaConsumer expose a non-blocking API on top of
the Kafka client API. They also mediate access to the threads that
SmallRye Reactive Messaging uses to run all Kafka operations: the
polling thread, used for consuming records from Kafka topics, and the
sending thread, used for producing records to Kafka topics. (Just to
be clear: each channel has its own polling thread and sending thread.)
The reason why SmallRye Reactive Messaging uses a special thread to run
the poll loop should be obvious: the Consumer API is blocking. The
Producer API, on the other hand, is documented to be non-blocking.
However, in present versions, Kafka doesn’t guarantee that in all cases;
see KAFKA-3539 for
more details. That is why SmallRye Reactive Messaging uses a dedicated
thread to run the send operations as well.
Sometimes, SmallRye Reactive Messaging provides direct access to the
Kafka Producer or Consumer. For example, a
KafkaConsumerRebalanceListener
methods are always invoked on the polling thread, so they give you
direct access to Consumer. In such case, you should use the
Producer/Consumer API directly, instead of the
KafkaProducer/KafkaConsumer API.