首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

3.snail-job广播任务

  • 24-12-16 16:07
  • 4716
  • 5364
juejin.cn

前言

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

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

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

本节目标

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

客户端代码

scala
代码解读
复制代码
@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端口客户端

    less
    代码解读
    复制代码
    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端口客户端

    less
    代码解读
    复制代码
    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.测试总结

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

总结

  • 广播任务类型适合在同一时间,所有客户端均执行同一个任务的场景。
  • 每个客户端节点均执行同一个批次任务
  • 所有客户端均成功该批次任务才算处理成功;有任何一个失败,该批次任务处理失败。
注:本文转载自juejin.cn的老马9527的文章"https://juejin.cn/post/7422948006150438950"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top