我的Java程序是从Windows脚本调用的。
是否可以使用Java退出代码来确定Java程序是否因为磁盘空间不足而过早终止,同时它仍在从JAR文件加载类文件?
我尝试了内存异常并返回退出代码1,但磁盘空间不足则返回退出代码0.这是正确的行为吗?
子类方法:
public int executeBatch() {
logger.info("executeBatch() - Send Email Alert Start");
try {
alertTransactionMgr.sendEmailAlert();
} catch (Exception e) {
throw new Exception(e);
}
logger.info("executeBatch() - Send Email Alert End");
return 0;
}
父方法:
public int execute() {
this.trx = createTransaction();
try {
returnCode = executeBatch();
} catch (Exception e) {
printLogErrorMsg("Job Failed caused by the Exception.", e);
returnCode = -1;
trx.setStatus("Failure");
updateBatchTransaction(trx);
}
return returnCode;
}
Windows批处理脚本
@echo off
set ERRLVL=0
java -cp %CLASSPATH% com.test.runner.MainBatchRunner
if not (%ERRORLEVEL%)==() (
set ERRLVL=%ERRORLEVEL%
)
echo Delete Files that are more than 30 old
forfiles /p "%BATCH_LOG_DIR%" /s /m %2*.log /d -%ARCHIVE_DAYS% /c "cmd /c echo del %BATCH_LOG_DIR%\@file"
forfiles /p "%BATCH_LOG_DIR%" /s /m %2*.log /d -%ARCHIVE_DAYS% /c "cmd /c del %BATCH_LOG_DIR%\@file"
echo Program exit %ERRLVL%
echo Program exit %ERRLVL% >> %BATCH_LOG_FILE%
exit /B %ERRLVL%
OutOfMemory的输出: [INFO] [2015-06-29 18:05:01,960] [org.springframework.context.support.ClassPathXmlApplicationContext] - 刷新org.springframework.context.support.ClassPathXmlApplicationContext@4b222f:显示名称[org.springframework.context.support .ClassPathXmlApplicationContext @ 4b222f];启动日期[Mon Jun 29 18:05:01 SGT 2015];上下文层次结构的根 [INFO] [2015-06-29 18:05:02,050] [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] - 从文件[D:\ batch \ dev \ batch_home \ bin \ spring \ applicationContext]加载XML bean定义-test.xml]
删除超过30岁的文件
del D:\ batch \ dev \ batch_home \ log \" TEST_20150629_173016.log" 程序退出1
磁盘空间不足的输出: [INFO] [2015-06-29 19:05:01,960] [org.springframework.context.support.ClassPathXmlApplicationContext] - 刷新org.springframework.context.support.ClassPathXmlApplicationContext@4b222f:显示名称[org.springframework.context.support .ClassPathXmlApplicationContext @ 4b222f];启动日期[Mon Jun 29 19:05:01 SGT 2015];上下文层次结构的根 [INFO] [2015-06-29 19:05:02,050] [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] - 从文件[D:\ batch \ dev \ batch_home \ bin \ spring \ applicationContext]加载XML bean定义-test.xml]
删除超过30岁的文件
del D:\ batch \ dev \ batch_home \ log \" TEST1_20150629_180030.log" 程序退出0
答案 0 :(得分:0)
您的批处理文件已损坏。 ERRORLEVEL从不是空的,它总是有一个数字,除非你做一些愚蠢的事情,比如把它设置成一个字符串。
@echo off
set ERRLVL=0
java -cp %CLASSPATH% com.test.runner.MainBatchRunner
@rem if not (%ERRORLEVEL%)==() (
@rem set ERRLVL=%ERRORLEVEL%
@rem)
if %ERRORLEVEL% != 0 set ERRLVL=%ERRORLEVEL%
echo Delete Files that are more than 30 old
forfiles /p "%BATCH_LOG_DIR%" /s /m %2*.log /d -%ARCHIVE_DAYS% /c "cmd /c echo del %BATCH_LOG_DIR%\@file"
forfiles /p "%BATCH_LOG_DIR%" /s /m %2*.log /d -%ARCHIVE_DAYS% /c "cmd /c del %BATCH_LOG_DIR%\@file"
echo Program exit %ERRLVL%
echo Program exit %ERRLVL% >> %BATCH_LOG_FILE%
exit /B %ERRLVL%
答案 1 :(得分:0)
我想知道为什么您的 Java 应用程序会因为磁盘空间已满而中断。您提到了 JVM 的启动,这或多或少是关于将文件读入 RAM。如果计算机已经大量交换,则此处涉及的唯一磁盘空间可能是虚拟内存 - 这将导致 OutOfMemoryException,但不会导致磁盘空间问题。
一旦您的应用程序加载完毕,它就可以检查文件系统根目录并决定剩余多少磁盘空间。如果还不够,它可以用 system.exit(int) 终止,并为操作系统或批处理文件提供您选择的有意义的退出代码。
0 表示应用程序运行正常 1-127 表示您定义的任何内容 128- 通常是操作系统错误,例如“找不到可执行文件”或“权限被拒绝”...