让我描述一下我的问题背后的理由:
因此,我们的想法是向Micronaut应用程序发送一个请求,以暂停/暂停使用来自Kafka的消息(例如,通过HTTP到适当的端点)。 KafkaConsumer界面似乎具有实现该目标的适当方法,例如
public void pause(java.util.Collection<TopicPartition> partitions)
public void resume(java.util.Collection<TopicPartition> partitions)
但是如何获取引用到我们的HTTP端点的相应KafkaConsumer实例的引用?
我们尝试将其注入到HTTP端点/控制器类的构造函数中,但这会产生结果
Error instantiating bean of type [HttpController]
Message: Missing bean arguments for type: org.apache.kafka.clients.consumer.KafkaConsumer. Requires arguments: AbstractKafkaConsumerConfiguration consumerConfiguration
可以使用Micronaut Kafka documentation中所述的带有@Topic注释的接收方法来获取KafkaConsumer实例的引用作为方法参数, 但这会导致将此引用存储为实例变量,并由HTTP端点进行访问,等等。pp ....听起来不太令人信服: 仅在收到下一条消息时,您才能获得对KafkaConsumer的引用!可能适合暂停/暂停,而不适合继续!
顺便说一句,在保存为实例变量的引用上调用KafkaConsumer.resume(...)
java.util.ConcurrentModificationException: KafkaConsumer is not safe for multi-threaded access
at org.apache.kafka.clients.consumer.KafkaConsumer.acquire(KafkaConsumer.java:2201)
at org.apache.kafka.clients.consumer.KafkaConsumer.acquireAndEnsureOpen(KafkaConsumer.java:2185)
at org.apache.kafka.clients.consumer.KafkaConsumer.resume(KafkaConsumer.java:1842)
[...]
我认为在实现KafkaConsumerAware接口以存储对刚创建的KafkaConsumer实例的引用时,也是如此。
那么有什么想法以适当的方式处理这个问题吗?
谢谢
基督徒