我有一个带有main函数的简单Java类。我用命令行'命令'运行这个类。在bat文件中存在,我已安排bat文件每2小时运行一次。
这个.class使用了一些资源,这些资源在请求时有些时间不可用,并且由于超时,.class异常终止。
我想要的是如果蝙蝠异常终止是否有办法检查它并再次运行直到它正常运行。
其次如果bat终止异常,是否有办法回滚此类.class在终止之前执行的操作。让我们说它正在更新文本文件中的一些文本。有没有办法将它回滚。
答案 0 :(得分:3)
导致异常终止的原因有很多。
你可以在这里采用一种启发式方法:
OutOfMemoryError
等异常情况;通过上述声明中的“例外”理解,它是“Throwable
的任何实例”; Error
是Throwable
的子类,OutOfMemoryError
是Error
的子类; System.exit()
并确保错误代码不是1 ,因为上述情况。其次如果bat终止异常,是否有办法回滚此类.class在终止之前执行的操作。让我们说它正在更新文本文件中的一些文本。有没有办法将它推回去。
没有通用的方式;这真的取决于你的程序本身。如果你在谈论文件I / O,那么存在几种范例来确保文件的原始内容不会被破坏,至少就编程语言本身而言;更严重的损坏情况被委托给文件系统本身。
关于退出代码的附注...至少在Unix系统中,您应该警惕实际上“有效”退出代码的范围是0到127;是的,那是7位。第8位用于表示进程终止是由信号引起的,在这种情况下,低7位将被解释(理解,“读取”)为触发程序终止的信号编号。
答案 1 :(得分:1)
如果你想让.bat连续运行,直到崩溃后它正常运行,你可以通过创建一个Windows服务来实现这一点。创建Windows服务时,您可以指定崩溃后发生的情况,再次运行脚本之前等待的时间,以及尝试再次运行脚本的次数。
就恢复脚本对文本文件所做的工作而言,有多种解决方案:
让您的脚本制作文件的副本,您可以将其重命名为original_new,并操纵新副本。在脚本的末尾,您可以删除原始文件,并通过将original_new更改为original来将其替换为副本。如果程序崩溃,您将有两个文件,因此在脚本的开头,检查original_new是否已经存在,如果已存在,则删除它然后复制原始文件。
您可以保留脚本执行的所有操作的记录日志,并在脚本启动时检查日志,如果日志不完整,则脚本首先还原任何日志,直到它到达最后一个完整的标志然后运行脚本的实际内容。
答案 2 :(得分:1)
这听起来像是因为java类作业失败而失败了。如果可以在批处理文件中检测到java作业失败,那么您应该可以从那里执行所需的一切。
首先,要确认java作业引发批处理标识的错误,请在运行java类作业的行之后添加以下内容并对其进行测试。您应该看到errorlevel 0成功,> 0,错误:
REM THIS IS LINE THAT RUNS JAVA JOB
echo errorlevel is "%errorlevel%
pause
假设上面的内容返回准确的退出信息,这里有一些代码可以实现其他答案并重新运行java作业。
要继续重新编写java作业直到它成功运行,请添加标签和goto语句:
REM Add following label to a line before the java class job
:runhere
REM THIS IS LINE THAT RUNS JAVA JOB
rem Check errorlevel and retry if failure
If not %errorlevel%==0 goto runhere
Exit
要将作业重新进行n次,然后即使尚未成功退出,也要创建备份文件,如@niebloomj建议并设置计数器。这会尝试运行10次。
set COPYCMD=/Y
set Outputfile=path\file.ext
set Outputbak=path\file_bak.ext
copy "%Outputfile%" "%Outputbak%"
Set /a count=0
:runhere
REM THIS IS LINE THAT RUNS JAVA JOB
If %errorlevel%==0 (
:: now have new good output file
del "%Outputbak%"
exit
)
rem Check count and retry
If %count% LSS 10 (
set /a count+=1
goto runhere
)
rem When count = the "check" number above, replace old file and quit
copy "%Outputbak%" "%Outputfile%"
del "%Outputbak%"
echo Java job failed after retries. "%Outputfile%" not updated.
pause
Exit