应用程序启动后的Spring Boot长期运行方法

时间:2018-08-03 11:21:09

标签: java spring spring-boot apache-kafka kafka-consumer-api

对于我的Spring Boot Web应用程序,在应用程序启动后,我想调用一个类的方法以使其保持运行状态,直到应用程序关闭为止。例如,方法的逻辑是消耗Kafka消息(长时间轮询)。

所以我最终得到了以下代码。 可以,但是我正在寻找更简单或更优雅的方法。

@Component
class KafkaConsumerService : ApplicationRunner {
  private lateinit var kafkaConsumer: KafkaConsumer<String, String>

  init {
    val props = Properties()
    props[ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG] = "127.0.0.1:9092"
    props[ConsumerConfig.GROUP_ID_CONFIG] = "AnotherDemoConsumer"
    props[ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG] = StringDeserializer::class.java.name
    props[ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG] = StringDeserializer::class.java.name

    kafkaConsumer = KafkaConsumer(props)
  }

  override fun run(args: ApplicationArguments?) {
    receiveFromKafka()
  }

  fun receiveFromKafka() {
    kafkaConsumer.subscribe(listOf("test-topic"))

    while (true) {
      val consumerRecords = kafkaConsumer.poll(3000)

      consumerRecords.forEach { record ->
        logger.info("Receive Kafka message having key: ${record.key()}, value: ${record.value()}, " +
            "partition: ${record.partition()}, offset: ${record.offset()}")
      }
    }
  }
}

对于上述代码,我必须实现ApplicationRunner接口,然后重写run方法。

是否可以使用其他一些Spring引导功能而无需使用while循环或诸如调度程序之类的东西?

1 个答案:

答案 0 :(得分:0)

使用<div class="container"> <ul> <li>Variable</li> <li>Width</li> <li>Content</li> <li>Do not collapse long text</li> </ul> </div>打开spring的调度功能。可以通过@EnableShceduling

注释的方法来完成轮询