我們有一個通過Shell腳本實用程序觸發的Java作業。這是定期運行的。System.exit(STATUS_CODE)的任何替代方法或有關從Java返回錯誤代碼的最佳做法
現在,shell腳本需要一個退出代碼,以防作業失敗,從而觸發其他報警點。所以,我們的主類中有System.exit(STATUS_CODE),當發生任何異常時,在catch塊中調用它。主要方法如下所示。我們正在使用Spring。我們還在記錄器中配置了smtp,以便通過電子郵件發送所有ERROR級別日誌。現在,我們注意到System.exit在退出JVM時突然停止記錄器和其他線程。所以,我們在調用System.exit之前爲任何日誌記錄添加了一個Thread.sleep(10000)。
這是發送錯誤狀態碼到java腳本的最佳方式嗎?我們可以在不使用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進行批處理?它已經使用退出代碼實現了命令執行程序。 –