在上一个项目中,我遇到了类似的情况,面对愤怒的客户,我的代码崩溃后,我的好友和我添加了两个重要的安全措施:
- 在无限循环中,也要捕获错误,而不仅仅是异常。有时会发生异常情况,并且Java向您抛出错误,而不是Exception。
- 使用退避开关,因此,如果出现问题并且无法恢复,则不会急于启动另一个循环来升级情况。相反,您需要等到情况恢复正常后再重新开始。
例如,我们遇到一种情况,即数据库崩溃了,并且在循环期间抛出了SQLException。不幸的结果是代码再次经历了循环,仅再次遇到了相同的异常,依此类推。日志显示,我们在一秒钟内命中了相同的SQLException大约300次!!…这间歇性地发生了几次,偶尔的JVM暂停大约5秒钟,在此期间应用程序没有响应,直到最终抛出错误并且线程死亡!
因此,我们实施了一个退避策略,大致在下面的代码中显示,如果异常不可恢复(或被排除在几分钟之内恢复),那么我们将等待更长的时间才能恢复操作。
class Test1 implements Runnable { public void run() { boolean backoff = false; while(true) { if (backoff) { Thread.sleep (TIME_FOR_LONGER_BREAK); backoff = false; } System.out.println("I'm test class 1"); try { // do important stuff here, use database and other critical resources } catch (SqlException se) { // pre to delay the next loop backoff = true; } catch (Exception e) { } catch (Throwable t) { } } }}如果您以这种方式执行任务,那么使用checkTasks()方法创建第三个“看门狗”线程将毫无意义。此外,出于与我上面概述的相同原因,我会谨慎地再次与执行程序一起开始执行任务。首先,您需要了解任务失败的原因以及环境是否处于稳定状态,再次运行任务会很有用。



