静态分片
含义
将一个大的任务或者数据集分割成多个较小的部分来处理的方法。在 snail-job
中,静态分片任务是指将一个大任务拆分成多个小任务并发执行,每个小任务处理数据的一个子集,并且这个要处理的子集是通过事先页面配置的的静态参数来决定的。
场景
假设公司要对明文保存手机号的 User
表进行数据安全审查,自增 id
从 1 到 40000,通过 snail-job
的静态分片任务将这 4 万条数据按不同范围分片处理。
测试
测试目的
- 验证每个节点接收到的分片参数是否是正确的
- 验证某个节点执行失败批次状态是否为失败
测试代码
java
@Slf4j
@Component
@JobExecutor(name = "testSnailJobWithAnnotation")
public class TestSnailJobWithAnnotation {
@Autowired
private Environment env;
Map<String,String> dataMap = new HashMap<>(){{
put("1","1");
put("2","2");
put("3","3");
put("4","4");
put("5","5");
put("6","6");
put("7","7");
put("8","8");
put("9","9");
}};
@JobExecutor(name = "testSnailJobWithAnnotation")
public ExecuteResult testSnailJobWithAnnotation1(JobArgs jobArgs) throws InterruptedException {
log.info("定时任务执行成功.参数值:{}", JSON.toJSONString(jobArgs));
SnailJobLog.REMOTE.info("REMOTE日志.参数值:{}", JSON.toJSONString(jobArgs));
SnailJobLog.REMOTE.info("REMOTE日志.当前节点{}", env.getProperty("server.port"));
JSONObject jsonObject = JSON.parseObject(jobArgs.getJobParams().toString());
// 获取 phones 数组
JSONArray phonesArray = jsonObject.getJSONArray("phones");
for (Object o : phonesArray) {
SnailJobLog.REMOTE.info("处理手机号为{}的数据开始",o.toString());
TimeUnit.SECONDS.sleep(2);
SnailJobLog.REMOTE.info("处理手机号为{}的数据结束",o.toString());
}
return ExecuteResult.success("处理完成");
}
}
idea启动多个节点配置
shell
server.port=web端口 spring.profiles.active=执行环境
-Dserver.port=9901 -Dspring.profiles.active=dev-one
-Dserver.port=9902 -Dspring.profiles.active=dev-two
-Dserver.port=9903 -Dspring.profiles.active=dev-three
同时启动3个节点
测试结果
目的一结果:所有节点接收参数正常,页面批次接收显示正常
目的二结果:当某一节点失败后,批次状态即为失败
结论
- 静态分片任务是把大任务分为一个一个的小任务,交给客户端去执行。之所以前面要加一个静态这个定语,就是说你要事先定义好分片的范围。有静态就意味会有动态,这个在下面的章节中介绍。
- 客户端代码通过
jobArgs.getJobParams()
获得事先分片好的参数内容,进行对应的逻辑处理。