正如卡夫卡文件所说,
生产者是线程安全的,并且共享一个生产者实例 跨线程通常比拥有多个线程更快 实例。
所以我有以下代码,并且每个发送请求只希望有一个KafkaProducer实例。但是何时在代码中最好的地方调用close方法呢?由于我无法在send方法中调用close方法。我应该如何编写代码来处理?
public class Producer {
private final KafkaProducer<Integer, String> producer;
public Producer(String topic, Boolean isAsync) {
Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KafkaProperties.KAFKA_SERVER_URL + ":" + KafkaProperties.KAFKA_SERVER_PORT);
props.put(ProducerConfig.CLIENT_ID_CONFIG, "DemoProducer");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, IntegerSerializer.class.getName());
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
producer = new KafkaProducer<>(props);
}
public void send(String message) {
producer.send(new ProducerRecord<>(topic, messageNo, messageStr);
}
}
答案 0 :(得分:0)
Kafka producer实现了AutoClosable接口。因此,您可以在try-with-resources块中声明它,并且当代码超出该块的范围时,它应注意释放资源。
答案 1 :(得分:0)
您可以先创建生产者,然后将其传递(注入)到您的一个或多个Web资源中。
然后,您可以使用关闭钩子来关闭带有其引用的生产者。
如果可以在框架中使用生命周期停止挂钩,那就更好了。 dropwizard中的示例: https://www.dropwizard.io/en/latest/manual/core.html?highlight=managed#managed-objects
答案 2 :(得分:0)
您是否需要在运行时更改生产者参数?例如,在更改代理网址时或在测试期间?
如果您需要它并且您有一个单音生产者,请确保提供一个钩子来关闭并使用新参数重新创建生产者。