文章目录
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 集成使用
- IDEA 创建SpringBoot 项目 勾选依赖如下 项目目录结构
- 添加Job Runr 和数据源连接池依赖SpringBoot 2.x版本
<!--数据源连接池--><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><scope>compile</scope></dependency><!-- jobrunr 依赖 --><dependency><groupId>org.jobrunr</groupId><artifactId>jobrunr-spring-boot-2-starter</artifactId><version>7.2.0</version></dependency>
SpringBoot 3.x 版本<!--数据源连接池--><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><scope>compile</scope></dependency><!-- jobrunr 依赖 --><dependency><groupId>org.jobrunr</groupId><artifactId>jobrunr-spring-boot-3-starter</artifactId><version>7.2.0</version></dependency>
我的完整pom.xml
文件展示<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.0</version><relativePath/><!-- lookup parent from repository --></parent><groupId>org.smog</groupId><artifactId>jobrunrdemo</artifactId><version>0.0.1-SNAPSHOT</version><name>jobrunrdemo</name><description>springboot集成JobRunr使用演示</description><properties><java.version>17</java.version></properties><dependencies><!--数据源连接池--><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><scope>compile</scope></dependency><!-- jobrunr 依赖 --><dependency><groupId>org.jobrunr</groupId><artifactId>jobrunr-spring-boot-3-starter</artifactId><version>7.2.0</version></dependency><!--web容器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--Mysql驱动--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><!--配置文件支持,IDEA在编辑Spring boot配置文件提供代码提示和自动完成功能。帮助在编译期生成关于应用配置属性的详细元数据,包括属性的描述、默认值等信息。--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><!--自动生成get、set、构成、toString、equals 等函数--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><mainClass>org.smog.jobrunrdemo.JobrunrdemoApplication</mainClass><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
- 配置数据源 JobRunr 数据存储依赖数据库,需要配置数据源可以是常见关系型数据库、redis、mongodb、elasticsearch。如果你的项目中使用JPA或mybatis 的
starter
依赖已经自动配置spring.datasource
数据源了可以省略这一步。修改配置文件spring:datasource:url: jdbc:mysql://IP:PORT/testdb?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghaiusername:password:driver-class-name: com.mysql.cj.jdbc.Driver type: com.zaxxer.hikari.HikariDataSource
创建数据源配置类 因为我这里没有引入mybatis、JPA、JDBC的starter
,不会自动自动创建数据源配置。需要手动创建。packageorg.smog.jobrunrdemo.conf;importcom.zaxxer.hikari.HikariDataSource;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importjavax.sql.DataSource;@ConfigurationpublicclassDataSourceConf{@Value("${spring.datasource.url}")privateString url;@Value("${spring.datasource.username}")privateString username;@Value("${spring.datasource.password}")privateString password;@Value("${spring.datasource.driver-class-name}")privateString driverClass;@BeanpublicDataSourcedataSource(){HikariDataSource dataSource =newHikariDataSource(); dataSource.setJdbcUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); dataSource.setDriverClassName(driverClass);return dataSource;}}``````配置完启动测试一下没有报错就继续下一步
- 配置JobRunrSpringBoot配置文件添加配置
org:jobrunr:background-job-server:enabled:truedashboard:# 开启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
- 启动项目访问 8000 端口出现如下内容集成成功
API介绍
常用API使用示列
- 创建service类
packageorg.smog.jobrunrdemo;importorg.springframework.stereotype.Service;@ServicepublicclassDemoService{publicvoidbackgroundCalculation(){System.out.println(" 定时计算会员积分");}}
- 创建 Controller 类
packageorg.smog.jobrunrdemo;importorg.jobrunr.jobs.JobId;importorg.jobrunr.scheduling.BackgroundJob;importorg.jobrunr.scheduling.cron.Cron;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;importjava.time.LocalDateTime;importjava.time.ZoneId;importjava.util.UUID;@RestControllerpublicclassDemoController{@AutowiredDemoService demoService;/** * 立即放入队列等待执行的作业任务,只会执行一次 * * @param msg * @return */@GetMapping("/oneJob")publicObjectoneJob(String msg){// 此次执行的任务 IdUUID uuid =UUID.randomUUID();// 将作业任务放入队列执行,返回作业id。 后续可根据id溯源JobId jobId =BackgroundJob.enqueue(uuid,()->{System.out.println("后台作业执行中... msg = "+ msg);});return jobId.toString();}/** * 指定时间执行的作业任务,只会执行一次 * * @param msg * @return */@GetMapping("/oneJob2")publicObjectoneJob2(String msg){// 此次执行的任务 IdUUID 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")publicObjectoneJob3(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()方法returnBackgroundJob.scheduleRecurrently(jobId, cron, asiaShanghaiZone, demoService::backgroundCalculation);// 移除重复作业job// BackgroundJob.deleteRecurringJob(jobId);}}
web控制面板介绍
- 执行器列表页面 这里可以看到我们在线的执行器列表,点击id和name可以查看详情
- 重复作业任务Job 列表页面 这里可以看到所有重复作业job,可以查看下一次执行时间、执行时区、cron。在此页面可以手动删 除job和执行job。点击TRIGGER会将job放入执行队列等待执行。
- 查看队列中的job 可以查看不同状态的job,点击jobid查看详细还可以取消执行。
- 主页面 主页面能看到运行状态并且以柱状图显示job执行成功数失败数
Job Runr数据库表讲解
jobrunr默认启动指定创建表,创建表如下
- jobrunr_backgroundjobservers server节点信息表存储在线的执行器集群节点
- jobrunr_jobs 存储job执行记录信息,包含执行状态、调度时间
- jobrunr_metadata 存储集群节点元数据信息
- jobrunr_recurring_jobs 存储重新执行Job信息,包含jobid、创建时间、Job详细信息
集群功能
若一台执行器执行负载过大,可以再启动一个应用实列。Servers下就会多出一个执行器。需要注意第二个实列要连接同一个jobrunr的库。
版权归原作者 ZuuuuYao 所有, 如有侵权,请联系我们删除。