使用 docker 部署 elasticjob-lite

部署注册中心zookeeper

  • 拉取镜像:

    1
    docker pull zookeeper:latest
  • 运行容器:

    1
    docker run --name zookeeper --restart always -p 2181:2181 -d zookeeper:latest

部署管理端面板elasticjob-lite-ui

  • 拉取镜像:

    1
    docker pull apache/shardingsphere-elasticjob-lite-ui:latest
  • 运行容器:

    1
    docker run --name elasticjob-lite-ui --restart always -p 8088:8088 -d apache/shardingsphere-elasticjob-lite-ui:latest

搭建elasticjob-lite后端服务

  • 初始化SpringBoot工程项目

  • 集成elasticjob-lite

    • pom.xml添加依赖:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      <properties>
      ...
      <elasticjob-lite.version>3.0.1</elasticjob-lite.version>
      </properties>

      <dependencies>
      ...
      <!-- elasticjob-lite-spring-boot 依赖 -->
      <dependency>
      <groupId>org.apache.shardingsphere.elasticjob</groupId>
      <artifactId>elasticjob-lite-spring-boot-starter</artifactId>
      <version>${elasticjob-lite.version}</version>
      </dependency>
      </dependencies>
    • application.yamll配置elasticjob-lite数据库类型、注册中心地址包括命名空间:

      1
      2
      3
      4
      5
      6
      elasticjob:
      tracing:
      type: RDB
      reg-center:
      server-lists: ${ZK_HOST:}:${ZK_PORT:}
      namespace: ${ZK_NAMESPACE}
  • 编写定时任务

    • 编写实现SimpleJob接口的指定任务类:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      @Component
      public class DemoJob implements SimpleJob {

      private final Logger logger = LoggerFactory.getLogger(DemoJob.class);

      @Override
      public void execute(ShardingContext shardingContext) {
      logger.info("[DemoJob] 调度任务开始...");
      try {
      logger.info("[DemoJob] 调度任务:正在执行调度任务...");
      Thread.sleep(2000);
      } catch (InterruptedException e) {
      logger.error("[DemoJob] 调度出现异常... 信息:{}", e.toString());
      }
      logger.info("[DemoJob] 调度任务结束...");
      }
      }
    • application.yaml配置指定定时任务:

      1
      2
      3
      4
      5
      6
      7
      8
      elasticjob:
      jobs:
      demoJob: ## 指定定时任务名称
      elasticJobClass: com.garden.jobs.DemoJob ## 指定定时任务的全限定类名
      cron: 0 0 1 * * ? ## 定时cron表达式
      shardingTotalCount: 1 ## 分片数量
      disabled: true ## 是否启动时生效
      overwrite: false ## 是否可覆盖
  • 集成docker-maven打包

    • .m2/setting.xml文件添加spotify插件组:

      1
      2
      ...
      <pluginGroups><pluginGroup>com.spotify</pluginGroup></pluginGroups>
    • pom.xml排除默认的打包目标以及新增docker-maven-plugin

      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
      <properties>
      ...
      <dockerfile-maven-plugin.version>1.4.13</dockerfile-maven-plugin.version>
      <repository-name>garden12138</repository-name>
      </properties>

      <build>
      <plugins>
      <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <configuration>
      <mainClass>com.garden.JobsApplication</mainClass>
      </configuration>
      <executions>
      <execution>
      <goals>
      <goal>repackage</goal>
      </goals>
      </execution>
      </executions>
      </plugin>
      <!-- dockerfile-maven-plugin -->
      <plugin>
      <groupId>com.spotify</groupId>
      <artifactId>dockerfile-maven-plugin</artifactId>
      <version>${dockerfile-maven-plugin.version}</version>
      <executions>
      <execution>
      <id>default</id>
      <goals>
      <goal>build</goal>
      <goal>push</goal>
      </goals>
      </execution>
      </executions>
      <configuration>
      <!-- 设置镜像名称格式,由仓库项目名与构件ID组合 -->
      <repository>${repository-name}/${artifactId}</repository>
      <!-- 设置镜像版本号 -->
      <tag>${project.version}</tag>
      <!-- 设置镜像构件过程中的环境变量,如Jar文件名 -->
      <buildArgs>
      <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
      </buildArgs>
      </configuration>
      </plugin>
      </plugins>
      </build>

部署elasticjob-lite后端服务

  • 编写Dockerfile

    1
    2
    3
    4
    5
    FROM java:8
    VOLUME /tmp
    ARG JAR_FILE
    ADD target/${JAR_FILE} app.jar
    ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
  • 打包elasticjob-lite后端服务:

    1
    mvn clean package dockerfile:build
  • 运行elasticjob-lite后端服务:

    1
    docker run --name ${CONTAINER_NAME} --restart=always -d -e ZK_HOST=$(docker inspect --format='{{(index (index .NetworkSettings.IPAddress))}}' ${ZK_NAME}) -e ZK_PORT=${ZK_PORT} ${IMG_NAME}:${IMG_VERSION}

使用elasticjob-lite

  • 登录管理端面板:

    1
    2
    3
    4
    ## 访问地址:
    http://159.75.138.212:8088/index.html#/login
    ## 账号密码:
    root/root

  • 创建并链接注册中心:

  • 设置定时任务生效:

    若设置生效后处于分片待调整状态,可将cron表达式更新为当前可触发时间(如* * * * *)使状态变为正常,然后再将原本cron表达式更新:

参考文献

示例代码