Skip to content

覆盖

策略解释
覆盖你别干了,我来干

新批次开始之前会尝试中断旧批次的线程,但是不一定能终止掉。这里可以理解成在新批次开始前,调用了一个旧批次任务线程池的shutDownNow方法

客户端代码

  • 无法中断的情况

    java
    @Slf4j
    @Component
    public class TestOverlayCanNotInterrupted extends AbstractJobExecutor {
        @Override
        protected ExecuteResult doJobExecute(JobArgs jobArgs) {
            log.info("{}开始执行任务", Thread.currentThread().getName());
            for(int i = 1; i <= 5; i++) {
                log.info("{}执行第{}次", Thread.currentThread().getName(), i);
                ThreadUtil.sleep(60, TimeUnit.SECONDS);
            }
            log.info("{}任务执行完成", Thread.currentThread().getName());
            return ExecuteResult.success();
        }
    }
  • 可以中断的情况

    java
    @Slf4j
    @Component
    public class TestOverlayCanInterrupted extends AbstractJobExecutor {
        @Override
        protected ExecuteResult doJobExecute(JobArgs jobArgs) {
            log.info("{}开始执行任务", Thread.currentThread().getName());
            int i = 1;
            while (!Thread.currentThread().isInterrupted()) {
                log.info("{}执行第{}次", Thread.currentThread().getName(), i);
                try {
                    Thread.sleep(60000);
                }catch (InterruptedException e) {
                    log.info("{}任务被中断", Thread.currentThread().getName());
                    break;
                }
                i++;
            }
            log.info("{}任务执行完成", Thread.currentThread().getName());
            return ExecuteResult.success();
        }
    }

页面配置

  • 无法中断的配置

    配置项配置内容
    任务名称测试阻塞策略-覆盖-无法中断
    执行器名称com.bjltd.test.TestOverlayCanNotInterrupted
    阻塞策略覆盖
    触发类型固定时间
    间隔时长60秒
    超时时间600秒
  • 可以中断的配置

    配置项配置内容
    任务名称测试阻塞策略-覆盖-可中断
    执行器名称com.bjltd.test.TestOverlayCanInterrupted
    阻塞策略覆盖
    触发类型固定时间
    间隔时长60秒
    超时时间600秒

