简单区分:

RAM:程序启动从数据库中读取原始job配置(也可以从配置文件中读取),job中间运行过程在RAM内存中,程序停止或重启后,RAM中数据丢失,再次启动的时候会重新读取job配置。适合于单机使用

JDBC:程序启动从数据库中读取原始job配置,job中间运行过程存在JDBC中,程序停止或重启后,JDBC中数据不丢失,适合于集群使用。

1、jar包依赖引入

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

2、yml配置文件

  quartz:
properties:
org:
quartz:
scheduler:
instanceName: quartzScheduler
instanceId: AUTO
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 10
threadPriority: 5
threadsInheritContextClassLoaderOfInitializingThread: true

3、实体类SysQuartzramJob

package org.jeecg.modules.quartz.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecgframework.poi.excel.annotation.Excel; /**
* @Description: 定时任务RAM,
* @author: dengjie
* @Date: 2022-02-16
* @Version: V1.0
*/
@Data
@TableName("sys_quartz_job_ram")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="sys_quartz_job_ram对象", description="定时任务RAM")
public class SysQuartzramJob { //名字和分组,定好了就不能改,切记。定时器内部核心逻辑是根据名字和分组去标识一个定时任务的
/**id*/
@TableId(type = IdType.ID_WORKER_STR)
@ApiModelProperty(value = "id")
private String id;
/**任务名称*/
@Excel(name = "任务名称", width = 15)
@ApiModelProperty(value = "任务名称")
private String jobName;
/**任务分组*/
@Excel(name = "任务分组", width = 15)
@ApiModelProperty(value = "任务分组")
private String jobGroup;
/**执行类*/
@Excel(name = "执行类", width = 15)
@ApiModelProperty(value = "执行类")
private String jobClassName;
/**执行时间*/
@Excel(name = "执行时间", width = 15)
@ApiModelProperty(value = "执行时间")
private String cronExpression;
/**任务状态*/
@Excel(name = "任务状态", width = 15)
@ApiModelProperty(value = "任务状态")
private String triggerState;
/**描述*/
@Excel(name = "描述", width = 15)
@ApiModelProperty(value = "描述")
private String description; /**下面是实体对应数据库的表sys_quartzram_job
*
* CREATE TABLE "public"."sys_quartzram_job" (
* "id" varchar(50) ,
* "job_name" varchar(50) COLLATE "pg_catalog"."default",
* "job_group" varchar(50) COLLATE "pg_catalog"."default",
* "job_class_name" varchar(100) COLLATE "pg_catalog"."default",
* "cron_expression" varchar(100) COLLATE "pg_catalog"."default",
* "trigger_state" varchar(15) COLLATE "pg_catalog"."default",
* "description" varchar(100) COLLATE "pg_catalog"."default"
* )
* ;
*
* COMMENT ON COLUMN "public"."sys_quartzram_job"."id" IS 'id';
* COMMENT ON COLUMN "public"."sys_quartzram_job"."job_name" IS '任务名称';
* COMMENT ON COLUMN "public"."sys_quartzram_job"."job_group" IS '任务分组';
* COMMENT ON COLUMN "public"."sys_quartzram_job"."job_class_name" IS '执行类';
* COMMENT ON COLUMN "public"."sys_quartzram_job"."cron_expression" IS '执行时间';
* COMMENT ON COLUMN "public"."sys_quartzram_job"."trigger_state" IS '任务状态';
* COMMENT ON COLUMN "public"."sys_quartzram_job"."description" IS '描述';
*
*/
}

4、核心controller类

