quartz

SpringBoot | 第二十二章:定时任务的使用

淺唱寂寞╮ 提交于 2019-11-28 22:57:54
前言 上两章节,我们简单的讲解了关于异步调用和异步请求相关知识点。这一章节,我们来讲讲开发过程也是经常会碰见的定时任务。比如每天定时清理无效数据、定时发送短信、定时发送邮件、支付系统中的定时对账等等,往往都会定义一些定时器,进行此业务的开发。所以,本章节介绍下在 SpringBoot 中定时任务如何使用及一点分布式定时服务的思考总结。 一点知识 在 JAVA 开发领域,目前可以通过以下几种方式进行定时任务: Timer:jdk中自带的一个定时调度类,可以简单的实现按某一频度进行任务执行。提供的功能比较单一,无法实现复杂的调度任务。 ScheduledExecutorService:也是jdk自带的一个基于线程池设计的定时任务类。其每个调度任务都会分配到线程池中的一个线程执行,所以其任务是并发执行的,互不影响。 Spring Task: Spring 提供的一个任务调度工具,支持注解和配置文件形式,支持 Cron 表达式,使用简单但功能强大。 Quartz:一款功能强大的任务调度器,可以实现较为复杂的调度功能,如每月一号执行、每天凌晨执行、每周五执行等等,还支持分布式调度,就是配置稍显复杂。 题外话:对于 Quartz ,早前用过1.6版本的,更新到2.x及以上版本后基本没怎么接触了,原来还有倒腾过结合 Kettle 做了一些动态的定时抽取数据啥的还编写过一个 Cron 表达式编辑器

springBoot2.x设置quartz的overwriteExistingJobs参数

喜欢而已 提交于 2019-11-28 22:57:41
背景 springBoot2.x中集成了quartz的自动配置类(QuartzAutoConfiguration),但是springBoot提供的配置属性中并没有提供overwriteExistingJobs这个属性的设置。 导致的问题 假如我们使用quartz自带的数据库对任务进行了持久化且系统并没有提供对任务的界面化操作。当我们需要对任务进行修改时,更改了代码或者配置文件中的信息,如参数、corn表达式等,会发现新的表达式并没有生效(原因是我们没有设置overwriteExistingJobs参数) 解决方案 在quartz自动初始化之后,我们获取SchedulerFactory,设置overwriteExistingJobs参数,然后获得Scheduler,通过Scheduler重新设置所有Trigger. 代码实现 package com.koolyun.eas.account.scheduler.config; import org.quartz.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot

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

