前言
上一节《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的客户端端口 |
---|---|
8089 | 1789 |
8090 | 1790 |
1.web端口设置
这里增加JVM的运行参数:-Dserver.port=8089
。这个JVM参数是通过如下操作而出现:
2.snail-job的客户端端口配置
修改application.yml的snail-job.port
端口。8089对应的是1789,8090对应的1790
3.在线机器中查看
可以看到两个客户端已经正常启动了。
服务端配置广播任务
配置项 | 配置内容 |
---|---|
任务名称 | 测试广播任务 |
组名称 | service_plat |
状态 | 禁用 |
任务类型 | 广播 |
执行器类型 | java |
执行器名称 | com.mayuanfei.test.TestBroadcastJob |
路由策略 | 轮询 |
阻塞策略 | 丢弃 |
最大重试次数 | 0 |
说明:
任务类型:广播
所有客户端节点均执行同一个任务
路由策略:轮询
这里的轮询表示,客户端会一个接一个的执行任务
最大重试次数:0
为了验证所有客户端均成功,该广播任务才算成功。所以这次避免错误重试机制
状态:禁用
使用手动方式,执行广播任务
进行测试
1.手动执行广播任务
依次点击定时任务列表中,测试广播任务
后的执行->确认按钮,手动触发广播任务。
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.执行批次日志
-
任务状态是处理失败
-
日志中的详细信息
-
查看日志信息
-
id为967
-
id为968
-
4.最终执行成功
多次手动执行广播任务,如果不是特别点背。很快就能看到如下的界面:
5.测试总结
- 的确是每个客户端都执行了同一个任务批次
- 的确是所有客户端全部成功,最终这个批次的任务才算执行处理成功
总结
- 广播任务类型适合在同一时间,所有客户端均执行同一个任务的场景。
- 每个客户端节点均执行同一个批次任务
- 所有客户端均成功该批次任务才算处理成功;有任何一个失败,该批次任务处理失败。
评论记录:
回复评论: