quartz api地址:http://www.quartz-scheduler.org/api/2.2.0/

根据需求选择quartz调度方案:

1,如果调度时间是固定不变的,可以选择静态调度

2,如果调度时间是可变的,可以选择动态调度,即通过配置时间参数或cron表达式实现调度变化。

静态调度方案:

spring 整合quartz

打开web.xml,添加加载路径

classpath*:spring-quartz.xml

初始化上下文。

        <servlet>
<servlet-name>baseDispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:servlet-context.xml,classpath*:spring-cas.xml,classpath*:spring-quartz.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

写具体的定时调度的任务:

package cn.com.base.quartz.invoke;

public class SchedulerT_Log {

    public void schedulerT_Log() {
System.out.println("使用quartz实现调度");
}
}

创建调度配置文件spring-quartz.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 添加调度的任务bean 配置对应的class-->
<bean id="SchedulerT_Log" class="cn.com.base.quartz.invoke.SchedulerT_Log" />
<!--配置调度具体执行的方法-->
<bean id="myPrintDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="SchedulerT_Log" />
<property name="targetMethod" value="schedulerT_Log" />
<property name="concurrent" value="false" />
</bean>
<!--配置调度执行的触发的时间-->
<bean id="myPrintTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="myPrintDetail" />
<property name="cronExpression">
<value>0 0/30 * * * ?</value>
</property>
</bean> <!-- quartz的调度工厂 调度工厂只能有一个,多个调度任务在list中添加 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<!-- 所有的调度列表-->
<!-- <ref local="sendNoticeTrigger" /> -->
<!-- <ref local="timeOutNoticeTrigger" /> -->
<!-- <ref local="beforeExpireNoticeTrigger" /> -->
<ref local="myPrintTrigger" />
</list>
</property>
</bean>
</beans>

注意

Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时任执行太长,会长时间占用资源,导致其它任务堵塞。
在Spring中如果使用 MethodInvokingJobDetailFactoryBean,可以通过设置concurrent="false"属性, 禁止并发执行。

 

<property name="concurrent"value="true"/>

动态调度方案:

导入quartz.jar包,或者pom.xml 配置对应的依赖

<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
</dependency>
<version>2.2.1<ersion>
<dependency>
<artifactId>quartz-jobs</artifactId>
<groupId>org.quartz-scheduler</groupId>
<version>2.2.1<ersion>
</dependency>

根据页面参数对象进行参数赋值转换,TaskContextParm是自定义的作业上下文参数对象,在这里特别注意org.quartz.CronExpression.isValidExpression(expression),该方法可以判断我们填写的cron表达式是否可以解析为一个有效的Cron表达式。这里由于页面有时间配置和填写cron表达式两种方式,在参数转换这里解耦。

@Override
@Transactional
public void scheduler(Scheduler scheduler) throws SchedulerException {
TaskContextParam taskContextParam = new TaskContextParam();
try {
taskContextParam.setJobname(scheduler.getJobName());
taskContextParam.setTriggername(scheduler.getName()); Integer cycletype = scheduler.getCycletype();
if(cycletype==2){
boolean rs = CronExpression.isValidExpression(scheduler.getExpression());
if(rs){
taskContextParam.setCronexpression(scheduler.getExpression());
}
else{
return false;
}
}else{
taskContextParam.setFlag(scheduler.getCycle()); if (scheduler.getMinute() != null) {
taskContextParam.setMinute(scheduler.getMinute());
}
if(scheduler.getHour() != null) {
taskContextParam.setHour(scheduler.getHour());
}
if(scheduler.getWeekly() != null) {
taskContextParam.setWeekly(scheduler.getWeekly());
}
if (scheduler.getMonth() != null) {
taskContextParam.setMonth(scheduler.getMonth());
}
}
new SchedulerManager().addSchedulerJob(taskContextParam); } catch (SchedulerException e) {
e.printStackTrace(); }
}

SchedulerManager.java

public void addSchedulerJob(TaskContextParam taskContextParam)
throws SchedulerException {
JobDetail job = null;
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start(); job = JobBuilder.newJob(ExeKtrJob.class)
.withIdentity(taskContextParam.getJobname(), "group1")
.usingJobData(ConstantManager.FILE_ID,taskContextParam.getId())
.usingJobData(ConstantManager.FILE_TYPE,ConstantManager.FILE_TYPE_ID)
.build(); Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(taskContextParam.getTriggername(), "group1")
.startNow()
.withSchedule(setScheduleBuilderWithTime(taskContextParam))
.build(); scheduler.scheduleJob(job, trigger);
}