package org.jeecg.modules.quartz.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.modules.quartz.entity.SysQuartzramJob;
import org.jeecg.modules.quartz.enums.JobStatus;
import org.jeecg.modules.quartz.service.ISysQuartzramJobService;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays; /**
* @Description: 定时任务RAM
* @author: dengjie
* @Date: 2022-02-16
* @Version: V1.0
*/
@Slf4j
@Api(tags="定时任务RAM")
@RestController
@RequestMapping("/quartz/sysQuartzramJob")
public class SysQuartzramJobController extends JeecgController<SysQuartzramJob, ISysQuartzramJobService> {
private static final String TRIGGER_IDENTITY = "trigger";
@Autowired
private ISysQuartzramJobService sysQuartzramJobService;
@Autowired
private Scheduler scheduler;
/**
* 分页列表查询
*
* @param sysQuartzramJob
* @param pageNo
* @param pageSize
* @param req
* @return
*/
@AutoLog(value = "定时任务RAM-分页列表查询")
@ApiOperation(value="定时任务RAM-分页列表查询", notes="定时任务RAM-分页列表查询")
@GetMapping(value = "/list")
public Result<?> queryPageList(SysQuartzramJob sysQuartzramJob,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<SysQuartzramJob> queryWrapper = QueryGenerator.initQueryWrapper(sysQuartzramJob, req.getParameterMap());
Page<SysQuartzramJob> page = new Page<SysQuartzramJob>(pageNo, pageSize);
IPage<SysQuartzramJob> pageList = sysQuartzramJobService.page(page, queryWrapper);
return Result.ok(pageList);
} /**
* 添加
*
* @param sysQuartzramJob
* @return
*/
@AutoLog(value = "定时任务RAM-添加")
@ApiOperation(value="定时任务RAM-添加", notes="定时任务RAM-添加")
@PostMapping(value = "/add")
public Result<?> add(@RequestBody SysQuartzramJob sysQuartzramJob) {
try
{
schedulerJob(sysQuartzramJob);
sysQuartzramJob.setTriggerState(JobStatus.RUNNING.getStatus());
sysQuartzramJobService.save(sysQuartzramJob);
}
catch (Exception e) {
e.printStackTrace();
return Result.error("异常:" + e.getMessage());
} return Result.ok("成功!");
} @AutoLog(value = "定时任务RAM-触发")
@ApiOperation(value="定时任务RAM-触发", notes="定时任务RAM-触发")
@PostMapping(value = "/trigger")
public Result<?> trigger(@RequestBody SysQuartzramJob sysQuartzramJob) {
try
{
JobKey key = new JobKey(sysQuartzramJob.getJobName(),sysQuartzramJob.getJobGroup());
scheduler.triggerJob(key);
}
catch (Exception e) {
e.printStackTrace();
return Result.error("异常:" + e.getMessage());
} return Result.ok("成功!");
} @AutoLog(value = "定时任务RAM-停止")
@ApiOperation(value="定时任务RAM-停止", notes="定时任务RAM-停止")
@PostMapping(value = "/pause")
public Result<?> pause(@RequestBody SysQuartzramJob sysQuartzramJob) {
try
{
JobKey key = new JobKey(sysQuartzramJob.getJobName(),sysQuartzramJob.getJobGroup());
scheduler.pauseJob(key); sysQuartzramJob.setTriggerState(JobStatus.PAUSED.getStatus());
sysQuartzramJobService.updateById(sysQuartzramJob);
}
catch (Exception e) {
e.printStackTrace();
return Result.error("异常:" + e.getMessage());
} return Result.ok("成功!");
} @AutoLog(value = "定时任务RAM-恢复")
@ApiOperation(value="定时任务RAM-恢复", notes="定时任务RAM-恢复")
@PostMapping(value = "/resume")
public Result<?> resume(@RequestBody SysQuartzramJob sysQuartzramJob) {
try
{
JobKey key = new JobKey(sysQuartzramJob.getJobName(),sysQuartzramJob.getJobGroup());
scheduler.resumeJob(key); sysQuartzramJob.setTriggerState(JobStatus.RUNNING.getStatus());
sysQuartzramJobService.updateById(sysQuartzramJob);
}
catch (Exception e) {
e.printStackTrace();
return Result.error("异常:" + e.getMessage());
} return Result.ok("成功!");
} @AutoLog(value = "定时任务RAM-删除")
@ApiOperation(value="定时任务RAM-删除", notes="定时任务RAM-删除")
@PostMapping(value = "/delete")
public Result<?> delete(@RequestBody SysQuartzramJob sysQuartzramJob) {
try
{
String jobName=sysQuartzramJob.getJobName();
String jobGroup=sysQuartzramJob.getJobGroup(); TriggerKey triggerKey = TriggerKey.triggerKey(TRIGGER_IDENTITY + jobName, jobGroup);
scheduler.pauseTrigger(triggerKey); // 停止触发器
scheduler.unscheduleJob(triggerKey); // 移除触发器
scheduler.deleteJob(JobKey.jobKey(jobName, jobGroup)); // 删除任务 sysQuartzramJobService.removeById(sysQuartzramJob.getId());
}
catch (Exception e) {
e.printStackTrace();
return Result.error("异常:" + e.getMessage());
} return Result.ok("成功!");
}
/**
* 编辑
*
* @param sysQuartzramJob
* @return
*/
@AutoLog(value = "定时任务RAM-编辑")
@ApiOperation(value="定时任务RAM-编辑", notes="定时任务RAM-编辑")
@PutMapping(value = "/edit")
public Result<?> edit(@RequestBody SysQuartzramJob sysQuartzramJob) { try
{
scheduler.deleteJob(new JobKey(sysQuartzramJob.getJobName(),sysQuartzramJob.getJobGroup()));
schedulerJob(sysQuartzramJob); sysQuartzramJobService.updateById(sysQuartzramJob);
}
catch (Exception e) {
e.printStackTrace();
return Result.error("异常:" + e.getMessage());
} return Result.ok("成功!");
} /**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "定时任务RAM-批量删除")
@ApiOperation(value="定时任务RAM-批量删除", notes="定时任务RAM-批量删除")
@DeleteMapping(value = "/deleteBatch")
public Result<?> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
this.sysQuartzramJobService.removeByIds(Arrays.asList(ids.split(",")));
return Result.ok("批量删除成功!");
} /**
* 通过id查询
*
* @param id
* @return
*/
@AutoLog(value = "定时任务RAM-通过id查询")
@ApiOperation(value="定时任务RAM-通过id查询", notes="定时任务RAM-通过id查询")
@GetMapping(value = "/queryById")
public Result<?> queryById(@RequestParam(name="id",required=true) String id) {
SysQuartzramJob sysQuartzramJob = sysQuartzramJobService.getById(id);
return Result.ok(sysQuartzramJob);
} /**
* 导出excel
*
* @param request
* @param sysQuartzramJob
*/
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, SysQuartzramJob sysQuartzramJob) {
return super.exportXls(request, sysQuartzramJob, SysQuartzramJob.class, "定时任务RAM");
} /**
* 通过excel导入数据
*
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, SysQuartzramJob.class);
} public void schedulerJob(SysQuartzramJob job) throws Exception {
//构建job信息
Class cls = Class.forName(job.getJobClassName()) ;
// cls.newInstance(); // 检验类是否存在
JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(job.getJobName(),job.getJobGroup())
.withDescription(job.getDescription()).build(); // 触发时间点
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression().trim());
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(TRIGGER_IDENTITY + job.getJobName(), job.getJobGroup())
.startNow().withSchedule(cronScheduleBuilder).build();
//交由Scheduler安排触发
scheduler.scheduleJob(jobDetail, trigger);
} }

5、定时任务初始化类

程序启动后,会自动执行ApplicationInit类,并读取定时任务进行开始执行调度
package org.jeecg.modules.quartz.init;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.jeecg.common.util.DateUtils;
import org.jeecg.modules.quartz.entity.SysQuartzramJob;
import org.jeecg.modules.quartz.enums.JobStatus;
import org.jeecg.modules.quartz.service.ISysQuartzramJobService;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component; import java.io.IOException;
import java.io.InputStream;
import java.util.List; @Component
@Slf4j
public class ApplicationInit implements CommandLineRunner { private static final String TRIGGER_IDENTITY = "trigger";
@Autowired
private ISysQuartzramJobService sysQuartzramJobService;
@Autowired
private Scheduler scheduler; @Override
public void run(String... args) throws Exception { log.info(String.format("程序启动,定时任务开始加载,时间:" + DateUtils.getTimestamp())); loadJobFromDB();
} //这是从数据库表读取定时任务的逻辑
private void loadJobFromDB() throws Exception {
try { QueryWrapper<SysQuartzramJob> queryWrapper = new QueryWrapper<SysQuartzramJob>();
List<SysQuartzramJob> list=sysQuartzramJobService.list(queryWrapper);
for(SysQuartzramJob job : list)
{
schedulerJob(job);
if (JobStatus.PAUSED.getStatus().equals(job.getTriggerState())) {
scheduler.pauseJob(new JobKey(job.getJobName(), job.getJobGroup()));
}
} }
catch (Exception e)
{
log.error(e.getMessage(),e);
}
} public void schedulerJob(SysQuartzramJob job) throws Exception {
//构建job信息
Class cls = Class.forName(job.getJobClassName()) ;
// cls.newInstance(); // 检验类是否存在
JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(job.getJobName(),job.getJobGroup())
.withDescription(job.getDescription()).build(); // 触发时间点
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression().trim());
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(TRIGGER_IDENTITY + job.getJobName(), job.getJobGroup())
.startNow().withSchedule(cronScheduleBuilder).build();
//交由Scheduler安排触发
scheduler.scheduleJob(jobDetail, trigger);
}
}

6、job定时任务样例

package org.jeecg.modules.quartz.job;

import org.jeecg.common.util.DateUtils;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; import lombok.extern.slf4j.Slf4j; /**
* 示例不带参定时任务
*
* @Author Scott
*/
@Slf4j
public class SampleJob implements Job { @Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { log.info(String.format(" Jeecg-Boot 普通定时任务 SampleJob ! 时间:" + DateUtils.getTimestamp()));
}
}

