初始化上下文后,防止Spring关闭上下文

时间:2018-04-03 09:39:26

标签: spring spring-boot spring-kafka

我正在尝试使用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)应用程序在初始化上下文后关闭。

所以问题是: 在我的情况下,防止春季情境关闭的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

SpringApplication.run(..)会返回ApplicationContext,您可以在其上调用close()。因此,这里简单的答案是“不要那样做”。

为什么这是正确的?根据{{​​3}} Spring Boot,如果你使用SpringApplication,它会自动注册一个关闭钩子来关闭上下文。因此,您不必担心像通常那样明确关闭上下文。