springBoot项目集成quartz开发定时任务案例及注意事项

目录
  • quartz下载、安装
  • 实战案例
  • 常见问题及解决方案

quartz下载、安装

Quartz是完全由java开发的一个开源的任务日程管理系统,任务进度管理器就是一个在预先确定的时间到达时,负责执行(或者通知)一段程序或功能的系统,即定时执行某个任务
Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了所有Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。

上图是quartz服务涉及的11张表, 下面这个图是maven中引入的quartz依赖包

Quartz的jar包下载、SpringBoot项目整合Quartz安装及具体的使用方法本站已经有很多,但是还是建议参考W3CSchool的官方文档 Quartz快速入门指南

官方文档地址: https://www.w3cschool.cn/quartz_doc/quartz_doc-2put2clm.html

实战案例

假如我开发环境已经配置好,我们只关注具体业务实现。实际上做项目的过程中也很少会让开发自己去集成组件,通常都是开发环境已经配置好了,如果需要配置的话还是像上面说的,看官方文档吧。
现在有个需求是每天凌晨把某个登记表A的信息筛选后刷到B表中,先贴上代码:

//RefreshTableJob.java的代码
@Component("RefreshTableJob")
public class RefreshTableJob {
    private static final Logger logger = LoggerFactory.getLogger(RefreshIdleAssetJob.class);
    public void PullData(){
        try{
            SpringUtils.getBean(IassetService.class).initIdleAssetList();
        } catch (RestClientResponseException e) {
            logger.error("数据同步失败,error:"+e.getMessage());
        }catch (Exception e) {
            e.printStackTrace();
            logger.error("数据同步失败,error:"+e.getMessage());
        }
    }
}
//assetServiceImpl.java的代码 实现了IassetService接口
@Service
public class IdleAssetServiceImpl implements IaAssetService{
@Resource
private IdleAssetMapper idleAssetMapper;
/**
 * 拉取增量闲置资产数据
 */
@Override
@Transactional
public void initIdleAssetList(){
    // 处理闲置数据
    List<HashMap> initList = idleAssetMapper.selectIdleList(null);
    while (initList != null && initList.size() > 0){
        for(HashMap data : initList){
            HashMap paramMap = new HashMap();
            String uuid = UUID.randomUUID().toString().trim();
            paramMap.put("UPDATETIME", DateUtils.getNowDate());
            paramMap.put("UPDATEUSER", "");
            paramMap.put("STATUS", data.get("A_STATUS"));
            // 。。。。这里省略了很多字段
            paramMap.put("USAGESECRET", data.get("A_USAGESECRET"));
            paramMap.put("BELONGENTITYID", data.get("A_ID"));
            idleAssetMapper.saveIdleAsset(paramMap);
        }
        initList = idleAssetMapper.selectEquipIdleList(null);
    }
    logger.info("设备仪器表闲置资产数据获取完成");

RefreshTableJob.java就是定时任务执行的入口,它的主要逻辑是调用service实现类中的initIdleAssetList方法,调用Mybatis的mapper文件查询数据库表A的增量数据,循环处理后刷入B表,配置的cron表达式是 0 0 2 1/1 * ? * (每天两天执行一次)。

常见问题及解决方案

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.bjsasc.openshare.idleasset.service.IassetService' available
原因:定时任务类RefreshTableJob中找不到IassetService这个类
解决方法:
在系统的启动类的main方法中加上这么一行配置信息,仅本地调试的时候加哦,这行代码不用提交,生产环境没有这个问题,不知道为啥子
System.setProperty(“spring.devtools.restart.enabled”, “false”);

java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request. 直接原因:我在插入B表的时候看到有个创建人字段,想获取系统中的当前登录用户信息,结果获取不到request相关对象

相信查过资料的朋友看到了网上说的设置request子线程共享或者重新实现RequestAttributes接口的方式了,这俩方案只是屏蔽报错的,如果只是想屏蔽报错,那直接删掉出错位置的代码或者写个自定义接口实现类判断一下requestAttributes 为空时new一个就完了。

那怎么获取当前登录用户呢?
答案是获取不到,定时任务可以在不登陆系统的情况下运行,对于在controller层调用service方法(WEB访问方式)中使用RequestContextHolder或者WebApplicationContext对象获取上下文的情况完全没有问题。但是除了controller层外,调度任务等也可能调用service层的方法(非web方式根本不存在request对象),这种情况下不能使用上下文对象获取其中的用户信息。
如果你非要娶,可以提前把用户登录信息存到redis或者其他渠道,看起来有点麻烦,真有这样的需求吗,showme探讨一下。

到此这篇关于springBoot项目集成quartz开发定时任务案例及注意事项的文章就介绍到这了,更多相关springBoot集成quartz开发定时任务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot集成quartz实现定时任务详解

    目录 准备知识点 什么是Quartz Quartz的体系结构 什么是Quartz持久化 实现案例 - 单实例方式 实现案例 - 分布式方式 后端实现 前端实现 测试效果 准备知识点 需要了解常用的Quartz框架. 什么是Quartz 来源百度百科, 官网地址:http://www.quartz-scheduler.org/ Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来

  • SpringBoot中使用Quartz管理定时任务的方法

    定时任务在系统中用到的地方很多,例如每晚凌晨的数据备份,每小时获取第三方平台的 Token 信息等等,之前我们都是在项目中规定这个定时任务什么时候启动,到时间了便会自己启动,那么我们想要停止这个定时任务的时候,就需要去改动代码,还得启停服务器,这是非常不友好的事情 直至遇见 Quartz,利用图形界面可视化管理定时任务,使得我们对定时任务的管理更加方便,快捷 一.Quartz 简介 Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中.它提供了巨大的灵

  • springboot整合quartz定时任务框架的完整步骤

    目录 Spring整合Quartz pom文件 对应的properties 文件 配置类 自定义任务类:ScheduledTask 获取spring中bean的工具类:SpringContextUtil 定时任务服务接口:QuartzService QuartzService实现类:QuartzServiceImpl ScheduledTaskRunner类 任务实体类:QuartzTask 任务service层 service实现类 任务controller 数据表 具体使用 具体效果 总结

  • springboot整合quartz实现定时任务示例

    在做项目时有时候会有定时器任务的功能,比如某某时间应该做什么,多少秒应该怎么样之类的. spring支持多种定时任务的实现.我们来介绍下使用spring的定时器和使用quartz定时器 1.我们使用spring-boot作为基础框架,其理念为零配置文件,所有的配置都是基于注解和暴露bean的方式. 2.使用spring的定时器: spring自带支持定时器的任务实现.其可通过简单配置来使用到简单的定时任务. @Component @Configurable @EnableScheduling p

  • Springboot整个Quartz实现动态定时任务的示例代码

    简介 Quartz是一款功能强大的任务调度器,可以实现较为复杂的调度功能,如每月一号执行.每天凌晨执行.每周五执行等等,还支持分布式调度.本文使用Springboot+Mybatis+Quartz实现对定时任务的增.删.改.查.启用.停用等功能.并把定时任务持久化到数据库以及支持集群. Quartz的3个基本要素 Scheduler:调度器.所有的调度都是由它控制. Trigger: 触发器.决定什么时候来执行任务. JobDetail & Job: JobDetail定义的是任务数据,而真正的

  • springboot整合Quartz实现动态配置定时任务的方法

    前言 在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置,下面就通过一个简单的示例,来实现这个功能. 一.新建一个springboot工程,并添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency

  • SpringBoot集成Quartz实现定时任务的方法

    1 需求 在我的前后端分离的实验室管理项目中,有一个功能是学生状态统计.我的设计是按天统计每种状态的比例.为了便于计算,在每天0点,系统需要将学生的状态重置,并插入一条数据作为一天的开始状态.另外,考虑到学生的请假需求,请假的申请往往是提前做好,等系统时间走到实际请假时间的时候,系统要将学生的状态修改为请假. 显然,这两个子需求都可以通过定时任务实现.在网上略做搜索以后,我选择了比较流行的定时任务框架Quartz. 2 Quartz Quartz是一个定时任务框架,其他介绍网上也很详尽.这里要介

  • SpringBoot整合Quartz实现定时任务详解

    目录 Quartz简介 核心概念 Scheduler JobDetail Job Trigger SpringBoot整合Quartz 准备数据库表 Maven相关依赖 配置文件 quartz配置类 创建任务类 创建监听类 运行结果 Quartz简介 Quartz 是一个开源的作业调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复杂的调度.它有很多特征,如:数据库支持,集群,插件,EJB

  • 浅谈SpringBoot集成Quartz动态定时任务

    SpringBoot自带schedule 沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务 注意在程序启动的时候加上@EnableScheduling @Scheduled(cron="0/5 * * * * ?") public void job(){ System.out.println("每五秒执行一次"); } 为什么要使用Quartz 多任务情况下,quartz更容易管理,可以实现动态配置 执行时间表达式: 表达式示例: 集成

  • springBoot项目集成quartz开发定时任务案例及注意事项

    目录 quartz下载.安装 实战案例 常见问题及解决方案 quartz下载.安装 Quartz是完全由java开发的一个开源的任务日程管理系统,任务进度管理器就是一个在预先确定的时间到达时,负责执行(或者通知)一段程序或功能的系统,即定时执行某个任务.Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了所有Quartz核心功能.这些功能的主要接口(API)是Scheduler接口.它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度. 上图是q

  • SpringBoot项目集成xxljob实现全纪录

    目录 xxljob介绍 代码配置过程 1.引入xxl-job的依赖 2.编写配置文件 3. 编写配置类 4.新建Job文件夹,将自己写的类放到此文件夹下 5. 编写业务代码 登录xxl-Job并配置 1.执行器管理--新增执行器 2.任务管理--新增任务 测试: 断点调试 查看调度日志: xxljob介绍 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. 被称为任务调度中心,可做定时任务. 优点特性如下

  • SpringBoot项目集成Flyway进行数据库版本控制的详细教程

    Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式. 第一步:pom.xml添加maven依赖 <!-- https://mvnrepository.com/artifact/org.flywaydb/flyway-core --> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <versi

  • SpringBoot项目集成FTP的方法步骤

    目录 写在前面 FTP相关软件安装 开始集成 引入相关jar包 引入FTPUtils.java和FTPHelper.java 如何使用 写在前面 FTP是一个文件传输协议,被开发人员广泛用于在互联网中文件传输的一套标准协议. 而我们通常在开发过程中也要通过FTP来搭建文件系统,用于存储系统文件等. 目前正值SpringBoot热潮,所以我们接下来会一起学习一下SpringBoot如何集成FTP,以及相关的FTP组件包,还有其主要提供的几个方法. 当然在这系列文章结尾,我们还会给出确切的FTP操作

  • SpringBoot日程管理Quartz与定时任务Task实现详解

    目录 1 Quartz 核⼼概念 Springboot整合Quartz 1.导⼊springboot整合Quartz的starter 2.定义任务Bean 3.创建Quartz配置类 2. Task 1.开启定时任务功能 2.定义Bean 3.配置文件 任务系统指的是定时任务.定时任务是企业级开发中必不可少的组成部分,诸如⻓周期业务数据的计算,都会⽤到定时任务 1 Quartz Quartz是OpenSymphony开源组织在Job scheduling领域的⼀个开源项⽬,完全由Java开发的⼀

  • SpringBoot项目集成Flyway详细过程

    一.Flyway Flyway是独立于数据库的应用.管理并跟踪数据库变更的数据库版本管理工具.用通俗的话讲,Flyway可以像Git管理不同人的代码那样,管理不同人的sql脚本,从而做到数据库同步. 二.流程 1. 首先配置好flyway的基本信息后,运行项目,会在数据库表中默认新建一个数据表用于存储flyway的运行信息,默认的数据库名:flyway_schema_history 2. 紧接着Flyway将开始扫描文件系统或应用程序的类路径进行迁移.然后,Flyway的数据迁移将基于对用sql

随机推荐