scheduleWithFixedDelay
发现在奇怪的错误,用ScheduledExecutorService.scheduleWithFixedDelay部署了一个定时任务,定时去表里面扫描任务。
数据库因为网络问题断了一次,之后发现定时任务不再定时执行了。
经过查证ScheduledExecutorService.scheduleWithFixedDelay的API如下:
创建并执行一个在给定初始延迟后首次启用的定期操作,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟。
如果任务的任一执行遇到异常,就会取消后续执行。否则,只能通过执行程序的取消或终止方法来终止该任务。
总结:在进行线程处理时对于线程体中代码最全部进行异常捕获处理。则否出现在一些预料不到的问题,也不好查。
出错代码:
ScheduledExecutorService scheduler = Executors
.newScheduledThreadPool(1);
scheduler.scheduleWithFixedDelay(new Runnable() {
public void run() {
EmailSetup emailSetup = emailService.getEmailSetup();
List<TaskRunningEmail> list = new ArrayList<TaskRunningEmail>();
if (EmailTaskConst.ISOPEN.equals(emailSetup.getIs_closed())) {
list = emailService.startTaskRunningEmail();
}else {
log.error(“邮件服务起已关闭,请用其他方式发送或检测服务器!”);
}
if (list.isEmpty()) {
return;
}
for (TaskRunningEmail taskRunningEmail : list) {
try {
semaphore.acquire(); // 获得信号量
queue.put(taskRunningEmail);
} catch (Exception e) {
log.error(“邮件发送任务放入队列发生异常”, e);
}
}
}
}, 0, getSleepTime(), MILLISECONDS);
修改后代码:
ScheduledExecutorService scheduler = Executors
.newScheduledThreadPool(1);
scheduler.scheduleWithFixedDelay(new Runnable() {
public void run() {
try {
EmailSetup emailSetup = emailService.getEmailSetup();
List<TaskRunningEmail> list = new ArrayList<TaskRunningEmail>();
if (EmailTaskConst.ISOPEN.equals(emailSetup.getIs_closed())) {
list = emailService.startTaskRunningEmail();
} else {
log.error(“邮件服务起已关闭,请用其他方式发送或检测服务器!”);
}
if (list.isEmpty()) {
return;
}
for (TaskRunningEmail taskRunningEmail : list) {
semaphore.acquire(); // 获得信号量
queue.put(taskRunningEmail);
}
} catch (Exception e) {
log.error(“邮件发送任务放入队列发生异常”, e);
}
}
}, 0, getSleepTime(), MILLISECONDS);