我正在尝试使用kafka进行简单的应用程序。应用程序的目的是监听kafka主题并对来自它的消息做出反应(在这种情况下只记录消息)。
的src /主/爪哇/ PKG / Application.java
package pkg;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
@SpringBootApplication
public class Application {
private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
SpringApplication.run(Application.class, args).close();
}
// Want to avoid creation of this bean
@Bean
public ApplicationRunner applicationRunner() {
return args -> {
while (true) {
TimeUnit.DAYS.sleep(1);
}
};
}
@Component
public static class Listener {
@KafkaListener(topics = "testTopic")
public void listenBatch(String message) {
LOGGER.info("Message: {}", message);
}
}
}
的src /主/资源/ application.properties
spring.kafka.consumer.group-id=test_group
spring.kafka.consumer.auto-offset-reset=earliest
的build.gradle
buildscript {
repositories {
mavenCentral()
maven { url "https://plugins.gradle.org/m2/" }
}
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:2.0.0.RELEASE"
}
}
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
repositories {
mavenCentral()
}
dependencies {
compile 'org.springframework.kafka:spring-kafka'
compile 'org.springframework.boot:spring-boot-starter-json'
compile 'org.springframework.boot:spring-boot-starter-web'
compile 'org.springframework.boot:spring-boot-starter-actuator'
}
问题是没有解决方法(applicationRunner
bean)应用程序在初始化上下文后关闭。
所以问题是: 在我的情况下,防止春季情境关闭的正确方法是什么?
答案 0 :(得分:1)
SpringApplication.run(..)
会返回ApplicationContext
,您可以在其上调用close()
。因此,这里简单的答案是“不要那样做”。
为什么这是正确的?根据{{3}} Spring Boot,如果你使用SpringApplication
,它会自动注册一个关闭钩子来关闭上下文。因此,您不必担心像通常那样明确关闭上下文。