简单聊聊xxl-job自定义监控这件小事

这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党

背景

线上的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实现的缺点

  • 优点
  1. 实现方式简单快捷
  • 缺点
  1. 如果是执行器(应用程序)重启,调度器调度失败这种失败的任务是监控不到的

硬核修改源码

如果我们去看源码,其实发现他的报警模块是提供了接口给我们扩展的,我们直接看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现在也不怎么维护了。倒也不是特别担心这个问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值