我正尝试注入KafkaTemplate
来发送一条消息。我正在开发反应式方法之外的一个小功能。
我只能从Smallrye中找到使用@Ingoing
和@Outgoing
的示例,但我不需要KafkaStream
。
我尝试使用Kafka-CDI,但无法注入SimpleKafkaProducer
。
有什么想法吗?
克莱门特的答案
这似乎是正确的方向,但是执行orders.send("hello");
却收到此错误:
(vert.x-eventloop-thread-3) Unhandled exception:java.lang.IllegalStateException: Stream not yet connected
我正在通过命令行从主题中进行消费,Kafka已启动并正在运行,如果手动生成,则可以看到已消费的消息。
文档似乎与这句话有关:
要将Emitter用于流问候,您需要一个@Incoming(“ hello”) 在代码(或配置)中的某个位置。
我的课堂上有以下代码:
@Incoming("orders")
public CompletionStage<Void> consume(KafkaMessage<String, String> msg) {
log.info("Received message (topic: {}, partition: {}) with key {}: {}", msg.getTopic(), msg.getPartition(), msg.getKey(), msg.getPayload());
return msg.ack();
}
也许我忘记了一些配置?
答案 0 :(得分:3)
因此,您只需要使用Emitter
:
@Inject
@Stream("orders") // Emit on the channel 'orders'
Emitter<String> orders;
// ...
orders.send("hello");
然后在您的application.properties
中声明:
## Orders topic (WRITE)
mp.messaging.outgoing.orders.type=io.smallrye.reactive.messaging.kafka.Kafka
mp.messaging.outgoing.orders.topic=orders
mp.messaging.outgoing.orders.bootstrap.servers=localhost:9092
mp.messaging.outgoing.orders.key.serializer=org.apache.kafka.common.serialization.StringSerializer
mp.messaging.outgoing.orders.value.serializer=org.apache.kafka.common.serialization.StringSerializer
mp.messaging.outgoing.orders.acks=1
为避免Stream not yet connected
异常,如doc建议:
要将Emitter用于流问候,您需要一个@Incoming(“ hello”) 在代码(或配置)中的某个位置。
假设您的application.properties中包含以下内容:
# Orders topic (READ)
smallrye.messaging.source.orders-r-topic.type=io.smallrye.reactive.messaging.kafka.Kafka
smallrye.messaging.source.orders-r-topic.topic=orders
smallrye.messaging.source.orders-r-topic.bootstrap.servers=0.0.0.0:9092
smallrye.messaging.source.orders-r-topic.key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
smallrye.messaging.source.orders-r-topic.value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
smallrye.messaging.source.orders-r-topic.group.id=my-group-id
添加类似这样的内容:
@Incoming("orders-r-topic")
public CompletionStage<Void> consume(KafkaMessage<String, String> msg) {
log.info("Received message (topic: {}, partition: {}) with key {}: {}", msg.getTopic(), msg.getPartition(), msg.getKey(), msg.getPayload());
return msg.ack();
}
答案 1 :(得分:2)
自Clement's answer以来,
@Stream
注释已被弃用。@Channel
批注 必须使用。
您可以使用Emitter
依赖项提供的quarkus-smallrye-reactive-messaging-kafka
来产生有关Kafka主题的消息。
一个简单的Kafka生产者实现:
public class MyKafkaProducer {
@Inject
@Channel("my-topic")
Emitter<String> myEmitter;
public void produce(String message) {
myEmitter.send(message);
}
}
并且必须将以下配置添加到application.properties文件中:
mp.messaging.outgoing.my-topic.connector=smallrye-kafka
mp.messaging.outgoing.my-topic.bootstrap.servers=localhost:9092
mp.messaging.outgoing.my-topic.value.serializer=org.apache.kafka.common.serialization.StringSerializer
这将产生字符串序列化消息,该消息传递到名为my-topic
的kafka主题。
请注意,默认情况下,通道的名称也是将在其中生成数据的kafka主题的名称。可以通过配置更改此行为。支持的配置属性在反应式消息传递documentation
中进行了描述