在调度中心启动的时候会启动一个守护线程去监听任务调度失败的日志
2.1 失败重试
我们继续往下看是如何进行失败重试的
可以看到它首先会加载所有调度失败的任务日志id,然后遍历,其中若失败重试次数大于0,会去重新进行调度。
重试次数是在新增任务时进行设置的:
重试时我们会看到 log.getExecutorFailRetryCount()-1 这个参数。这是重试时若调度失败,会一直进行重试直到重试次数小于0,这样就完成了调度失败重试的功能
2.2 邮件告警
继续往下看邮件告警的功能
可以看到若你配置了邮件的发送者和接受者就能进行邮件告警了,支持多个邮件接受者。发送者的配置如下:
接受者在新增任务时可以配置:
邮件告警完成后,会将告警的结果更新到调度日志中,这样就完成了邮件告警的功能
3. 执行器执行任务超时或异常如何处理?
3.1 执行器执行任务超时处理机制
由上文可知,调度任务最后会放进 triggerQueue 触发队列,交给 JobThread 线程处理:
继续看 JobThread 是如何处理的:
线程中会从 triggerQueue 取出任务处理,若在新增任务时设置了超时时间大于0:
则在任务执行的时候会采用 FutureTask 在超时时间内异步获取执行结果,若获取结果超时会抛出TimeoutException
,然后给 executeResult 赋值为一个执行超时的结果,最后中断异步获取执行结果的 futureThread 线程。
3.2 任务执行抛出异常
上图知道,任务 handler.execute 执行时,若抛出异常会赋值一个失败的结果给 executeResult
3.3 执行结果的回调处理
继续看任务执行完后,finally 中的处理:
这里会将执行结果以及相关的参数放进 callBackQueue 回调队列中,回调队列会在执行器启动的时候启动一个守护线程消费处理:
继续往下看,回调线程是如何处理的:
这里会从 callBackQueue 回调队列中批量取出任务进行处理,继续往下看:
这里会去执行 adminBiz.callback 方法,我们看一下 adminBiz的初始化过程:
看到上图中的 getObject 方法中我们就懂了(ps : 不懂的,可以去看我的上篇 xxl-job 源码运行解析),这又是一次rpc请求,不同的是这次是 执行器 → 调度器 发送的请求,所以 adminBiz.callback 会去执行 调度中心里面的 AdminBizImpl 的 callback方法 :
最后总结
搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析
最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化
Impl 的 callback方法 :
最后总结
搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析
最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化
[外链图片转存中…(img-4C3uxEQO-1714753167040)]