JobRunr更轻量级的Java调度平台支持集群自带web管理

文章目录

  • JobRunr 使用介绍
    • SpringBoot 集成使用
    • API介绍
    • web控制面板介绍
    • Job Runr数据库表讲解
    • 集群功能

      JobRunr 是一个用于在 Java 应用程序中执行后台任务的库。和XXL-JOB类似比XXL-JOB更轻量。

      它提供了一种简单而有效的方式来管理和执行长时间运行的任务,例如数据处理、文件生成、发送电子邮件等。

      以下是 JobRunr 的一些主要特点:

      简单易用:JobRunr 的 API 设计简单直观,易于使用和集成到现有的 Java 应用程序中。

      任务调度:JobRunr 支持多种任务调度方式,包括立即执行、延迟执行、定时执行等。

      任务持久化:JobRunr 会将任务信息持久化到数据库中,以便在应用程序重启后能够继续执行未完成的任务。

      任务监控:JobRunr 提供了一个 Web 界面,用于监控任务的执行情况,包括任务状态、执行时间、执行结果等。

      分布式集群执行:JobRunr 支持分布式执行任务,可以将任务分配到多个节点上执行,提高任务执行的效率和可靠性。

      官网 https://www.jobrunr.io/

      Github https://github.com/jobrunr/jobrunr

      JobRunr 使用介绍

      SpringBoot 集成使用

      1. IDEA 创建SpringBoot 项目

        勾选依赖如下

        项目目录结构

      2. 添加Job Runr 和数据源连接池依赖

        SpringBoot 2.x版本

          com.zaxxer HikariCP compile    org.jobrunr jobrunr-spring-boot-2-starter 7.2.0 

        SpringBoot 3.x 版本

          com.zaxxer HikariCP compile    org.jobrunr jobrunr-spring-boot-3-starter 7.2.0 

        我的完整 pom.xml 文件展示

         4.0.0  org.springframework.boot spring-boot-starter-parent 3.3.0    org.smog jobrunrdemo 0.0.1-SNAPSHOT jobrunrdemo springboot集成JobRunr使用演示  17    com.zaxxer HikariCP compile    org.jobrunr jobrunr-spring-boot-3-starter 7.2.0    org.springframework.boot spring-boot-starter-web    com.mysql mysql-connector-j runtime    org.springframework.boot spring-boot-configuration-processor true    org.projectlombok lombok true      org.springframework.boot spring-boot-maven-plugin  org.smog.jobrunrdemo.JobrunrdemoApplication   org.projectlombok lombok      
      3. 配置数据源

        JobRunr 数据存储依赖数据库,需要配置数据源可以是常见关系型数据库、redis、mongodb、elasticsearch。如果你的项目中使用JPA或mybatis 的starter依赖已经自动配置spring.datasource数据源了可以省略这一步。

        修改配置文件

        spring:
          datasource:
            url: jdbc:mysql://IP:PORT/testdb?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
            username: 
            password:
            driver-class-name: com.mysql.cj.jdbc.Driver
            type: com.zaxxer.hikari.HikariDataSource
        

        创建数据源配置类

        因为我这里没有引入mybatis、JPA、JDBC的 starter,不会自动自动创建数据源配置。需要手动创建。

        package org.smog.jobrunrdemo.conf;
        import com.zaxxer.hikari.HikariDataSource;
        import org.springframework.beans.factory.annotation.Value;
        import org.springframework.context.annotation.Bean;
        import org.springframework.context.annotation.Configuration;
        import javax.sql.DataSource;
        @Configuration
        public class DataSourceConf { @Value("${spring.datasource.url}")
            private String url;
            
            @Value("${spring.datasource.username}")
            private String username;
            
            @Value("${spring.datasource.password}")
            private String password;
            
            @Value("${spring.datasource.driver-class-name}")
            private String driverClass;
            @Bean
            public DataSource dataSource() { HikariDataSource dataSource = new HikariDataSource();
                dataSource.setJdbcUrl(url);
                dataSource.setUsername(username);
                dataSource.setPassword(password);
                dataSource.setDriverClassName(driverClass);
                return dataSource;
            }
        }
        

        配置完启动测试一下没有报错就继续下一步

      4. 配置JobRunr

        SpringBoot配置文件添加配置

        org:
         jobrunr:
          background-job-server:
           enabled: true
          dashboard:
            # 开启jobrunr web控制面板
            enabled: true
            # jobrunr web管理端口
            port: 8000
            # web管理用户名 不设置则访问web管理不需要认证
            username: admin
            # web管理密码
            password: admin
        #  database:
        #    type: sql #使用数据源类型默认sql
        #    skip-create: false #跳过自动建表 默认false
        #    database-name: # 指定数据库名称,默认使用主数据源中数据库。如果不想把jobrunr的表与业务数据库放在一起需要配置
        #    table-prefix: # jobrunr相关表的名字前缀 默认
        #    datasource: # 如果存在多个数据源,想让jobrunr使用指定数据源。默认使用主数据源 spring.datasource
        
      5. 启动项目访问 8000 端口

        出现如下内容集成成功

      API介绍

      常用API使用示列

      1. 创建service类

        package org.smog.jobrunrdemo;
        import org.springframework.stereotype.Service;
        @Service
        public class DemoService { public void backgroundCalculation() { System.out.println(" 定时计算会员积分");
            }
        }
        
      2. 创建 Controller 类

        package org.smog.jobrunrdemo;
        import org.jobrunr.jobs.JobId;
        import org.jobrunr.scheduling.BackgroundJob;
        import org.jobrunr.scheduling.cron.Cron;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.web.bind.annotation.GetMapping;
        import org.springframework.web.bind.annotation.RestController;
        import java.time.LocalDateTime;
        import java.time.ZoneId;
        import java.util.UUID;
        @RestController
        public class DemoController { @Autowired
            DemoService demoService;
            /**
             * 立即放入队列等待执行的作业任务,只会执行一次
             *
             * @param msg
             * @return
             */
            @GetMapping("/oneJob")
            public Object oneJob(String msg) { // 此次执行的任务 Id
                UUID uuid = UUID.randomUUID();
                // 将作业任务放入队列执行,返回作业id。 后续可根据id溯源
                JobId jobId = BackgroundJob.enqueue(uuid, () -> { System.out.println("后台作业执行中... msg = " + msg);
                });
                return jobId.toString();
            }
            /**
             * 指定时间执行的作业任务,只会执行一次
             *
             * @param msg
             * @return
             */
            @GetMapping("/oneJob2")
            public Object oneJob2(String msg) { // 此次执行的任务 Id
                UUID uuid = UUID.randomUUID();
                // 指定执行时间 这里指定一分钟后执行
                LocalDateTime executionTime = LocalDateTime.now().plusMinutes(1);
                // 将作业任务放入队列执行,返回作业id。 后续可根据id溯源
                JobId jobId = BackgroundJob.schedule(uuid, executionTime, () -> { System.out.println("后台作业执行中... : msg = " + msg + " 指定的job执行时间: " + executionTime.toString());
                });
                return jobId.toString();
            }
            /**
             * 按照cron表达式重复作业
             *
             * @param msg
             * @return
             */
            @GetMapping("/oneJob3")
            public Object oneJob3(String msg) { // jobId 执行任务id, 后续可根据id 停止、删除 作业。
                String jobId = msg + System.currentTimeMillis();
                // 指定cron 每5分钟执行一次。 Cron 中封装了很多常用表达式,不满足可以自己编写cron表达式
                String cron = Cron.every5minutes();
                // 指定执行时区
                ZoneId asiaShanghaiZone = ZoneId.of("Asia/Shanghai");
                //  启动执行重复执行作业job   ,启动后镁5分钟执行一次demoService的backgroundCalculation()方法
                return BackgroundJob.scheduleRecurrently(jobId, cron, asiaShanghaiZone, demoService::backgroundCalculation);
                // 移除重复作业job
                // BackgroundJob.deleteRecurringJob(jobId);
            }
        }
        

      web控制面板介绍

      1. 执行器列表页面

        这里可以看到我们在线的执行器列表,点击id和name可以查看详情

      2. 重复作业任务Job 列表页面

        这里可以看到所有重复作业job,可以查看下一次执行时间、执行时区、cron。在此页面可以手动删 除job和执行job。点击TRIGGER会将job放入执行队列等待执行。

      3. 查看队列中的job

        可以查看不同状态的job,点击jobid查看详细还可以取消执行。

      4. 主页面

        主页面能看到运行状态并且以柱状图显示job执行成功数失败数

      Job Runr数据库表讲解

      jobrunr默认启动指定创建表,创建表如下

      1. jobrunr_backgroundjobservers

        server节点信息表存储在线的执行器集群节点

      2. jobrunr_jobs

        存储job执行记录信息,包含执行状态、调度时间

      3. jobrunr_metadata

        存储集群节点元数据信息

      4. jobrunr_recurring_jobs

        存储重新执行Job信息,包含jobid、创建时间、Job详细信息

      集群功能

      若一台执行器执行负载过大,可以再启动一个应用实列。Servers下就会多出一个执行器。需要注意第二个实列要连接同一个jobrunr的库。