1.quartz是什么?

Quartz 是一个完全由 Java 编写的开源作业调度框架,支持各种灵活的应用方式,并同时支持分布式和集群能力。2.quartz的基本要素

2.quartz的基本要素

Scheduler 代表一个调度容器 JobDetail 表示一个具体的可执行的调度程序
Trigger 代表一个调度参数的配置
Job 表示一个工作,要执行的具体内容

3.quartz结合springboot使用(maven工程)

3.1 引入包 pom文件

<!-- quartz及spring任务支持 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.13.RELEASE</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 使用HikariCP数据库连接池 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
<!-- 工具 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

3.2 先自定义一个类实现spring的QuartzJobBean并重写executeInternal,该类实现了Job类

@Slf4j
public class MyJob extends QuartzJobBean { @Override
public void executeInternal(JobExecutionContext context){
log.info("线程【{}】开始执行,时间【{}】",Thread.currentThread().getName(),new Date());
}
}

3.3 创建JobDetail,Trigger

@Configuration
public class JobDetailAndTriggerConfig {
@Bean("myJobDetail")
public JobDetailFactoryBean getJobDetail(){
JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
//Job的实现类类对象
jobDetailFactoryBean.setJobClass(MyJob.class);
//任务的名称,框架需要通过此名称进行关联,所以需要保证唯一性
jobDetailFactoryBean.setName("myJob");
//任务组,默认为“DEFAULT”,取值Scheduler.DEFAULT_GROUP
jobDetailFactoryBean.setGroup("myJob Group");
//任务描述信息,可以用来传递字符串参数,但是尽量不要这么干
jobDetailFactoryBean.setDescription("myJob Description");
//类似Map类,可以通过此类的对象向Job的execute方法中传递业务参数
//jobDetailFactoryBean.setJobDataMap(null);
//Job执行完后是否继续持久化到数据库,默认为false
jobDetailFactoryBean.setDurability(true);
return jobDetailFactoryBean;
}
@Bean("myJobTrigger")
public CronTriggerFactoryBean getTrigger(@Qualifier("myJobDetail")JobDetail jobDetail){
//使用cronTrigger
CronTriggerFactoryBean triggerFactoryBean = new CronTriggerFactoryBean();
//自定义的jobDetail对象
triggerFactoryBean.setJobDetail(jobDetail);
//触发器的名称
triggerFactoryBean.setName("myJobTrigger");
//触发器的任务组
triggerFactoryBean.setGroup("myJobTrigger group");
//触发器的描述信息
triggerFactoryBean.setDescription("myJobTrigger description");
//cron表达式
triggerFactoryBean.setCronExpression("0/3 * * * * ?");
//延迟时间
triggerFactoryBean.setStartDelay(0);
//设置misfire的任务策略;MISFIRE_INSTRUCTION_DO_NOTHING则不对misfire的任务做特殊处理,只从当前时间之后的下一次正常调度时间开始执行
triggerFactoryBean.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
//类似Map类,可以通过此类的对象向Job的execute方法中传递业务参数
//triggerFactoryBean.setJobDataMap(null);
return triggerFactoryBean;
}
}

3.4 创建Scheduler 并注册JobDetail,Trigger,然后启动Scheduler

@Slf4j
@Configuration
public class QuartzSchedulerConfig {
@Autowired
private DataSource dataSource;
@Bean
public SchedulerFactoryBean schedulerFactoryBean(ApplicationContext applicationContext) {
//创建调度器工厂
SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
//设置覆盖任务
schedulerFactory.setOverwriteExistingJobs(true);
schedulerFactory.setDataSource(dataSource);
schedulerFactory.setSchedulerName("myTestScheduler");
schedulerFactory.setConfigLocation(new ClassPathResource("quartz.properties"));
Map<String, Trigger> triggers = applicationContext.getBeansOfType(Trigger.class);
Collection<Trigger> triggerList = (null != triggers && !triggers.isEmpty()) ? triggers.values(): Collections.emptyList();
schedulerFactory.setTriggers(triggerList.toArray(new Trigger[triggerList.size()]));
//schedulerFactory.setJobFactory();不设置时使用默认的AdaptableJobFactory,可以自定义继承SpringBeanJobFactory
// 并且要将createJobInstance()创建的实例交由spring自动注入这样才能在job执行方法中注入spring的其他实例,如使用@Service或其他注解的对象自动注入
return schedulerFactory;
}
}

3.5 配置quartz配置文件及数据源文件