本文参考了最佳实践博文:https://www.cnblogs.com/youzhibing/p/10208056.html

spring-boot集成Quartz-job存储方式二RAM的更多相关文章

  1. spring boot集成pagehelper(两种方式)

    当spring boot集成好mybatis时候需要进行分页,我们首先添加maven支持 <dependency> <groupId>com.github.pagehelper ...

  2. Spring Boot集成quartz实现定时任务并支持切换任务数据源

    org.quartz实现定时任务并自定义切换任务数据源 在工作中经常会需要使用到定时任务处理各种周期性的任务,org.quartz是处理此类定时任务的一个优秀框架.随着项目一点点推进,此时我们并不满足 ...

  3. spring boot 集成 quartz 定时任务

    spring boot: @EnableScheduling开启计划任务支持,@Scheduled计划任务声明 1.pom.xml 引入依赖 <dependency> <groupI ...

  4. Spring Boot集成Quartz注入Spring管理的类

    摘要: 在Spring Boot中使用Quartz时,在JOB中一般需要引用Spring管理的Bean,通过定义Job Factory实现自动注入. Spring有自己的Schedule定时任务,在S ...

  5. Spring boot 集成三种定时任务方式

    三种定时任务方式分别为 org.springframework.scheduling.annotation.Scheduled java.util.concurrent.ScheduledExecut ...

  6. Spring boot 集成三种拦截方式

    三种拦截方式分别为: javax.servlet.Filter org.springframework.web.servlet.HandlerInterceptor org.aspectj.lang. ...

  7. Quartz与Spring Boot集成使用

    上次自己搭建Quartz已经是几年前的事了,这次项目中需要定时任务,需要支持集群部署,想到比较轻量级的定时任务框架就是Quartz,于是来一波. 版本说明 通过搜索引擎很容易找到其官网,来到Docum ...

  8. Spring Boot集成持久化Quartz定时任务管理和界面展示

    本文是对之前的一篇文章Spring+SpringMVC+mybatis+Quartz整合代码部分做的一个修改和补充, 其中最大的变化就是后台框架变成了Spring Boot. 本工程所用到的技术或工具 ...

  9. Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件

    上一篇文章,写了如何搭建一个简单的Spring boot项目,本篇是接着上一篇文章写得:Spring boot入门:快速搭建Spring boot项目(一),主要是spring boot集成mybat ...

  10. Spring Boot集成MyBatis的2种方式

    目录 写在前面 准备工作 配置数据库驱动 配置数据源 原生集成MyBatis 依赖配置 注册MyBatis核心组件 定义并使用映射器 通过MyBatis-Spring-Boot-Starter集成 默 ...

