3.snail-job广播任务

703 阅读2分钟

前言

上一节《2.snail-job集群定时任务》中,已经对我们最常用的集群定时任务做了一个比较深入的了解。包括配置项的含义。本节主要讲述广播任务,该任务类型有两大特点:

  • 所有客户端节点都执行完成,该任务才算完成
  • 任意一个客户端节点执行任务失败,该任务算失败

广播这种任务类型,很典型的一个应用场景就是所有客户端都执行某个脚本:比如清理集群日志、同步所有客户端系统时间等。

本节目标

  • 客户端java代码模拟收集日志信息,概率出现失败。
  • 验证每个客户端节点均被调用。
  • 验证所有客户端均成功,该广播任务才算成功。

客户端代码

@Slf4j
@Component
public class TestBroadcastJob extends AbstractJobExecutor {
​
    @Value("${snail-job.port}")
    private int clientPort;
​
    @Override
    protected ExecuteResult doJobExecute(JobArgs jobArgs) {
        int randomInt = RandomUtil.randomInt(100);
        log.info("随机数: {}", randomInt);
        SnailJobLog.REMOTE.info("随机数: {},客户端端口:{}", randomInt, clientPort);
        if(randomInt<50) {
            throw new RuntimeException("随机数小于50,收集日志任务执行失败");
        }
        // 获得jobArgs 中传入的相加的两个数
        return ExecuteResult.success("随机数大于50,收集日志任务执行成功");
    }
}

本机两个客户端启动

上面的客户端代码,由于要在本机运行两次。所以需要指定客户端的端口,用于区分不同的客户端。

web端口snail-job的客户端端口
80891789
80901790

1.web端口设置

image-20241004205325492

这里增加JVM的运行参数:-Dserver.port=8089。这个JVM参数是通过如下操作而出现:

image-20241004205854930

2.snail-job的客户端端口配置

修改application.yml的snail-job.port端口。8089对应的是1789,8090对应的1790

3.在线机器中查看

image-20241004210823557

可以看到两个客户端已经正常启动了。

服务端配置广播任务

配置项配置内容
任务名称测试广播任务
组名称service_plat
状态禁用
任务类型广播
执行器类型java
执行器名称com.mayuanfei.test.TestBroadcastJob
路由策略轮询
阻塞策略丢弃
最大重试次数0

说明:

  • 任务类型:广播

    所有客户端节点均执行同一个任务

  • 路由策略:轮询

    这里的轮询表示,客户端会一个接一个的执行任务

  • 最大重试次数:0

    为了验证所有客户端均成功,该广播任务才算成功。所以这次避免错误重试机制

  • 状态:禁用

    使用手动方式,执行广播任务

进行测试

1.手动执行广播任务

依次点击定时任务列表中,测试广播任务后的执行->确认按钮,手动触发广播任务。

image-20241004231134975

2.客户端输出

  • 8089端口客户端

    2024-10-04 23:06:28 [snail-netty-server-3] INFO  c.a.s.c.job.core.client.JobEndPoint
     - 批次:[2330] 任务调度成功. 
    2024-10-04 23:06:28 [snail-job-job-2,330-1] INFO  com.mayuanfei.test.TestBroadcastJob
     - 随机数: 68
    2024-10-04 23:06:28 [snail-job-job-2,330-1] INFO  com.mayuanfei.test.TestBroadcastJob
     - 随机数: 68,客户端端口:1789
    2024-10-04 23:06:28 [snail-job-job-2,330-1] INFO  c.a.s.c.j.c.e.JobExecutorFutureCallback
     - 任务执行成功 taskBatchId:[2330] [{"status":1,"result":"随机数大于50,收集日志任务执行成功","message":"任务执行成功"}]
    2024-10-04 23:06:38 [nioEventLoopGroup-2-4] INFO  c.a.s.c.c.l.report.ReportLogListener
     - Data report log successfully requestId:[847]
    
  • 8090端口客户端

    2024-10-04 23:06:28 [snail-netty-server-3] INFO  c.a.s.c.job.core.client.JobEndPoint
     - 批次:[2330] 任务调度成功. 
    2024-10-04 23:06:28 [snail-job-job-2,330-1] INFO  com.mayuanfei.test.TestBroadcastJob
     - 随机数: 12
    2024-10-04 23:06:28 [snail-job-job-2,330-1] INFO  com.mayuanfei.test.TestBroadcastJob
     - 随机数: 12,客户端端口:1790
    2024-10-04 23:06:28 [snail-job-job-2,330-1] ERROR c.a.s.c.j.c.e.JobExecutorFutureCallback
     - 任务执行失败 taskBatchId:[2330]
    java.lang.RuntimeException: 随机数小于50,收集日志任务执行失败
        at com.mayuanfei.test.TestBroadcastJob.doJobExecute(TestBroadcastJob.java:31)
        at com.aizuda.snailjob.client.job.core.executor.AbstractJobExecutor.lambda$jobExecute$0(AbstractJobExecutor.java:81)
        at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:131)
        at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:75)
        at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:82)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
        at java.base/java.lang.Thread.run(Thread.java:1583)
    2024-10-04 23:06:39 [nioEventLoopGroup-2-4] INFO  c.a.s.c.c.l.report.ReportLogListener
     - Data report log successfully requestId:[846]

3.执行批次日志

  • 任务状态是处理失败

    image-20241004231650829

  • 日志中的详细信息

    image-20241004231814130

  • 查看日志信息

    • id为967

      image-20241004232013650

    • id为968

      image-20241004232040635

4.最终执行成功

多次手动执行广播任务,如果不是特别点背。很快就能看到如下的界面:

image-20241004232355506

5.测试总结

  • 的确是每个客户端都执行了同一个任务批次
  • 的确是所有客户端全部成功,最终这个批次的任务才算执行处理成功

总结

  • 广播任务类型适合在同一时间,所有客户端均执行同一个任务的场景。
  • 每个客户端节点均执行同一个批次任务
  • 所有客户端均成功该批次任务才算处理成功;有任何一个失败,该批次任务处理失败。