【问题标题】:spring kafka shutting down producer gracefully during runtimespring kafka 在运行时优雅地关闭生产者
【发布时间】:2017-06-19 13:58:07
【问题描述】:

我们有一个使用 spring-kafka 的 spring boot 应用程序。当我们更新配置属性时,我们想禁用 kafka 生产者(kafkatemplate)。我尝试过使用条件 bean,并使用 applicationcontext refresh。

有没有办法用 spring-kafka 优雅地关闭 kafkaproducer ?

【问题讨论】:

    标签: spring-cloud spring-kafka


    【解决方案1】:

    您可以在DefaultKafkaProducerFactory 上调用destroy(),它会关闭(单例)生产者,但下一次某些代码调用createProducer() 时会创建另一个;目前没有办法阻止这种情况。当您不希望创建生产者时,您需要对工厂进行子类化并引发异常。

    【讨论】:

    • 嗨,Gary - 这可以满足我们的需要。调用了destroy(),后来在发送消息时(尝试调用createProducer)-我们收到以下错误java.lang.IllegalStateException:在生产者关闭后无法发送。在 org.apache.kafka.clients.producer.internals.RecordAccumulator.append(RecordAccumulator.java:172) ~[kafka-clients-0.10.1.1.jar:na] 在 org.apache.kafka.clients.producer.KafkaProducer。 doSend(KafkaProducer.java:474)~[kafka-clients-0.10.1.1.jar:na] at org.apache.kafka.clients.producer.KafkaProducer.send(KafkaProducer.java:436)~[kafka-clients-0.10 .1.1.jar:na]
    • 不要试图把这样的东西放在 cmets 里;它渲染得不好;最好编辑您的问题并添加评论以说明您已这样做。您需要显示完整的堆栈跟踪,但我看到 KafkaTemplate 缓存了生产者;这是错误的;我们每次都应该从工厂中获取生产者。我打开了an issue。作为一种解决方法,您需要创建一个新的KafkaTemplate,以便它从工厂获取新的生产者。
    猜你喜欢
    • 2017-10-25
    • 2019-03-10
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 2010-11-04
    相关资源
    最近更新 更多