高可用作为考究系统的一项重要指标,如何做到系统的高可用,谈及一个系统,这个话题就难以越过。Quartz作为目前调度框架的一个流行组件,如何保证Quartz的高可用,任务调度失败后,如何进行重试,这个也是一个值得关注的问题。
网上看过许多涉及定时调度的开源项目,但发现其都存在一个问题,并未对任务调度的失败做处理,仅仅只是简单的日志记录,以及手工重采。但是现实情况中,往往可能因为间歇性原因导致调度的失败,可能重新调度一下就可以成功,那么这时失败重试就尤为重要。
找过网上关于Quartz失败后如何实现重试。倒是找到过集中方式。
- 引入第三方jar包,spring-retry。可以通过注解的方式或者集成对应的类,重写对应的方法。个人观点。又引入第三方jar,感觉不太理性。同时感觉过于复杂,有的业务需求不太好控制。
- 在Quartz里面抛异常时,自己用线程类睡多长时间后,进行再次调用。这种存在很大缺点。线程一直阻塞,不太优雅。当然可以用线程池的方式来进行实现,这种我没尝试过。
- Quartz抛异常时,获取失败的job,设置启动时间,策略执行一次,这种方式,个人觉得最好,够优雅
下面简单介绍一下这种方式,直接贴源码:
public abstract class AbstractQuartzJob implements Job
{
private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class);
@Override
public void execute(JobExecutionContext context) {
ParamMap<String, Object> sysJob = (ParamMap<String, Object>) context.getMergedJobDataMap().get(Sch