Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 卡夫卡制作人线程,大量线程,即使没有消息发送_Spring Boot_Apache Kafka_Spring Kafka - Fatal编程技术网

Spring boot 卡夫卡制作人线程,大量线程,即使没有消息发送

Spring boot 卡夫卡制作人线程,大量线程,即使没有消息发送,spring-boot,apache-kafka,spring-kafka,Spring Boot,Apache Kafka,Spring Kafka,我目前分析了我的kafka producer spring启动应用程序,发现许多“kafka producer网络线程”正在运行(总共47个)。它永远不会停止运行,即使没有数据发送。 我的应用程序看起来有点像这样: var kafkaSender = KafkaSender(kafkaTemplate, applicationProperties) kafkaSender.sendToKafka(json, rs.getString("KEY")) 卡夫卡森德: @Service class

我目前分析了我的kafka producer spring启动应用程序,发现许多“kafka producer网络线程”正在运行(总共47个)。它永远不会停止运行,即使没有数据发送。 我的应用程序看起来有点像这样:

var kafkaSender = KafkaSender(kafkaTemplate, applicationProperties)
kafkaSender.sendToKafka(json, rs.getString("KEY"))
卡夫卡森德:

@Service
class KafkaSender(val kafkaTemplate: KafkaTemplate<String, String>, val applicationProperties: ApplicationProperties) {

@Transactional(transactionManager = "kafkaTransactionManager")
fun sendToKafka(message: String, stringKey: String) {
   kafkaTemplate.executeInTransaction { kt ->
       kt.send(applicationProperties.kafka.topic, System.currentTimeMillis().mod(10).toInt(), System.currentTimeMillis().rem(10).toString(),
               message)
   }
}

companion object {
    val log = LoggerFactory.getLogger(KafkaSender::class.java)!!
}
}
@服务
类KafkaSender(val kafkaTemplate:kafkaTemplate,val applicationProperties:applicationProperties){
@事务性(transactionManager=“kafkaTransactionManager”)
fun sendToKafka(消息:String,stringKey:String){
kafkaTemplate.executeInTransaction{kt->
kt.send(applicationProperties.kafka.topic,System.currentTimeMillis().mod(10).toInt(),System.currentTimeMillis().rem(10).toString(),
(信息)
}
}
伴星{
val log=LoggerFactory.getLogger(KafkaSender::class.java)!!
}
}
因为每次我想向Kafka发送消息时,我都会实例化一个新的Kafkander,所以我以为会创建一个新线程,然后将消息发送到Kafka队列。 目前,似乎已经生成了一个生产者池,但从未清理过,即使他们都没有任何事情要做

这种行为是故意的吗


在我看来,这种行为应该与数据源池几乎相同,让线程保持一段时间的活动状态,但当无事可做时,将其清除。

使用事务时,生产者缓存会按需增长,不会减少

如果您正在侦听器容器(使用者)线程上生成消息;每个主题/分区/消费者组都有一个生产者。这是解决僵尸防护问题所必需的,因此,如果发生重新平衡并且分区移动到不同的实例,事务id将保持不变,以便代理可以正确处理这种情况


如果您不关心僵尸围栏问题(并且您可以处理重复交付),请在
DefaultKafkapProducerFactory
上将
producerPerConsumerPartition
属性设置为false,那么生产者的数量将小得多。

如果不使用
executeInTransaction
,它是如何工作的?您已经有了一个基于Kafka TX Manager的
@Transactional
,使用
executeInTransaction