C语言学习网

如何在SpringBoot中使用ElaticJob定时器

发表于:2023-03-24 作者:安全数据网编辑
编辑最后更新 2023年03月24日,如何在SpringBoot中使用ElaticJob定时器?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。POM文件配置

如何在SpringBoot中使用ElaticJob定时器?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

POM文件配置

  4.0.0  com.example  demojob  0.0.1-SNAPSHOT  jar  demojob  Demo project for Spring Boot      org.springframework.boot    spring-boot-starter-parent    2.0.2.RELEASE             UTF-8    UTF-8    1.8              org.springframework.boot      spring-boot-starter-web              org.springframework.boot      spring-boot-starter-test      test                  elastic-job-common-core      com.dangdang      2.1.5              elastic-job-lite-core      com.dangdang      2.1.5              elastic-job-lite-spring      com.dangdang      2.1.5              elastic-job-cloud-executor      com.dangdang      2.1.5                  org.mariadb.jdbc      mariadb-java-client      1.5.4                  com.alibaba      druid-spring-boot-starter      1.1.9                  com.baomidou      mybatisplus-spring-boot-starter      1.0.5              com.baomidou      mybatis-plus      2.1.9                          org.springframework.boot        spring-boot-maven-plugin            

yaml文件配置(也可以用application.properties一样的)

# 配置配置数据源spring: datasource:  type: com.alibaba.druid.pool.DruidDataSource  driver-class-name: org.mariadb.jdbc.Driver  name: elastic-job-event  url: jdbc:mariadb://127.0.0.1:3306/elasticjob  username: root  password: 123456  druid:   validationQuery: SELECT 1   initialSize: 10   minIdle: 10   maxActive: 200   minEvictableIdleTimeMillis: 180000   testOnBorrow: false   testWhileIdle: true   removeAbandoned: true   removeAbandonedTimeout: 1800   logAbandoned: true   poolPreparedStatements: true   maxOpenPreparedStatements: 100# 配置ZookeeperregCenter: serverList: localhost:2181 namespace: hulk_order_task# 配置定时器规则simpleJob: cron: 0/5 * * * * ? shardingTotalCount: 1 shardingItemParameters: 0=1

开始写代码

RegistryCenterConfig

package com.example.demojob.config;import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperConfiguration;import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * 注册中心配置 * 用于注册和协调作业分布式行为的组件,目前仅支持Zookeeper。 * @author shudalei */@Configuration@ConditionalOn_Expression("'${regCenter.serverList}'.length() > 0")public class RegistryCenterConfig {  @Bean(initMethod = "init")  public ZookeeperRegistryCenter regCenter(@Value("${regCenter.serverList}") final String serverList,                       @Value("${regCenter.namespace}") final String namespace) {    return new ZookeeperRegistryCenter(new ZookeeperConfiguration(serverList, namespace));  }}

JobEventConfig

package com.example.demojob.config;import com.dangdang.ddframe.job.event.JobEventConfiguration;import com.dangdang.ddframe.job.event.rdb.JobEventRdbConfiguration;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.annotation.Resource;import javax.sql.DataSource;/** * 如果想把作业运行的内容写到DB中,我们需要用到另一个构造器, * 同时定义自己的JobEventConfiguration, * 目前来说实现这个接口的只有一个类JobEventRdbConfiguration, * 通过这个可以将作业运行的痕迹进行持久化到DB的操作。 * @author shudalei */@Configurationpublic class JobEventConfig {  @Resource  private DataSource dataSource;  @Bean  public JobEventConfiguration jobEventConfiguration() {    return new JobEventRdbConfiguration(dataSource);  }}

SimpleJobConfig

package com.example.demojob.config;import com.dangdang.ddframe.job.config.JobCoreConfiguration;import com.dangdang.ddframe.job.config.simple.SimpleJobConfiguration;import com.dangdang.ddframe.job.event.JobEventConfiguration;import com.dangdang.ddframe.job.lite.api.JobScheduler;import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration;import com.dangdang.ddframe.job.lite.spring.api.SpringJobScheduler;import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter;import com.example.demojob.job.TestSimpleJob;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.annotation.Resource;@Configurationpublic class SimpleJobConfig {  /**   * 注册中心   */  @Resource  private ZookeeperRegistryCenter regCenter;  /**   * job事件配置   */  @Resource  private JobEventConfiguration jobEventConfiguration;  /**   * 微信access token获取任务对象   *   */  @Resource  private TestSimpleJob simpleJob;  /**   *   * @param cron 定时任务cron配置   * @param shardingTotalCount 任务分片数   * @param shardingItemParameters 任务分片参数   * @return JobScheduler 任务调度器   */  @Bean(initMethod = "init")  public JobScheduler simpleJobScheduler(@Value("${simpleJob.cron}") final String cron,                      @Value("${simpleJob.shardingTotalCount}") final int shardingTotalCount,                      @Value("${simpleJob.shardingItemParameters}") final String shardingItemParameters) {    return new SpringJobScheduler(simpleJob, regCenter,        getLiteJobConfiguration(simpleJob.getClass(), cron, shardingTotalCount, shardingItemParameters),        jobEventConfiguration);  }  /**   *   * @param jobClass 任务调度类   * @param cron 定时任务cron配置   * @param shardingTotalCount 任务分片数   * @param shardingItemParameters 任务分片参数   * @return LiteJobConfiguration 任务配置   */  private LiteJobConfiguration getLiteJobConfiguration(final Class jobClass, final String cron,                             final int shardingTotalCount, final String shardingItemParameters) {    return LiteJobConfiguration        .newBuilder(            new SimpleJobConfiguration(JobCoreConfiguration.newBuilder(jobClass.getName(), cron, shardingTotalCount)                .shardingItemParameters(shardingItemParameters).build(), jobClass.getCanonicalName()))        .overwrite(true).build();  }}

TestSimpleJob,定时器任务本身

package com.example.demojob.job;import com.dangdang.ddframe.job.api.ShardingContext;import com.dangdang.ddframe.job.api.simple.SimpleJob;import org.springframework.stereotype.Component;@Componentpublic class TestSimpleJob implements SimpleJob {  private int count;  //任务就是每5秒执行一次控制台输出1,2,3……  @Override  public void execute(ShardingContext shardingContext) {    count++;    System.out.println("task " + count);  }}

最后在Docker下安装 Zookeeper

安装脚本compose文件如下

version: '2'services: zookeeper01:  image: zookeeper  restart: always  hostname: zookeeper01  ports:   - 2181:2181  environment:   ZOO_MY_ID: 1   ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zookeeper02:2888:3888 server.3=zookeeper03:2888:3888 zookeeper02:  image: zookeeper  restart: always  hostname: zookeeper02  ports:   - 2182:2181  environment:   ZOO_MY_ID: 2   ZOO_SERVERS: server.1=zookeeper01:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zookeeper03:2888:3888 zookeeper03:  image: zookeeper  restart: always  hostname: zookeeper03  ports:   - 2183:2181  environment:   ZOO_MY_ID: 3   ZOO_SERVERS: server.1=zookeeper01:2888:3888 server.2=zookeeper02:2888:3888 server.3=0.0.0.0:2888:3888

springboot是什么

springboot一种全新的编程规范,其设计目的是用来简化新Spring应用的初始搭建以及开发过程,SpringBoot也是一个服务于框架的框架,服务范围是简化配置文件。

看完上述内容,你们掌握如何在SpringBoot中使用ElaticJob定时器的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

0