-
背景
-
解决方式
-
自定义AOP异常切面
-
AOP实现的缺点
-
硬核修改源码
背景
线上的xxl-job
时常有定时任务执行失败,但是我们这边时常没有感知到,只有当业务方过来告诉我们的时候我们才能后知后觉,非常的不及时。所以希望xxl-job
能有一个合适的监控方式。其实开源版本的xxl-job
是有提供邮件报警的
但是遗憾的是团队的开发大多不会及时看邮件。我们更希望有像微信、钉钉、飞书这种直接群报警这种通知,所以就需要自己扩展了
解决方式
我们团队使用的主要还是飞书工具所以,想通过发送飞书消息来监控。
自定义AOP异常切面
这里最先想到的也是最简单的实现方式就是通过AOP去拦截注解XxlJob
这里我们自定义一个XxlJobHandlerMonitor
@Aspect
@Component
public class XxlJobHandlerMonitor {
@Autowired
FeishuRobot feishuRobot;
@Pointcut("@annotation(com.xxl.job.core.handler.annotation.XxlJob)")
public void cut() {
}
@AfterThrowing(pointcut = "cut() && @annotation(xxlJob)", throwing="e")
public void around(Throwable e, XxlJob xxlJob) {
String errorMessage = String.format("xxl-job任务执行失败,任务名: %s,错误信息: %s", xxlJob.value(), e.getMessage());
feishuRobot.sendText(errorMessage, FeishuRobot.FeishuWebhookEnum.XXL_JOB);
}
}
可以看到核心代码非常简单,短短几行就ok了。
FeishuRobot
是发送飞书通知的类 异常信息这里只是简单的打印了一下,更多异常信息可以去xxl-job
控制层去查看,都是比较详细的,所以这里的异常信息就只用了e.getMessage()
AOP实现的缺点
-
优点
-
实现方式简单快捷
-
缺点
-
如果是执行器(应用程序)重启,调度器调度失败这种失败的任务是监控不到的
硬核修改源码
如果我们去看源码,其实发现他的报警模块是提供了接口给我们扩展的,我们直接看xxl-job-admin
源码的这里就可以看到他的报警代码其中private List<JobAlarm> jobAlarmList;
是一个list,有一个默认的实现类
-
JobAlarm
public interface JobAlarm {
public boolean doAlarm(XxlJobInfo info, XxlJobLog jobLog);
}
-
EmailJobAlarm
@Component
public class EmailJobAlarm implements JobAlarm {
}
所以我们要添加飞书通知也非常简单,直接实现JobAlarm
接口,然后丢到spring
容器中即可,大致代码如下
/**
* @author : wh
* @date : 2022/5/12 22:54
* @description:
*/
@Component
public class FeiShuJobAlarm implements JobAlarm {
@Override
public boolean doAlarm(XxlJobInfo info, XxlJobLog jobLog) {
return false;
}
}
这里面发送飞书消息就OK了。这里我就不实现了
改完代码重新部署xxl-job-admin
就可以了。
需要注意的是修改源码方式的部署方式后续的版本升级可能存在代码冲突问题,不过xxl-job
现在也不怎么维护了。倒也不是特别担心这个问题
原文始发于微信公众号(小奏技术):简单聊聊xxl-job自定义监控这件小事
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/29933.html