KafkaTemplate线程安全吗

Is KafkaTemplate thread safe

spring 引导线程中的 KafkaTemplate 是否安全。我可以创建一个 KafkaTemplate 并使用它为我的 Web 服务中的多个请求将信息发送到同一个 kafka 主题吗?

是的,KafkaTemplate 设计为线程安全的。如果查看它的 source code,您会看到以下成员变量声明:

protected final Log logger = LogFactory.getLog(this.getClass()); //NOSONAR

private final ProducerFactory<K, V> producerFactory;

private final boolean autoFlush;

private final boolean transactional;

private final ThreadLocal<Producer<K, V>> producers = new ThreadLocal<>();

private RecordMessageConverter messageConverter = new MessagingMessageConverter();

private volatile String defaultTopic;

根据 ThreadLocalvolatile 变量定义判断,你可以推断它被设计用于多线程,因此它必须是线程安全的(如果不是,则你应该提交错误报告)。

如果设计者用信息性注释 @ThreadSafe 或至少在 class 的 JavaDoc 评论中指出这一点,那就更好了。

当与 DefaultKafkaProducerFactory 一起使用时,KafkaTemplate 完全是线程安全的(参见 KafkaTemplate doc)。

KafkaProducer 本身是线程安全的(参见KafkaProducer doc)。