public void checkResponseThread() {
logger.info("定时任务开始运行");
Runnable runnable = new Runnable() {
@Override
public void run() {
logger.info("定时任务持续运行中,dealTreeSet大小为:" + dealTreeSet.size());
Iterator<Graphic> iterator = dealTreeSet.iterator();
while (iterator.hasNext()) {
logger.info("监听集合中,是否有下一个元素:" + iterator.hasNext());
// Graphic对象
Graphic tempGraphic = iterator.next();
// 获取处理的时间
Date setTime = null;
try {
String dealTime = tempGraphic.getDealTime();
logger.info("dealTime为:" + dealTime);
setTime = DateUtils.parseDate(tempGraphic.getDealTime(), pattern);
// 处理的的时间 + 30秒
Date newDate = DateUtils.addSeconds(setTime, ModelClass.MAX_DEAL_TIME);
// 获取当前时间,精确到秒
Date currentDate = new Date();
// 比较时间大小(单位 年:1; 月:2; 日:5; 时:10; 分:12; 秒:13)
// a > b 返回 1; a < b 返回 -1 ; 相等返回 0
int compareResult = DateUtils.truncatedCompareTo(currentDate, newDate,
ModelClass.DATE_UNIT_SEC);
if (compareResult >= 0) {
// 说明时间已经大于等于30秒,把该数据从集合中删除,并放回任务分发队列重新执行
dataBeanList.add(tempGraphic);
dealTreeSet.remove(tempGraphic);
logger.warning(ModelClass.MAX_DEAL_TIME + "秒内未处理完成,重新放回阻塞队列,重新上传,重新处理的信息为【"
+ JSONObject.toJSONString(tempGraphic) + "】");
}
} catch (ParseException e) {
e.printStackTrace();
} **catch (Throwable t) {
t.printStackTrace();
}**
}
}
};
ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
ses.scheduleAtFixedRate(runnable, ModelClass.INITIAL_DELAY, ModelClass.PERIOD, TimeUnit.SECONDS);
}
如上代码,未满足进入 while 循环的条件之前,正常按周期执行,但是一旦进入 while 循环,运行一遍就会停止定时任务,后来查了资料,发现 ScheduledExecutorService 有个特性,就是当遇到异常时,就会停止后续执行,但是看控制台也没有抛出异常,因此试着手动抓取异常并抛出,即增加如上加粗字体部分,然后问停止运行的问题解决了,同时看到抛出异常,是 DateUtils.parseDate()方法解析时间时,传入的时间字符串为 null,再把该异常手动处理下~完美解决!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于