一、#创作灵感#
elasticjob在同一个实例上运行的多个分片任务(实例数量小于分片数量)
- 很多贴子、AI说可以
- 实际不可以,很可能是官方说明翻译时出现了误差
- 每个分片由一个独立的作业服务器执行,可以同时处理多个分片,实现作业的并行执行(同时、并行都是指不同的服务器/实例之间并行)
- 网上的文章在部分没有写明代码对应的elasticjob版本,导致可读性差就成了鸡肋
需求:作业需要分多片,但不不想启动太多pod/实例
方案:当然这是有解决方案的。本文作者分享编程、配置两种实现方案
二、环境
- SpringBoot 2.7.18 官方下载地址:SpringBoot 2.7.18
- ElasticJob 3.0.4 官方下载地址:ElasticJob 3.0.4
- ElasticJob-UI 3.0.2 图形化工具 官方下载地址:ElasticJob-UI 3.0.2
- Nacos 2.2.3 官方下载地址:Nacos 2.2.3
- Oracle JDK8u202(Oracle JDK8最后一个非商业版本) 下载地址:Oracle JDK8u202
三、方案一(编码方式)
1、使用不同的Job名称
为每个任务定义不同的Job名称。虽然这不一定直接解决在同一实例上运行多个分片的问题,但它可以帮助你更清晰地管理和识别不同的任务。
高版本(ElasticJob 3.0.4+)
/**
* 作业配置1
* @return
*/
@Bean(name="myJob1")
public JobConfiguration jobConfiguration1() {
return JobConfiguration.newBuilder("myJob1", 2 )
.shardingItemParameters("0=Beijing,1=Shanghai")
.jobParameter("param=value")
.build();
}
/**
* 作业配置2
* @return
*/
@Bean(name="myJob2")
public JobConfiguration jobConfiguration2() {
return JobConfiguration.newBuilder("myJob2", 2 )
.shardingItemParameters("0=Beijing,1=Shanghai")
.jobParameter("param=value")
.build();
}
低版本
// 第一个任务
SimpleJobConfiguration firstJobConfig = SimpleJobConfiguration.newBuilder(MyJob.class)
.cron(cron1)
.shardingTotalCount(2)
.jobParameter("param1")
.build();