# 数据源相关配置
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mytest?tinyInt1isBit=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull
username: root
password: 123456
hikari:
connection-test-query: SELECT 1 FROM DUAL
minimum-idle: 3
maximum-pool-size: 24
pool-name: ${spring.application.name}-CP
idle-timeout: 10000
leakDetectionThreshold: 2000
#quartz配置
#调度标识名 集群中每一个实例都必须使用相同的名称 (区分特定的调度器实例)
org.quartz.scheduler.instanceName=bpsp-service-job
#ID设置为自动获取 每一个必须不同 (所有调度器实例中是唯一的)
org.quartz.scheduler.instanceId=AUTO
#线程数量
org.quartz.threadPool.threadCount=5
#数据保存方式为持久化 (也可以指定使用本地内存)
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
#指定委托类
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#设置为TRUE不会出现序列化非字符串类到 BLOB 时产生的类版本问题
org.quartz.jobStore.useProperties=true
#容许的最大作业延长时间(超过该事件则为misfire)
org.quartz.jobStore.misfireThreshold=60000
#表的前缀
org.quartz.jobStore.tablePrefix=qrtz_
#加入集群 true 为集群 false不是集群
org.quartz.jobStore.isClustered=true
#调度实例失效的检查时间间隔
org.quartz.jobStore.clusterCheckinInterval=20000
#自带的管理组件plugin
org.quartz.plugin.shutdownHook.class=org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownHook.cleanShutdown=TRUE
org.quartz.plugin.triggHistory.class=org.quartz.plugins.history.LoggingTriggerHistoryPlugin
org.quartz.plugin.jobHistory.class=org.quartz.plugins.history.LoggingJobHistoryPlugin
#每次获取trigger时加锁(默认false)
org.quartz.jobStore.acquireTriggersWithinLock=true

4.运行结果

2019-06-06 17:41:45.030  INFO 7532 --- [eduler_Worker-4] com.example.springbootquartz.job.MyJob   : 线程【myTestScheduler_Worker-4】开始执行,时间【Thu Jun 06 17:41:45 CST 2019】
2019-06-06 17:41:45.030 INFO 7532 --- [eduler_Worker-4] o.q.p.history.LoggingJobHistoryPlugin : Job myJob Group.myJob execution complete at 17:41:45 06/06/2019 and reports: null
2019-06-06 17:41:45.042 INFO 7532 --- [eduler_Worker-4] o.q.p.h.LoggingTriggerHistoryPlugin : Trigger myJobTrigger group.myJobTrigger completed firing job myJob Group.myJob at 17:41:45 06/06/2019 with resulting trigger instruction code: DO NOTHING
2019-06-06 17:41:48.026 INFO 7532 --- [eduler_Worker-5] o.q.p.h.LoggingTriggerHistoryPlugin : Trigger myJobTrigger group.myJobTrigger fired job myJob Group.myJob at: 17:41:48 06/06/2019
2019-06-06 17:41:48.026 INFO 7532 --- [eduler_Worker-5] o.q.p.history.LoggingJobHistoryPlugin : Job myJob Group.myJob fired (by trigger myJobTrigger group.myJobTrigger) at: 17:41:48 06/06/2019
2019-06-06 17:41:48.026 INFO 7532 --- [eduler_Worker-5] com.example.springbootquartz.job.MyJob : 线程【myTestScheduler_Worker-5】开始执行,时间【Thu Jun 06 17:41:48 CST 2019】
2019-06-06 17:41:48.026 INFO 7532 --- [eduler_Worker-5] o.q.p.history.LoggingJobHistoryPlugin : Job myJob Group.myJob execution complete at 17:41:48 06/06/2019 and reports: null
2019-06-06 17:41:48.026 INFO 7532 --- [eduler_Worker-5] o.q.p.h.LoggingTriggerHistoryPlugin : Trigger myJobTrigger group.myJobTrigger completed firing job myJob Group.myJob at 17:41:48 06/06/2019 with resulting trigger instruction code: DO NOTHING
2019-06-06 17:41:51.035 INFO 7532 --- [eduler_Worker-1] o.q.p.h.LoggingTriggerHistoryPlugin : Trigger myJobTrigger group.myJobTrigger fired job myJob Group.myJob at: 17:41:51 06/06/2019
2019-06-06 17:41:51.036 INFO 7532 --- [eduler_Worker-1] o.q.p.history.LoggingJobHistoryPlugin : Job myJob Group.myJob fired (by trigger myJobTrigger group.myJobTrigger) at: 17:41:51 06/06/2019
2019-06-06 17:41:51.036 INFO 7532 --- [eduler_Worker-1] com.example.springbootquartz.job.MyJob : 线程【myTestScheduler_Worker-1】开始执行,时间【Thu Jun 06 17:41:51 CST 2019】
2019-06-06 17:41:51.036 INFO 7532 --- [eduler_Worker-1] o.q.p.history.LoggingJobHistoryPlugin : Job myJob Group.myJob execution complete at 17:41:51 06/06/2019 and reports: null