测试结果

  • 无法中断的测试结果

    客户端日志信息:

    shell
    2024-09-24 11:19:51 [snail-netty-server-1] INFO  c.a.s.c.job.core.client.JobEndPoint
     - 批次:[1716] 任务调度成功. 
    2024-09-24 11:19:51 [snail-job-job-1,716-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,716-1开始执行任务
    2024-09-24 11:19:51 [snail-job-job-1,716-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,716-1执行第1次
    2024-09-24 11:20:01 [nioEventLoopGroup-2-1] INFO  c.a.s.c.c.l.report.ReportLogListener
     - Data report log successfully requestId:[6]
    2024-09-24 11:20:43 [snail-job-job-1,716-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,716-1执行第2次
    2024-09-24 11:20:43 [snail-job-job-1,716-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,716-1执行第3次
    2024-09-24 11:20:50 [snail-netty-server-3] INFO  c.a.s.c.job.core.client.JobEndPoint
     - 批次:[1717] 任务调度成功. 
    2024-09-24 11:20:50 [snail-job-job-1,717-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,717-1开始执行任务
    2024-09-24 11:20:50 [snail-job-job-1,717-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,717-1执行第1次
    2024-09-24 11:21:01 [nioEventLoopGroup-2-1] INFO  c.a.s.c.c.l.report.ReportLogListener
     - Data report log successfully requestId:[14]
    2024-09-24 11:21:43 [snail-job-job-1,717-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,717-1执行第2次
    2024-09-24 11:21:43 [snail-job-job-1,717-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,717-1执行第3次
    2024-09-24 11:21:43 [snail-job-job-1,716-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,716-1执行第4次
    2024-09-24 11:21:50 [snail-netty-server-5] INFO  c.a.s.c.job.core.client.JobEndPoint
     - 批次:[1718] 任务调度成功. 
    2024-09-24 11:21:50 [snail-job-job-1,718-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,718-1开始执行任务
    2024-09-24 11:21:50 [snail-job-job-1,718-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,718-1执行第1次
    2024-09-24 11:22:01 [nioEventLoopGroup-2-1] INFO  c.a.s.c.c.l.report.ReportLogListener
     - Data report log successfully requestId:[22]
    2024-09-24 11:22:43 [snail-job-job-1,717-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,717-1执行第4次
    2024-09-24 11:22:43 [snail-job-job-1,716-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,716-1执行第5次
    2024-09-24 11:22:43 [snail-job-job-1,718-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,718-1执行第2次
    2024-09-24 11:22:43 [snail-job-job-1,718-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,718-1执行第3次
    2024-09-24 11:22:50 [snail-netty-server-7] INFO  c.a.s.c.job.core.client.JobEndPoint
     - 批次:[1719] 任务调度成功. 
    2024-09-24 11:22:50 [snail-job-job-1,719-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,719-1开始执行任务
    2024-09-24 11:22:50 [snail-job-job-1,719-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,719-1执行第1次
    2024-09-24 11:23:01 [nioEventLoopGroup-2-1] INFO  c.a.s.c.c.l.report.ReportLogListener
     - Data report log successfully requestId:[30]
    2024-09-24 11:23:43 [snail-job-job-1,719-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,719-1执行第2次
    2024-09-24 11:23:43 [snail-job-job-1,719-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,719-1执行第3次
    2024-09-24 11:23:43 [snail-job-job-1,717-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,717-1执行第5次
    2024-09-24 11:23:43 [snail-job-job-1,716-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,716-1任务执行完成
    2024-09-24 11:23:43 [snail-job-job-1,718-1] INFO  c.b.t.TestOverlayCanNotInterrupted
     - snail-job-job-1,718-1执行第4次
    2024-09-24 11:23:50 [snail-netty-server-9] INFO  c.a.s.c.job.core.client.JobEndPoint
     - 批次:[1720] 任务调度成功.

    从日志打印可以看出,1716这个批次并没有被真正中断,还是会在后台持续的工作。

    任务批次列表中的显示

    image-20240920140948954
  • 可以中断的测试结果

    客户端日志信息:

    shell
    2024-09-24 15:04:41 [snail-netty-server-1] INFO  c.a.s.c.job.core.client.JobEndPoint
     - 批次:[1935] 任务调度成功. 
    2024-09-24 15:04:41 [snail-job-job-1,935-1] INFO  c.b.test.TestOverlayCanInterrupted
     - snail-job-job-1,935-1开始执行任务
    2024-09-24 15:04:41 [snail-job-job-1,935-1] INFO  c.b.test.TestOverlayCanInterrupted
     - snail-job-job-1,935-1执行第1次
    2024-09-24 15:04:51 [nioEventLoopGroup-2-1] INFO  c.a.s.c.c.l.report.ReportLogListener
     - Data report log successfully requestId:[4]
    2024-09-24 15:05:40 [snail-job-job-1,935-1] INFO  c.b.test.TestOverlayCanInterrupted
     - snail-job-job-1,935-1任务被中断
    2024-09-24 15:05:40 [snail-job-job-1,935-1] INFO  c.b.test.TestOverlayCanInterrupted
     - snail-job-job-1,935-1任务执行完成
    2024-09-24 15:05:41 [snail-netty-server-3] INFO  c.a.s.c.job.core.client.JobEndPoint
     - 批次:[1936] 任务调度成功. 
    2024-09-24 15:05:41 [snail-job-job-1,936-1] INFO  c.b.test.TestOverlayCanInterrupted
     - snail-job-job-1,936-1开始执行任务
    2024-09-24 15:05:41 [snail-job-job-1,936-1] INFO  c.b.test.TestOverlayCanInterrupted
     - snail-job-job-1,936-1执行第1次
    2024-09-24 15:05:52 [nioEventLoopGroup-2-1] INFO  c.a.s.c.c.l.report.ReportLogListener
     - Data report log successfully requestId:[12]
    2024-09-24 15:06:40 [snail-job-job-1,936-1] INFO  c.b.test.TestOverlayCanInterrupted
     - snail-job-job-1,936-1任务被中断
    2024-09-24 15:06:40 [snail-job-job-1,936-1] INFO  c.b.test.TestOverlayCanInterrupted
     - snail-job-job-1,936-1任务执行完成
    2024-09-24 15:06:40 [snail-netty-server-5] INFO  c.a.s.c.job.core.client.JobEndPoint
     - 批次:[1937] 任务调度成功. 
    2024-09-24 15:06:40 [snail-job-job-1,937-1] INFO  c.b.test.TestOverlayCanInterrupted
     - snail-job-job-1,937-1开始执行任务
    2024-09-24 15:06:40 [snail-job-job-1,937-1] INFO  c.b.test.TestOverlayCanInterrupted
     - snail-job-job-1,937-1执行第1次
    2024-09-24 15:06:51 [nioEventLoopGroup-2-1] INFO  c.a.s.c.c.l.report.ReportLogListener
     - Data report log successfully requestId:[20]
    2024-09-24 15:07:40 [snail-job-job-1,937-1] INFO  c.b.test.TestOverlayCanInterrupted
     - snail-job-job-1,937-1任务被中断
    2024-09-24 15:07:40 [snail-job-job-1,937-1] INFO  c.b.test.TestOverlayCanInterrupted
     - snail-job-job-1,937-1任务执行完成

    从日志输出能看出来,每个批次的任务都会被后面的新批次任务给停止。

    任务批次列表中的显示

    image-20240920140948954

测试总结

  • 新批次任务会停止上个批次任务,但是不保证一定停止成功。
  • 如果想让任务拥有被中断的能力,那么需要在写任务代码时,自己处理。比如本例通用循环判断当前线程是不是被中断。如果你的任务本身不具备这种能力。基本相当于下面将要验证的并行效果一样了。