使用xxl-job开发的注意事项

一、避免超大log日志文件写入

在11.26日跑任务时发现,部分调度的日志文件不能够正常的显示出来,导致任务进度等状况没法直接监测。

这是在xxl-job日志文件丢失问题处理后刚上线第二天出现的,因此需要排查为什么还会出现日志无法访问的情况,并且是刚跑的任务,日志就无法访问了。
请添加图片描述

2021-11-26 06:01:01的调度记录,执行日志无法正常访问,如下图所示:
请添加图片描述

仍然是超时的问题,但是与以前不同,以前是netty直接建立连接就超时了,而这里是请求超时。

查看xxl-job请求执行器日志文件的代码,可以看到:
请添加图片描述
这里请求日志时,组装好请求的所有参数后,会调用作者自研的xxlRpc组件发起一个异步调用,然后等待结果返回,请添加图片描述
而这里也有设置 XxlRpcReferenceBean.this.timeout=1000L,也就是1秒钟的时间

像上面的 xxl-rpc, request timeout at:1638173657879 的报错就是一秒超时后从这里抛出来的,并没有netty相关的报错。

再将日志文件从线上拉下来,可以看到同一个任务能够访问的日志和不能访问的日志有一个明显的区别就是,不能访问的日志文件带了几个超长的json格式日志,如图所示
请添加图片描述
而这些日志能不能访问成功,仅仅是参数logid的问题,可能就是因为这个文件的json格式日志太大而导致的超时问题,将日志文件中的json格式日志删掉,留下其他的一部分,重新覆盖到线上文件,再次请求日志,访问成功。

二、为终止任务所需要做出的配合

依旧是在11.26日跑阿里离线任务时发现,2021-11-26 10:29:14 的调度日志,实际在中途就已经点了终止任务,但是在终止了任务之后,观察其执行日志显示他并没有终止下来,一直在执行下去。
请添加图片描述
请添加图片描述

任务是10:51点的终止的,但是一直到 11:24:43 才执行完毕,并没有按照我们的意愿终止下去。

xxl-job官方有给出终止任务所需要的注意的地方,不能在代码里将InterruptedException捕获掉,因为那将导致终止任务失败。

而xxl-job终止任务的原理就是调用thread.interrupt()来使该线程抛出一个中断异常来做的,如果内部将这个异消化了将不能成功的终止任务,官方给出的示例代码:
请添加图片描述
不仅如此,如果要再里面开启线程或者线程池来执行任务的话,依旧是要遵循这个逻辑。

因为不论是shutdown还是shutdownNow方法,都是通过调用thread.interrupt()方法来实现的,应该说是xxl-job终止任务的设计是仿照线程池shutdown的设计来实现的。

而thread.interrupt(),只有在sleep、wait、join或者其他声明了throws InterruptedException的方法上,才会抛出InterruptedException,所以在每一轮循环是要判断Thread.interrupt()来确定是否发生了中断请求的。

2.1 对于单线程执行任务的标准做法

    @XxlJob("demoJobHandler")
    public void demoJobHandler() throws InterruptedException {
   
        for (int i = 0; i < 10; i++) {
   
            try {
   
                doWork(i);
            } catch (Exception e) {
   
                if (e instanceof InterruptedException) {
   
                    XxlJobHelper.log(
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值