【发布时间】:2014-02-26 16:58:16
【问题描述】:
我们有一个通过 Shell 脚本实用程序触发的 Java 作业。这计划定期运行。
现在,shell 脚本需要一个退出代码,以防作业失败,以便触发其他警报点。因此,我们的主类中有 System.exit(STATUS_CODE),当发生任何异常时,它会在 catch 块中调用。主要方法如下所示。我们正在使用 Spring。我们还在 Logger 中配置了 smtp,以便所有 ERROR 级别的日志都通过电子邮件发送。现在,我们注意到 System.exit 在退出 JVM 时突然停止了记录器和其他线程。因此,我们添加了一个 Thread.sleep(10000) 以在调用 System.exit 之前完成任何日志记录。
这是从 java 向脚本发送 ERROR 状态代码的最佳方式吗?我们可以在不使用 System.exit 调用的情况下发送状态吗?需要 System.exit 时有什么最佳实践或建议(shudownhook…)? Spring 中的任何替代方法可以在 DI 容器退出时发送错误代码?
private static Logger LOG = LoggerFactory.getLogger(Application.class);
public static void main(final String[] args) throws InterruptedException {
LOG.info("Starting Timeout Service...");
try {
final AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
final SomeBean somebean = ctx.getBean(SomeBean.class);
somebean.doSomething();
} catch (final Exception exception) {
LOG.error(exception.getMessage(), exception);
waitForLogToProcessAndExit();
}
LOG.info("Timeout Service Completed");
}
private static void waitForLogToProcessAndExit() throws InterruptedException {
Thread.sleep(10000); //Waiting for any logging to complete before firing System.exit
System.exit(1);
}
【问题讨论】:
-
我猜你可以使用 finally 块
-
对不起。为什么不通过 CommandLineJobRunner.class 进行春季批处理。它已经实现了带有退出代码的命令执行器。