SpringBoot集成ElaticJob定时器的实现代码

it2025-09-19  2

本文介绍了SpringBoot集成ElaticJob定时器的实现代码,分享给大家,具体如下:

POM文件配置

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

 

  <groupId>com.example</groupId>

  <artifactId>demojob</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>jar</packaging>

 

  <name>demojob</name>

  <description>Demo project for Spring Boot</description>

 

  <parent>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>2.0.2.RELEASE</version>

    <relativePath/> <!-- lookup parent from repository -->

  </parent>

 

  <properties>

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

    <java.version>1.8</java.version>

  </properties>

 

  <dependencies>

 

    <dependency>

      <groupId>org.springframework.boot</groupId>

      <artifactId>spring-boot-starter-web</artifactId>

    </dependency>

 

    <dependency>

      <groupId>org.springframework.boot</groupId>

      <artifactId>spring-boot-starter-test</artifactId>

      <scope>test</scope>

    </dependency>

 

 

    <!--elastic-job-->

    <dependency>

      <artifactId>elastic-job-common-core</artifactId>

      <groupId>com.dangdang</groupId>

      <version>2.1.5</version>

    </dependency>

    <dependency>

      <artifactId>elastic-job-lite-core</artifactId>

      <groupId>com.dangdang</groupId>

      <version>2.1.5</version>

    </dependency>

    <dependency>

      <artifactId>elastic-job-lite-spring</artifactId>

      <groupId>com.dangdang</groupId>

      <version>2.1.5</version>

    </dependency>

    <dependency>

      <artifactId>elastic-job-cloud-executor</artifactId>

      <groupId>com.dangdang</groupId>

      <version>2.1.5</version>

    </dependency>

 

 

    <!--mariadb-->

    <dependency>

      <groupId>org.mariadb.jdbc</groupId>

      <artifactId>mariadb-java-client</artifactId>

      <version>1.5.4</version>

    </dependency>

    <!--druid-->

    <dependency>

      <groupId>com.alibaba</groupId>

      <artifactId>druid-spring-boot-starter</artifactId>

      <version>1.1.9</version>

    </dependency>

    <!--mybatis plus-->

    <dependency>

      <groupId>com.baomidou</groupId>

      <artifactId>mybatisplus-spring-boot-starter</artifactId>

      <version>1.0.5</version>

    </dependency>

    <dependency>

      <groupId>com.baomidou</groupId>

      <artifactId>mybatis-plus</artifactId>

      <version>2.1.9</version>

    </dependency>

 

 

  </dependencies>

 

  <build>

    <plugins>

      <plugin>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-maven-plugin</artifactId>

      </plugin>

    </plugins>

  </build>

</project>

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

# 配置配置数据源

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

 

# 配置Zookeeper

regCenter:

 serverList: localhost:2181

 namespace: hulk_order_task

 

# 配置定时器规则

simpleJob:

 cron: 0/5 * * * * ?

 shardingTotalCount: 1

 shardingItemParameters: 0=1

开始写代码

RegistryCenterConfig

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

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

@ConditionalOnExpression("'${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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

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

 */

@Configuration

public class JobEventConfig {

  @Resource

  private DataSource dataSource;

 

  @Bean

  public JobEventConfiguration jobEventConfiguration() {

    return new JobEventRdbConfiguration(dataSource);

  }

}

SimpleJobConfig

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

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;

 

@Configuration

public 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<? extends com.dangdang.ddframe.job.api.simple.SimpleJob> 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,定时器任务本身

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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;

 

@Component

public 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文件如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

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

 

最新回复(0)