首页 > 解决方案 > Spring Boot 控制应用程序的启动

问题描述

如何根据配置服务器以编程方式控制应用程序的启动?我有用于控制 docker-compose up 的 sh 脚本,但我想知道我可以在 spring 应用程序中以编程方式控制它。

问候

标签: spring-bootspring-config

解决方案


如果您使用的是 Ubuntu,那么以下解决方案将完美无缺。如果您使用的是不同的发行版并且ps -A无法正常工作,请找到等效的发行版。现在,在下面谈论它是如何完成的策略。我希望我的应用程序由脚本启动,因为它包含一些 JVM 参数。因此,当我的应用程序运行时,脚本也将在活动进程列表中。启动完成后,应用程序会查找我的脚本文件是否存在于活动进程列表中。如果它不存在,那么它将关闭应用程序。以下示例可能会让您了解如何使用配置服务器实现相同的功能。

@Autowired
private ApplicationContext context;

@EventListener(ApplicationReadyEvent.class) // use in production
public void initiateStartup() {

    try {
        String shProcessName = "root-IDEA.sh";
        String line;
        boolean undesiredStart = true;

        Process p = Runtime.getRuntime().exec("ps -A");
        InputStream inputStream = p.getInputStream();
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

        while ((line = bufferedReader.readLine()) != null) {

            if (line.contains(shProcessName)) {
                undesiredStart = false;
                break;
            }
        }

        bufferedReader.close();
        inputStreamReader.close();
        inputStream.close();

        if (undesiredStart) {
            System.out.println("--------------------------------------------------------------------");
            System.out.println("APPLICATION STARTED USING A DIFFERENT CONFIG. PLEASE START USING THE '.sh' FILE.");
            System.out.println("CLOSING APPLICATION");
            System.out.println("--------------------------------------------------------------------");

            // close the application
            int exitCode = SpringApplication.exit(context, (ExitCodeGenerator) () -> 0);
            System.exit(exitCode);
        }

        System.out.println("APPLICATION STARTED CORRECTLY");

    } catch (IOException e) {
        e.printStackTrace();
    }
}

推荐阅读