quartz的使用(一)的更多相关文章

  1. 免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

    很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...

  2. Quartz

    Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中.它提供了巨大的灵 活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复杂的调度. eg: ja ...

  3. Spring Quartz实现任务调度

    任务调度 在企业级应用中,经常会制定一些"计划任务",即在某个时间点做某件事情 核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作 任务调度涉及多线程并发.线程池维 ...

  4. topshelf和quartz内部分享

    阅读目录: 介绍 基础用法 调试及安装 可选配置 多实例支持及相关资料 quartz.net 上月在公司内部的一次分享,现把PPT及部分交流内容整理成博客. 介绍 topshelf是创建windows ...

  5. Quartz.net持久化与集群部署开发详解

    序言 我前边有几篇文章有介绍过quartz的基本使用语法与类库.但是他的执行计划都是被写在本地的xml文件中.无法做集群部署,我让它看起来脆弱不堪,那是我的罪过. 但是quart.net是经过许多大项 ...

  6. Quartz.net开源作业调度框架使用详解

    前言 quartz.net作业调度框架是伟大组织OpenSymphony开发的quartz scheduler项目的.net延伸移植版本.支持 cron-like表达式,集群,数据库.功能性能强大更不 ...

  7. quartz.net 时间表达式----- Cron表达式详解

    序言 Cron表达式:就是用简单的xxoo符号按照一定的规则,就能把各种时间维度表达的淋漓尽致,无所不在其中,然后在用来做任务调度(定时服务)的quart.net中所认知执行,可想而知这是多么的天衣无 ...

  8. Quartz.NET Windows 服务示例

    想必大家在项目中处理简单的后台持续任务或者定时触发任务的时候均使用 Thread 或者 Task 来完成,但是项目中的这种需求一旦多了的话就得将任务调度引入进来了,那今天就简单的介绍一下 Quartz ...

  9. [Quartz笔记]玩转定时调度

    简介 Quartz是什么? Quartz是一个特性丰富的.开源的作业调度框架.它可以集成到任何Java应用. 使用它,你可以非常轻松的实现定时任务的调度执行. Quartz的应用场景 场景1:提醒和告 ...

  10. 关于Quartz.NET作业调度框架的一点小小的封装,实现伪AOP写LOG功能

    Quartz.NET是一个非常强大的作业调度框架,适用于各种定时执行的业务处理等,类似于WINDOWS自带的任务计划程序,其中运用Cron表达式来实现各种定时触发条件是我认为最为惊喜的地方. Quar ...

随机推荐

  1. 热修复框架Tinker的从0到集成之路(转)

    转自:http://blog.csdn.net/lisdye2/article/details/54411727 热修复框架Tinker的从0到集成之路 转载请标明出处: http://blog.cs ...

  2. eclipse启动Failed to load the JNI shared library

    由于安装jdk安装了多个版本,用其他开发工具,某天再打开eclipse时弹出“Failed to load the JNI shared library jvm.dll” 原因:eclipse的版本与 ...

  3. python -jieba 安装+分词+定位

    1.jieba 库安装 方法1:全自动安装(容易失败):easy_install jieba 或者 pip install jieba / pip3 install jieba 方法2:半自动安装(推 ...

  4. Shiro学习(14)SSL

    对于SSL的支持,Shiro只是判断当前url是否需要SSL登录,如果需要自动重定向到https进行访问. 首先生成数字证书,生成证书到D:\localhost.keystore 使用JDK的keyt ...

  5. 【LeetCode 9】回文数

    题目链接 [题解] 还是要注意,取反的时候,-2^31 取反的话会爆掉Int..(因为int的正数最多到2^31-1) [代码] class Solution { public: bool isPal ...

  6. STL————bitset

    C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间. bitset<> bitset1; //无参构造,长度为 ...

  7. BZOJ 4319: cerc2008 Suffix reconstruction(后缀数组)

    题面 Description 话说练习后缀数组时,小C 刷遍 poj 后缀数组题, 各类字符串题闻之丧胆.就在准备对敌方武将发出连环杀时,对方一记无中生有,又一招顺 手牵羊,小C 程序中的原字符数组就 ...

  8. NX二次开发-BlockUI的Tree树控件

    关于BlockUI的Tree树控件只要研究UGOPEN里西门子官方的那个例子在结合去查NXOPEN的帮助基本就可以了.[不过我是看唐工的视频学会的,没办法自己领悟性不太强] //=========== ...

  9. docker仓库管理(9)

    使用公共 Registry Docker Hub 是 Docker 公司维护的公共 Registry.用户可以将自己的镜像保存到 Docker Hub 免费的 repository 中.如果不希望别人 ...

  10. sqlserver 登录记录(登录触发器)

    本人自用 sqlserver  账号登录的记录(记录表+登录触发器) --存储账号的登录记录信息 use [YWmonitor] go create table access_log ( ,) NOT ...