栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

适用于应永久运行的任务的Java Executor最佳实践

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

适用于应永久运行的任务的Java Executor最佳实践

在上一个项目中,我遇到了类似的情况,面对愤怒的客户,我的代码崩溃后,我的好友和我添加了两个重要的安全措施:

  1. 在无限循环中,也要捕获错误,而不仅仅是异常。有时会发生异常情况,并且Java向您抛出错误,而不是Exception。
  2. 使用退避开关,因此,如果出现问题并且无法恢复,则不会急于启动另一个循环来升级情况。相反,您需要等到情况恢复正常后再重新开始。

例如,我们遇到一种情况,即数据库崩溃了,并且在循环期间抛出了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()方法创建第三个“看门狗”线程将毫无意义。此外,出于与我上面概述的相同原因,我会谨慎地再次与执行程序一起开始执行任务。首先,您需要了解任务失败的原因以及环境是否处于稳定状态,再次运行任务会很有用。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/419326.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号