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. termcap - 终端功能数据库

    描述 DESCRIPTION termcap 数据库是一个过时 (obsolete) 工具,用来描述以字符为单位的终端和打印机的功能.它之所以被保留,是为了兼容古老的程序:新程序应当使用 termin ...

  2. svnadmin - Subversion 仓库管理工具

    SYNOPSIS 总览 svnadmin command /path/to/repos [options] [args] OVERVIEW 概述 Subversion 是一个版本控制系统,允许保存旧版 ...

  3. Docker部署web环境之总结篇

    3. 问题总结 问题总结1: 数据库容器时区问题以及环境变量的安全控制 docker-compose.yml文件中的环境变量,可以配置的变量方法有两种: 方法一:docker-compose.yml文 ...

  4. windows系统exe文件图标变成了白色无图标

    转载:https://blog.csdn.net/whatday/article/details/52658412   在命令提示符下输入下列命令即可恢复.   按键 “WIN+R” 输入即可cmd ...

  5. 使用openntpd替换ntpd

    系统自带的ntp服务太难用,systemd启动几次没启动起来,懒得折腾,换了openntpd一次成功.

  6. new Date() vs Calendar.getInstance().getTime()

    System.currentTimeMillis() vs. new Date() vs. Calendar.getInstance().getTime() System.currentTimeMil ...

  7. MySQL关闭查询缓存(QC)的两种方法

    MySQL Query Cache 会缓存select 查询,安装时默认是开启的,但是如果对表进行INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE, DROP ...

  8. java多线程并发面试题

    1.多线程有什么用? (1)发挥多核CPU的优势 随着工业的进步,现在的笔记本.台式机乃至商用的应用服务器至少也都是双核的,4核.8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪 ...

  9. Android中.9图片的了解和制作过程

    个部分(九宫格),分别为4个角,4条边,以及一个中间区域,4个角是不做拉升的,所以还能一直保持圆角的清晰状态,而2条水平边和垂直边分别只做水平和垂直拉伸,所以不会出现边会被拉粗的情况,只有中间用黑线指 ...

  10. HDU2586---How far away ?(lca算法)

    Problem Description There are n houses in the village and some bidirectional roads connecting them. ...