如何在Micronaut中实现HTTP端点以暂停来自Kafka的消息使用?

时间:2019-02-28 14:19:49

标签: apache-kafka kafka-consumer-api micronaut

让我描述一下我的问题背后的理由:

  • 我们有一个基于Micronaut的应用程序,使用了来自Kafka经纪人的消息。
  • 已处理的消息将被处理并馈送到另一个远程“下游”应用程序。
  • 如果此下游应用程序将有意重启,则需要一段时间才能准备好接受来自基于Micronaut的应用程序的进一步消息。

因此,我们的想法是向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实例的引用时,也是如此。

那么有什么想法以适当的方式处理这个问题吗?

谢谢

基督徒

0 个答案:

没有答案