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;
根据 ThreadLocal
和 volatile
变量定义判断,你可以推断它被设计用于多线程,因此它必须是线程安全的(如果不是,则你应该提交错误报告)。
如果设计者用信息性注释 @ThreadSafe
或至少在 class 的 JavaDoc 评论中指出这一点,那就更好了。
当与 DefaultKafkaProducerFactory 一起使用时,KafkaTemplate 完全是线程安全的(参见 KafkaTemplate doc)。
KafkaProducer 本身是线程安全的(参见KafkaProducer doc)。
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;
根据 ThreadLocal
和 volatile
变量定义判断,你可以推断它被设计用于多线程,因此它必须是线程安全的(如果不是,则你应该提交错误报告)。
如果设计者用信息性注释 @ThreadSafe
或至少在 class 的 JavaDoc 评论中指出这一点,那就更好了。
当与 DefaultKafkaProducerFactory 一起使用时,KafkaTemplate 完全是线程安全的(参见 KafkaTemplate doc)。
KafkaProducer 本身是线程安全的(参见KafkaProducer doc)。