随机推荐

  1. 15 CSS总结

    15 CSS总结 到此,css的知识就结束了,掌握这些知识,搞爬虫足够了.如果朋友还有兴趣可以去css其他学习网站去看看其他的一些属性用法,(菜鸟教程 https://www.runoob.com/c ...

  2. #对偶图最短路,网络流#洛谷 4001 [ICPC-Beijing 2006]狼抓兔子

    题目 网格图最小割\((n,m\leq 1000)\) 分析 首先网络流可以过,但是由于无向图,所以残量网络容量也为\(w\),\(Dinic\)玄学AC,代码就不贴了 那有没有其它方法呢,网格图显然 ...

  3. #计数,记忆化搜索#C 连边方案

    分析 设\(dp[i][j][k][l]\)表示处理到\([i-l+1,i]\)的连边,二进制状态(奇点还是偶点)为\(k\)的方案数, 最后一维是为了避免算重,那么如果第\(i-l+1\)位是偶点可 ...

  4. JDK14性能管理工具:jstat使用介绍

    目录 简介 JStat命令 JStat Output Options class compiler gc gccapacity gcnew gcnewcapacity gcold gcoldcapac ...

  5. [llama懒人包]ChatGPT本地下位替代llama-7b,支持全平台显卡/CPU运行

    LLAMA的懒人包: 链接: https://pan.baidu.com/s/1xOw8-eP8QB--u6y644_UPg?pwd=0l08 提取码:0l08 模型来源:elinas/llama-7 ...

  6. SQL 查询优化指南:SELECT、SELECT DISTINCT、WHERE 和 ORDER BY 详解

    SELECT 关键字 SQL的SELECT语句用于从数据库中选择数据.SELECT语句的基本语法如下: SELECT column1, column2, ... FROM table_name; 其中 ...

  7. 【版本发布公告】HMS Core6.5.0来啦

    新 能 力 3D Engine 3D Engine提供高性能.高画质.高扩展性的实时3D引擎,并提供便捷高效的可视化开发工具.开发者可基于华为的3D Studio开发工具,通过图形和渲染.动画.UI等 ...

  8. C++调用Python-0:搭建环境

    1.进入到Python安装目录 2.将Python安装目录中的 include 和 libs 文件夹放在 C++项目中 3.设置 附加包含目录 和 附加库目录.附加依赖项(python310_d.li ...

  9. 动态库 DLL 封装三:对dll二次封装,并将回调函数放出去,供别人调用

    背景: 我需要对一个dll进行二次封装,其中有一个接口,里面的参数需要传回调函数. 需求: 这个回调函数,我需要开放出去,让别人调用我的dll时,自己写这个回调函数 示例: // 回调原型 VOID ...

  10. 重新整理数据结构与算法(c#)—— 线索化二叉树[二十]

    前言 为什么会有线索化二叉树呢? 是这样子的,二叉树呢,比如有n个节点,那么就有n+1个空指针域. 这个是怎么来的呢?比如我们假如一个节点都有左子树和右子树,那么就有2n个节点. 但是我们发现连接我们 ...