Skip to content

恢复

策略解释
恢复继续把失败的任务干完

该模式是用在任务类型是多个任务项的情况下使用的,比如像Map这种很多任务项的情景下,还有就是工作流。作用就是跑其中失败的任务。集群任务就一个任务项,执行完后批次状态就变了,连触发任务都不能了,所以千万别在集群模式下选该策略。

继续把失败的任务干完,那可能你有疑问了。那超时的任务咋处理呢?所以这里我们验证两种情况:

  • 恢复策略中超时的任务

    不创建新的任务批次,等待任务完成。

  • 恢复策略中失败的任务

恢复策略中超时的任务

为了应用策略,前提就是要执行当前任务时,前一个任务还没有执行完成。我们如何来验证恢复策略把失败的任务继续干完呢?

  1. 客户端任务执行超过1分钟,而服务端触发是1分钟一次。这样保证了能应用策略。
  2. 不希望重试,所以可以把最大重试次数设置为0。
  3. 超时时间又不能太短。防止它中断线程。所以这里超时设置30分钟
  • 客户端代码

    java
    @Component
    public class TestStaticShardingRecovery extends AbstractJobExecutor {
        @Override
        protected ExecuteResult doJobExecute(JobArgs jobArgs) {
    
            // 最后一个分片参数时,客户端睡90秒
            if(jobArgs.getJobParams().toString().equals("20001,30000")) {
                try {
                    Thread.sleep(90000);
                    SnailJobLog.REMOTE.info("参数: {}睡眠90秒", jobArgs.getJobParams());
                } catch (InterruptedException e) {
                    return ExecuteResult.failure("任务执行失败.任务:"+jobArgs.getJobParams());
                }
            }
            return ExecuteResult.success("任务执行成功.任务:"+jobArgs.getJobParams());
        }
    }

    客户端代码仅仅对20001,30000这个批次休眠了90秒。其他两个分片任务应该是立刻执行成功。

  • 服务端分片任务配置

    配置项配置内容
    任务名称静态分片任务-恢复策略
    组名称service_plat
    状态启用
    任务类型静态分片
    执行器类型java
    执行器名称com.mayuanfei.test.TestStaticShardingRecovery
    方法参数分片参数 1 :1,10000
    分片参数 2 :10001,20000
    分片参数 3 :20001,30000
    阻塞策略恢复
    固定时间60秒
    最大重试次数0
    超时时间1800秒
    并行数3
  • 测试结果

    我们仅仅开一个8090端口的客户端进行测试,可以看到日志输出如下:

/sj_job_config_image/54.png/sj_job_config_image/54.png

恢复策略中失败的任务

要保证前一个任务还没有执行完成,还要有失败。

  • 客户端代码

    java
    @Component
    public class TestStaticShardingRecoveryFail extends AbstractJobExecutor {
        @Override
        protected ExecuteResult doJobExecute(JobArgs jobArgs) {
    
            // 第2个分片失败
            if(jobArgs.getJobParams().toString().equals("10001,20000")) {
                SnailJobLog.REMOTE.info("参数: {}失败", jobArgs.getJobParams());
                // 生成一个1到100的随机数,如果数值>50则返回失败;否则返回成功
                return ExecuteResult.failure("任务执行失败.任务:"+jobArgs.getJobParams());
    
            }
    
            // 最后一个分片参数时,客户端睡90秒
            if(jobArgs.getJobParams().toString().equals("20001,30000")) {
                try {
    
                    Thread.sleep(90000);
                    SnailJobLog.REMOTE.info("参数: {}睡眠90秒", jobArgs.getJobParams());
                } catch (InterruptedException e) {
                    return ExecuteResult.failure("任务执行失败.任务:"+jobArgs.getJobParams());
                }
            }
            return ExecuteResult.success("任务执行成功.任务:"+jobArgs.getJobParams());
        }
    }
  • 服务端分片任务配置

    配置项配置内容
    任务名称静态分片任务-恢复策略-失败
    组名称service_plat
    状态启用
    任务类型静态分片
    执行器类型java
    执行器名称com.mayuanfei.test.TestStaticShardingRecoveryFail
    方法参数分片参数 1 :1,10000
    分片参数 2 :10001,20000
    分片参数 3 :20001,30000
    阻塞策略恢复
    固定时间60秒
    最大重试次数0
    超时时间1800秒
    并行数3
  • 测试结果

/sj_job_config_image/40.png

当再次调度失败后,整个批次任务状态为处理失败:

/sj_job_config_image/40.png