private ScheduleBuilder setScheduleBuilderWithTime(TaskContextParam taskContextParam) {
if(taskContextParam.getCronexpression()!=null){
String cronExpression = taskContextParam.getCronexpression();
ScheduleBuilder<CronTrigger> cronSchedule = CronScheduleBuilder.cronSchedule(cronExpression);
return cronSchedule;
}
else{
switch (Integer.parseInt(taskContextParam.getFlag())) {
case 1:// 每隔多少分钟
return simpleSchedule().withIntervalInMinutes(
taskContextParam.getMinute()).repeatForever();
case 2:// 每隔多少小时
return simpleSchedule().withIntervalInMinutes(
taskContextParam.getHour() * 60).repeatForever();
case 3:// 每天定点运行,格式 15:10
return dailyAtHourAndMinute(taskContextParam.getHour(),
taskContextParam.getMinute());
case 4:// 每星期定点运行,格式 每星期三15:10
return weeklyOnDayAndHourAndMinute(taskContextParam.getWeekly(),
taskContextParam.getHour(), taskContextParam.getMinute());
case 5:// 每月定点运行,格式 每月5号15:10
return monthlyOnDayAndHourAndMinute(taskContextParam.getMonth(),
taskContextParam.getHour(), taskContextParam.getMinute());
default:
return null;
}
}
}

ExeKtrJob.java

public class ExeKtrJob implements Job {

	@Override
public void execute(JobExecutionContext context)
throws JobExecutionException { Timestamp scheduledFireTime = new java.sql.Timestamp(context.getScheduledFireTime().getTime());
Timestamp previousFireTime = null;
if(context.getPreviousFireTime()!=null){
previousFireTime = new java.sql.Timestamp(context.getPreviousFireTime().getTime());
}
Timestamp nextFireTime = new java.sql.Timestamp(context.getNextFireTime().getTime());
String fireInstanceId = context.getFireInstanceId();
Trigger trigger = context.getTrigger();
String jobname = trigger.getJobKey().getName();
String triggername = trigger.getKey().getName(); JobDataMap jobDataMap = context.getMergedJobDataMap(); String fileType=(String) jobDataMap.get(ConstantManager.FILE_TYPE);
int id=Integer.parseInt((String) jobDataMap.get(ConstantManager.FILE_ID)); }
}

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. Leetcode 980. 不同路径 III

    980. 不同路径 III  显示英文描述 我的提交返回竞赛   用户通过次数42 用户尝试次数43 通过次数46 提交次数60 题目难度Hard 在二维网格 grid 上,有 4 种类型的方格: 1 ...

  2. Oracle 11.2.0.4.0 Dataguard部署和日常维护(4)-Datauard Gap事件解决篇

    Oracle dataguard主库删除备库需要的归档时,会导致gap事情的产生,或者备库由于网络或物理故障原因,倒是备库远远落后于主库,都会产生gap事件,本例模拟gap事件的产生以及处理. 1. ...

  3. echarts3使用总结2

    接着上一篇文章补充一点项目中遇到的问题及解决方法 1.y轴正负轴调换  yAxis: {     inverse: false,  //y轴正负轴调换 }, 2.去掉图表背景线 yAxis: [   ...

  4. Caused by: java.io.FileNotFoundException: class path resource [spring/springmvc.xml] cannot be opene

                        Caused by: java.io.FileNotFoundException: class path resource [spring/springmvc. ...

  5. npm run build 打包后,如何运行在本地查看效果(Apache服务)

    目前,使用vue-cli脚手架写了一个前端项目,之前一直是使用npm run dev 在8080端口上进行本地调试.项目已经进行一半了,今天有时间突然想使用npm run build进行上线打包,试试 ...

  6. MFC消息-自定义消息

    转:http://blog.csdn.net/penpenandtongtong/article/details/18598907 像MFC的窗口发送消息,可以进行自定义的动作行为,因此很多时候非常有 ...

  7. 转 Deep Learning for NLP 文章列举

    原文链接:http://www.xperseverance.net/blogs/2013/07/2124/   大部分文章来自: http://www.socher.org/ http://deepl ...

  8. windows中mysql5.7保存emoji表情

    1.找到my.ini文件,修改一下配置: [client] default-character-set=utf8mb4 [mysqld] character-set-client-handshake ...

  9. Object value iterator:值迭代器

    // ES5 // 对于数组,使用标准的 for 循环,其实这种方式并不是在遍历值,而是遍历下标来指向值!ES5中增加了一些数组迭代器:forEach.every.some // forEach:遍历 ...

  10. RabbitMQ 均衡调度(公平分发机制)

    均衡调度是针对Consumer来说的.现在有两个Consumer请求同一个队列的消息.RabbitMQ会将序号为奇数的消息发给第一个Consumer,会将序号为偶数的消息发送给第二个Consumer. ...