可以使用Java程序的退出代码来检测磁盘空间异常吗?

时间:2015-07-13 06:39:29

标签: java batch-file

我的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

2 个答案:

答案 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- 通常是操作系统错误,例如“找不到可执行文件”或“权限被拒绝”...