mirror of
https://github.com/spring-projects/spring-boot.git
synced 2024-08-29 03:06:45 +08:00
Polish calling of ExitCodeGenerators
This commit is contained in:
parent
589ef1868d
commit
44947b13a8
@ -579,46 +579,56 @@ public class SpringApplication {
|
||||
/**
|
||||
* Static helper that can be used to exit a {@link SpringApplication} and obtain a
|
||||
* code indicating success (0) or otherwise. Does not throw exceptions but should
|
||||
* print stack traces of any encountered.
|
||||
* print stack traces of any encountered. Applies the specified
|
||||
* {@link ExitCodeGenerator} in addition to any Spring beans that implement
|
||||
* {@link ExitCodeGenerator}. In the case of multiple exit codes the highest value
|
||||
* will be used (or if all values are negative, the lowest value will be used)
|
||||
* @param context the context to close if possible
|
||||
* @param exitCodeGenerators exist code generators
|
||||
* @return the outcome (0 if successful)
|
||||
*/
|
||||
public static int exit(ApplicationContext context,
|
||||
ExitCodeGenerator... exitCodeGenerators) {
|
||||
|
||||
int code = 0;
|
||||
|
||||
List<ExitCodeGenerator> exiters = new ArrayList<ExitCodeGenerator>(
|
||||
Arrays.asList(exitCodeGenerators));
|
||||
|
||||
int exitCode = 0;
|
||||
try {
|
||||
|
||||
exiters.addAll(context.getBeansOfType(ExitCodeGenerator.class).values());
|
||||
|
||||
for (ExitCodeGenerator exiter : exiters) {
|
||||
try {
|
||||
int value = exiter.getExitCode();
|
||||
if (value > code || value < 0 && value < code) {
|
||||
code = value;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
code = code == 0 ? 1 : code;
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
if (context instanceof ConfigurableApplicationContext) {
|
||||
ConfigurableApplicationContext closable = (ConfigurableApplicationContext) context;
|
||||
closable.close();
|
||||
try {
|
||||
List<ExitCodeGenerator> generators = new ArrayList<ExitCodeGenerator>();
|
||||
generators.addAll(Arrays.asList(exitCodeGenerators));
|
||||
generators.addAll(context.getBeansOfType(ExitCodeGenerator.class)
|
||||
.values());
|
||||
exitCode = getExitCode(generators);
|
||||
} finally {
|
||||
close(context);
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
code = code == 0 ? 1 : code;
|
||||
e.printStackTrace();
|
||||
exitCode = (exitCode == 0 ? 1 : exitCode);
|
||||
}
|
||||
return exitCode;
|
||||
}
|
||||
|
||||
return code;
|
||||
private static int getExitCode(List<ExitCodeGenerator> exitCodeGenerators) {
|
||||
int exitCode = 0;
|
||||
for (ExitCodeGenerator exitCodeGenerator : exitCodeGenerators) {
|
||||
try {
|
||||
int value = exitCodeGenerator.getExitCode();
|
||||
if (value > 0 && value > exitCode || value < 0 && value < exitCode) {
|
||||
exitCode = value;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
exitCode = (exitCode == 0 ? 1 : exitCode);
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return exitCode;
|
||||
}
|
||||
|
||||
private static void close(ApplicationContext context) {
|
||||
if (context instanceof ConfigurableApplicationContext) {
|
||||
ConfigurableApplicationContext closable = (ConfigurableApplicationContext) context;
|
||||
closable.close();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user