3.8、新建 ScriptJob 类型作业
ScriptJob 类型的任务配置和上面类似,主要是用于定时执行某个脚本,一般用的比较少!
因为目标是脚本,没有执行的任务,所以无需编写任务作业类型!
只需要编写一个ScriptJob
类型的配置类即可,命令是echo 'Hello World !
内容!
@Configuration public class MyScriptJobConfig { /** * 任务名称 */ @Value("${scriptJob.myScriptJob.name}") private String jobName; /** * cron表达式 */ @Value("${scriptJob.myScriptJob.cron}") private String jobCron; /** * 作业分片总数 */ @Value("${scriptJob.myScriptJob.shardingTotalCount}") private int jobShardingTotalCount; /** * 作业分片参数 */ @Value("${scriptJob.myScriptJob.shardingItemParameters}") private String jobShardingItemParameters; /** * 自定义参数 */ @Value("${scriptJob.myScriptJob.jobParameters}") private String jobParameters; @Autowired private ZookeeperRegistryCenter registryCenter; @Bean(initMethod = "init") public JobScheduler scriptJobScheduler() { MyElasticJobListener elasticJobListener = new MyElasticJobListener(); return new JobScheduler(registryCenter, getLiteJobConfiguration(), elasticJobListener); } private LiteJobConfiguration getLiteJobConfiguration() { // 定义作业核心配置 JobCoreConfiguration scriptCoreConfig = JobCoreConfiguration.newBuilder(jobName, jobCron, jobShardingTotalCount). shardingItemParameters(jobShardingItemParameters).jobParameter(jobParameters).build(); // 定义SCRIPT类型配置 ScriptJobConfiguration scriptJobConfig = new ScriptJobConfiguration(scriptCoreConfig, "echo 'Hello World !'"); // 定义Lite作业根配置 LiteJobConfiguration scriptJobRootConfig = LiteJobConfiguration.newBuilder(scriptJobConfig).overwrite(true).build(); return scriptJobRootConfig; } }
在配置文件application.properties
中配置好对应的myScriptJob
参数!
#script类型的job scriptJob.myScriptJob.name=myScriptJob scriptJob.myScriptJob.cron=0/15 * * * * ? scriptJob.myScriptJob.shardingTotalCount=3 scriptJob.myScriptJob.shardingItemParameters=0=a,1=b,2=c scriptJob.myScriptJob.jobParameters=myScriptJobParamter
运行程序,看看效果如何?
3.9、将任务状态持久化到数据库
可能有的人会发出疑问,elastic-job
是如何存储数据的,用ZooInspector
客户端链接zookeeper
注册中心,你发现对应的任务配置被存储到相应的树根上!
而具体作业任务执行轨迹和状态结果是不会存储到zookeeper
,需要我们在项目中通过数据源方式进行持久化!
将任务状态持久化到数据库配置过程也很简单,只需要在对应的配置类上注入数据源即可,以MySimpleJobConfig
为例,代码如下:
@Configuration public class MySimpleJobConfig { /** * 任务名称 */ @Value("${simpleJob.mySimpleJob.name}") private String mySimpleJobName; /** * cron表达式 */ @Value("${simpleJob.mySimpleJob.cron}") private String mySimpleJobCron; /** * 作业分片总数 */ @Value("${simpleJob.mySimpleJob.shardingTotalCount}") private int mySimpleJobShardingTotalCount; /** * 作业分片参数 */ @Value("${simpleJob.mySimpleJob.shardingItemParameters}") private String mySimpleJobShardingItemParameters; /** * 自定义参数 */ @Value("${simpleJob.mySimpleJob.jobParameters}") private String mySimpleJobParameters; @Autowired private ZookeeperRegistryCenter registryCenter; @Autowired private DataSource dataSource;; @Bean public MySimpleJob stockJob() { return new MySimpleJob(); } @Bean(initMethod = "init") public JobScheduler simpleJobScheduler(final MySimpleJob mySimpleJob) { //添加事件数据源配置 JobEventConfiguration jobEventConfig = new JobEventRdbConfiguration(dataSource); MyElasticJobListener elasticJobListener = new MyElasticJobListener(); return new SpringJobScheduler(mySimpleJob, registryCenter, getLiteJobConfiguration(), jobEventConfig, elasticJobListener); } private LiteJobConfiguration getLiteJobConfiguration() { // 定义作业核心配置 JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder(mySimpleJobName, mySimpleJobCron, mySimpleJobShardingTotalCount). shardingItemParameters(mySimpleJobShardingItemParameters).jobParameter(mySimpleJobParameters).build(); // 定义SIMPLE类型配置 SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(simpleCoreConfig, MySimpleJob.class.getCanonicalName()); // 定义Lite作业根配置 LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).overwrite(true).build(); return simpleJobRootConfig; } }
同时,需要在配置文件application.properties
中配置好对应的datasource
参数!
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/example-elastic-job-test spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver
运行程序,然后在elastic-job-lite-console
控制台配置对应的数据源!
最后,点击【作业轨迹】即可查看对应作业执行情况!
四、小结
本文主要围绕elasticjob
的使用进行简单介绍,希望大家有所收获!
在分布式环境环境下,elastic-job-lite
支持的弹性扩容、任务分片是最大的亮点,在实际使用的时候,任务分片总数尽可能大于服务实例个数,并且是倍数关系,这样任务在分片的时候,会更加均匀!
如果想深入的了解elasticjob
,大家可以访问官方文档,获取更加详细的使用教程!