倾然丶 夕夏残阳落幕 提交于 2019-11-28 20:07:10
org.quartz实现定时任务并自定义切换任务数据源 在工作中经常会需要使用到定时任务处理各种周期性的任务,org.quartz是处理此类定时任务的一个优秀框架。随着项目一点点推进,此时我们并不满足于任务仅仅是定时执行,我们还想要对任务进行更多的控制,随时能对任务进行人为干预,就需要对quartz有更深入的了解。而随着微服务的流行,项目中多数据源的情况也越来越常见,在定时任务中集成多数据源切换的功能也需要集成进来。 集成quartz实现定时任务 集成quartz实现定时任务 quartz中实现定时任务需要了解的基本概念 Job 通过实现 Job 类,在实现方法中写我们具体想要定时任务完成的工作,然后交给 quartz 管理。 JobDetail Job 只负责实现具体任务,所以还需要借助 JobDetail 来存储一些描述 Job 的基本信息。 Quartz JobBuilder 为构造 JobDetail 实体提供的 builder-style API 。你可以这样使用它来构建一个 JobDetail : @Bean public JobDetail jobDetail() { return JobBuilder.newJob().ofType(SampleJob.class) .storeDurably() .withIdentity("Qrtz_Job_Detail")

java crm 进销存 springmvc SSM 项目 系统 源码

一个人想着一个人 提交于 2019-11-28 19:22:17
系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3 SSM 普通java web(非maven, 附赠pom.xml文件) 数据库:mysql 3.开发工具:myeclipse eclipse idea 均可, 没有限制. 我这边myeclipse 2014 导出来的项目源码 更新即时通讯功能,支持好友,群组,发图片、文件,消息声音提醒,离线消息,保留聊天记录 客户资料:记录客户资料,备注客户信息,跟踪记录客户状况 客户备注:客户资料附属选项 客户级别:客户资料附属选项 商品列表:维护商品数据,有富文本编辑器,有明细表上传商品图片, 生成商品二维码、条形码 商品类别:商品附属选项 品牌管理:商品附属选项 计量单位:商品附属选项 商品库存:展现商品库存情况,库存小的排最前 商品入库:录入商品入库数据,数量、单价、入库时间。计算某时间范围内的进货总金额 商品出库:录入商品出库数据,数量、销售价格、销售出库时间。计算某时间范围内的销售总金额 (出库即销售,支持一个订单多个商品信息,一对多的关系) 销售报表:列表展示商品销售情况,可根据销量和销售额排序,以便掌握哪个商品卖的好并调整销售方案 系统模块 权限管理:点开二级菜单进入三级菜单显示 角色(基础权限

崛起于Springboot2.0.X之页面统一操作Quartz所有定时任务何时启动(47)

蹲街弑〆低调 提交于 2019-11-28 18:40:44
(记得来开源中国关注我哟!如果博客被我发现有不好的地方,都会优化更新的,所以关注我呦,嘻嘻) 技术栈:Springboot2.0.X(2.1.X也可以)+ Quartz +FastMybatis (自认为比mybatis-plus更方便的框架) + Hutool + lombok FastMybatis框架博客: 01、 崛起于Springboot2.0.X之入门FastMybatis --> my.oschina.net/mdxlcj/blog/1835665 02、 崛起于Springboot2.0.X之整合FastMybatis精装版 --> my.oschina.net/mdxlcj/blog/3059687 03、 FastMybatis框架快速入门 --> 官方文档 Quartz入门级框架博客: 04、 崛起于Springboot2.0.X之集成Quartz定时调度 --> my.oschina.net/mdxlcj/blog/1862472 序言:之前公司有一个需求说是可以通过一个界面来操作定时任务的时间、包括修改、启动、关闭等功能,而不是在代码中写死,那个时候从网上找了很久都没有找到,博客都特别初级,只能算是入门的后来就不了了之了,目前已经实现开发出这套功能,公开一下,我也希望能够帮助更多的人在企业更加快速的实现该功能,如图: 然后我们看一下,新增定时任务配置截图:

08.Quartz 监听器-SchedulerListener

谁说我不能喝 提交于 2019-11-28 18:18:56
SchedulerListener 是用于监控调度器scheduler 中添加,删除定时任务或触发器等操作, 和JobListener, TriggerListener类似, 但由有不同. SchedulerListener 全局唯一, 也就是说一个Scheduler 只能配置一个SchedulerListener 监听器. 1. SchedulerListener 接口 和JobListener/TriggerListener类似, 自定义SchedulerListener 需要实现SchedulerListener接口或继承SchedulerListenerSupport, 并重写关注的方法. 这里笔者推荐使用第二种方式, 因为第一种方式需要实现方法太多. SchedulerListener 定义的接口方法, 每一个方法都是监听对应的Scheduler中定义的方法. SchedulerListener 也不会持久化到数据库, 更不支持分布式. 需要每次启动应用时注册. public interface SchedulerListener { public void jobScheduled ( Trigger trigger ) ; public void jobUnscheduled ( String triggerName , String triggerGroup ) ;

07.Quartz 监听器-TriggerListener

五迷三道 提交于 2019-11-28 18:18:54
TriggerListner 用于监听触发器的相关创建, 用于在触发器触发前后做一些自定义操作. quartz 中TriggerListener的设计思想和JobListener 的设计思想如出一辙. 和JobListener 类似, quartz 2.x 也不再进行持久化操作. 1. TriggerListener 定义 quartz 提供了两种方式自定义自己的TriggerListener, 一种是实现TriggerListener接口, 需要实现所有Listener 自定义的方法; 另一种是继承TriggerListenerSuppoer 类, 只需实现自己关注的方法即可. 1.1 TriggerListener 接口定义 public interface TriggerListener { // 返回trigger名称 String getName ( ) ; // 触发器触发时调用此方法 void triggerFired ( Trigger trigger , JobExecutionContext context ) ; boolean vetoJobExecution ( Trigger trigger , JobExecutionContext context ) ; // 触发器触发,但是定时任务无法执行执行时调用此方法 void triggerMisfired

06.Quartz 监听器-JobListener

天大地大妈咪最大 提交于 2019-11-28 18:18:52
JobListener 可用于监听定时任务执行的事件, 并在定时任务执行前后做一些自定义操作, 类似于java 切面编程的环绕通知. 需要注意的时,quartz 2.x系列, 监听器已不再进行持久化操作, 自然也就没有分布式监听这一说了. 在quartz 1.x 时, 数据库表还有监听器相关的表, 笔者猜测quartz1.x 应该对监听器也做了持久化吧. 在自定义 1. JobListener 定义 quartz 提供了两种方式自定义自己的JobListner, 一种是实现JobListener接口, 需要实现所有Listener 自定义的方法; 另一种是继承JobListenerSuppoer 类, 只需实现自己关注的方法即可. 1.1 JobListener 接口定义 public interface JobListener { // 监听器名称 public String getName ( ) ; // 定时任务执行前执行, 相当于切面编程中的前置通知 public void jobToBeExecuted ( JobExecutionContext context ) ; // TriggerListener 否决了执行时触发 public void jobExecutionVetoed ( JobExecutionContext context ) ; //

04.Quartz 触发器

余生颓废 提交于 2019-11-28 18:18:48
Quartz 触发器分为两种SimpleTrigger 和 CronTrigger, SimplerTrigger 适用于以固定时间间隔执行重复N次或延时执行一次的定时任务, CronTrigger 适用于按照日历规则来执行定时任务, 如每月最后一天触发一次, 每周一触发一次等. 1. 核心API quartz 提供了一组API, 用于快捷地创建SimpleTrigger或CronTrigger: TriggerBuilder: 用于构建触发器, 可以设置公有属性:触发器名称, 描述信息, 开始调度时间, 结束时间等 DateBuilder: 时间工具类, 可便捷设置触发器开始调度时间和结束调度时间. SimpleScheduleBuilder: 用于构建simple触发器, 需要设置重复间隔, 重复次数 CronScheduleBuilder: 用于构建cron触发器, 需要设置cron 表达式 2. 触发器创建实例 2.1 创建SimpleTrigger SimpleTrigger 创建时, 需指定定时任务间隔和重复次数. Trigger trigger1 = TriggerBuilder . newTrigger ( ) . withIdentity ( "trigger1" , "simpTrigger" ) . withDescription ( "每隔3秒触发一次,

03.Quartz 定时任务-Job 和 JobDetail

家住魔仙堡 提交于 2019-11-28 18:18:46
Quartz 中自定义Job实现方式很简单, 只需要实现Job接口并实现其execute方法即可. 将自定义job添加到调度列表时, 需将Job封装称JobDetail, 并设置job的标识符等信息. 需要特别注意的是, 当定时任务触发时, 调度器Scheduler 会获取JobDetail中关联的Job类信息, 并创建Job实例, 然后执行其execute方法. 当execute 方法执行完后, 会丢弃新创建的Job实例, 任其等待java 的垃圾回收. 1. 核心概念 Job: 用于定义定时任务触发时的执行体, 即定时任务要处理的业务逻辑. 需要实现Job接口, 并重写execute接口 JobDetail: 用于定义Job的基础信息, 如job的标识符, 描述等. 通常借助于JobBuilder 快速创建. JobBuilder: 快捷构建JobDetail 的工具类 1.1 Job 接口定义 自定义job时需要实现Job接口, 并重写job的唯一方法execute方法. package org . quartz ; public interface Job { void execute ( JobExecutionContext context ) throws JobExecutionException ; } 1.2 JobBuilder 常用API