ExitCodeGenerator和System.exit(0)之间的区别

时间:2018-02-01 22:12:12

标签: spring spring-boot exit-code

我最近了解到关闭Spring Boot应用程序的正确方法是:

public class Application {

    @Bean
    public ExitCodeGenerator exitCodeGenerator() {
        return new ExitCodeGenerator() {
            @Override
            public int getExitCode() {
                return 0;
            }
        };
    }

    public static void main(String[] args) throws Exception {
        System.exit(SpringApplication.exit(SpringApplication.run(Application.class, args)));
    }
}

这应返回退出代码0,或者我将其配置为在getExitCode()方法中返回的任何内容。我的问题是 - 做上面的方法与下面的方法有什么区别:

public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
        System.exit(0);
    }
}

两种方法似乎都以完全相同的方式关闭应用程序,至少在控制台中是这样。那有什么区别?

2 个答案:

答案 0 :(得分:0)

如果您希望在调用SpringApplication.exit()时返回特定的退出代码,则使用ExitCodeGenerator。然后可以将此退出代码传递给System.exit()以将其作为状态代码返回。

例如:

@SpringBootApplication
public class ExitCodeApplication {

@Bean
public ExitCodeGenerator exitCodeGenerator() {
    return new ExitCodeGenerator() {
        @Override
        public int getExitCode() {
            return 42;
        }
    };
}

public static void main(String[] args) {
    System.exit(SpringApplication
            .exit(SpringApplication.run(ExitCodeApplication.class, args)));
}

}

此外,ExitCodeGenerator接口可以通过异常实现。遇到这种异常时,Spring Boot将返回实现的getExitCode()方法提供的退出代码。

答案 1 :(得分:0)

当然,对于您的示例,这无关紧要。但是,这允许将某些异常“粘合”到某个退出代码。默认情况下,Spring会捕获您的代码可能引发的所有异常-如果此类异常也实现了ExitCodeGenerator-将用于输出您提供的退出代码。

当然,您可以手动进行映射,但是很多更加冗长且难以维护。春天使这变得容易。理解之后,您可能会对ExitCodeExceptionMapper感兴趣,该{@ 1}}可以将基础Exception(假设有多个错误消息)映射到不同错误代码。