2017-02-02 1032 views
1

我们有一个使用spring-kafka的spring引导应用程序。当我们更新配置属性时,我们想禁用kafka生产者(kafkatemplate)。我已经试过使用条件bean,并使用applicationcontext刷新。spring kafka在运行时优雅地关闭生产者

有没有办法使用spring-kafka正常关闭kafkaproducer?

回答

0

你可以拨打destroy()DefaultKafkaProducerFactory它会关闭(单身)生产者,但下一次代码调用createProducer()另一个将被创建;目前没有办法阻止这种情况发生。如果您不想创建生产者,您需要继承工厂的子类并抛出异常。

+0

嗨加里 - 这将符合我们的需求。 destroy()被调用,稍后当消息被发送时(尝试调用createProducer) - 我们得到以下错误java.lang.IllegalStateException:生产者关闭后无法发送。 \t at org.apache.kafka.clients.producer.internals.RecordAccumulator.append(RecordAccumulator.java:172)〜[kafka-clients-0.10.1.1.jar:na] \t at org.apache.kafka.clients。生产者.KafkaProducer.doSend(KafkaProducer.java:474)〜[kafka-clients-0.10.1.1.jar:na] \t at org.apache.kafka.clients.producer.KafkaProducer.send(KafkaProducer.java:436)〜 [kafka-clients-0.10.1.1.jar:na] – basu76

+0

不要试图在这里留言,它渲染不好;最好编辑你的问题,并添加评论来说你已经这么做了。你需要显示完整的堆栈跟踪,但是我看到'KafkaTemplate'缓存生产者;这是错误的;我们应该每次从工厂取回生产者。我已经打开了[问题](https://github.com/spring-projects/spring-kafka/issues/232)。作为解决方法,您需要创建一个新的'KafkaTemplate',以便从工厂获取新的生产者。 –