scheduleWithFixedDelay



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);