一、spring整合

  网上一搜有很多整合的方式,这里我采用了其中的一种(暂时还没有对其他的方法研究过)。

  对于spring的整合其中的任务,spring提供了几个类、接口(这些类都实现了Job接口):

  org.springframework.scheduling.quartz.QuartzJobBean

  org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean.MethodInvokingJob 

  org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean.StatefulMethodInvokingJob

  

  QuartzJobBean和MethodInvokingJob是无状态的,StatefulMethodInvokingJob是有状态的。

  可以选择自己的需求选择继承与哪个类。 

  关于Scheduler在Spring上的配置:

 <bean name="quartzScheduler" lazy-init="false"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property> <property name="applicationContextSchedulerContextKey"
value="applicationContextKey" />
<property name="autoStartup" value="true" />
<property name="configLocation" value="classpath:spring/quartz.properties"/>
</bean>

注意:其中lazy-init="false",和 <property name="autoStartup" value="true"/>最好按照自己的需求作统一的配置

二、quartz.properties 配置持久化的信息

# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
#============================================================================
# Configure JobStore
#============================================================================
#org.quartz.scheduler.classLoadHelper.class=org.quartz.simpl.CascadingClassLoadHelper
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.useProperties = true
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#havent cluster spring
#org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.tablePrefix = qrtz_
org.quartz.jobStore.isClustered = false
org.quartz.jobStore.maxMisfiresToHandleAtATime=1
#==============================================================
#Non-Managed Configure Datasource if you don't use spring cluster
#==============================================================
#org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
#org.quartz.dataSource.myDS.URL = jdbc\:mysql\://localhost\:3306/qrtz
#org.quartz.dataSource.myDS.user = root
#org.quartz.dataSource.myDS.password = root
#org.quartz.dataSource.myDS.maxConnections =10

这里要备注的是:org.quartz.jobStore.misfireThreshold = 60000

  这个属性是配置当发现触发器过时,允许做就之内的trigger任有效。对于详细了解其中的机制,可以查看数据库的变化,特别是数据库中的QRTZ_FIRED_TRIGGERS表。

  对于其状态有ACQUIRED和EXECUTING两个状态进行转化,并因此会影响QRTZ_TRIGGERS的表的数据。(个人猜想:quartz是利用这几个字段来保存断点的)

三、下面是项目的搭建代码:

  任务类信息类JobModel

public class JobModel {
private String jobName;
private String group;//对于job,trigger相互绑定的,采用相同的group
private Class<?> jobClass;
private Trigger trigger;
public JobModel() {
super();
}
//.....getter,setter
}

定义一个无状态的Job(若定义一个有状态的Job,需要继承与StatefulMethodInvokingJob)

public class CommonJob extends MethodInvokingJob{
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
System.out.println("commonJob executing ...");
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
int value = Integer.parseInt(dataMap.getString("key"));
System.out.println("value is " + value);
dataMap.put("key", new Integer(++value).toString()); }
}

SchedulerManager一共对在scheduler中操作job

public class QrtzManager {
private static Scheduler scheduler;
static {
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext-quartz2.xml");
scheduler = (StdScheduler) context.getBean("quartzScheduler");
}
public void standBy(){
try {
scheduler.standby();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
public void start(){
try {
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
//add a job
public void deploy(JobModel model,JobDataMap dataMap){
JobDetail jobDetail = new JobDetail(model.getJobName(),model.getGroup(),model.getJobClass());
jobDetail.setJobDataMap(dataMap);
try {
scheduler.scheduleJob(jobDetail,model.getTrigger());
} catch (SchedulerException e) {
e.printStackTrace();
}
}
//delete a job
public void unDeploy(String jobName,String group){
if (jobName.equals("") || group.equals("")) {
return ;
}
try {
scheduler.deleteJob(jobName, group);
} catch (SchedulerException e) {
e.printStackTrace();
} }
}

测试类

package com.lps.schedulerserver.service02;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; import org.junit.Test;
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger; public class Main {
public static void main(String[] args) { Trigger trigger = new SimpleTrigger("trigger02", "group02", new Date(), parse("2012-12-12 18:30:00"), 5, 10000L);
JobModel model1 = new JobModel("job01", "group01", CommonJob.class, trigger);
String expression = "0/15 * * ? * *";
Trigger trigger2 = null;
try {
trigger2 = new CronTrigger("trigger01", "group", expression);
trigger2.setStartTime(new Date());
} catch (ParseException e) {
e.printStackTrace();
}
JobModel model2 = new JobModel("job02","group02",StatefulJob.class,trigger2);
QrtzManager manager = new QrtzManager();
//jobdatamap
JobDataMap dataMap = new JobDataMap();
dataMap.put("key", "1");
manager.deploy(model2, dataMap);
System.out.println("deploy model2 at:"+new Date());
}
public static Date parse(String str){
DateFormat format = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
Date date = null ;
try {
date = format.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
@Test
public void deleteJob(){
QrtzManager manager = new QrtzManager();
manager.unDeploy("job01","group01");
}
}

本文转自:http://www.cnblogs.com/interdrp/p/3551446.html

Spring整合Quartz实现持久化、动态设定时间的更多相关文章

  1. spring整合quartz并持久化

    spring整合quartz有两种方式: 一.常见是使用配置文件,将定时任务保存到内存中 简单示例: <!-- 短信催还提醒任务调度 --> <bean id="overd ...

  2. spring整合quartz时间任务调度框架

    spring整合quartz框架 1.创建maven工程 2.导入jar包(pom.xml) <dependencies> <dependency> <groupId&g ...

  3. Spring整合Quartz定时任务 在集群、分布式系统中的应用(Mysql数据库环境)

    Spring整合Quartz定时任务 在集群.分布式系统中的应用(Mysql数据库环境)   转载:http://www.cnblogs.com/jiafuwei/p/6145280.html 单个Q ...

  4. 初识quartz 并分析 项目中spring整合quartz的配置【原创+转载】

    初识quartz 并分析 项目中spring整合quartz的配置[原创+转载]2018年01月29日 12:08:07 守望dfdfdf 阅读数:114 标签: quartz 更多个人分类: 工具 ...

  5. 使用Spring整合Quartz轻松完成定时任务

    一.背景 上次我们介绍了如何使用Spring Task进行完成定时任务的编写,这次我们使用Spring整合Quartz的方式来再一次实现定时任务的开发,以下奉上开发步骤及注意事项等. 二.开发环境及必 ...

  6. Spring quartz Job不能依赖注入,Spring整合quartz Job任务不能注入

    Spring quartz Job不能依赖注入,Spring整合quartz Job任务不能注入 Spring4整合quartz2.2.3中Job任务使用@Autowired不能注入 >> ...

  7. Spring整合Quartz分布式调度

    前言 为了保证应用的高可用和高并发性,一般都会部署多个节点:对于定时任务,如果每个节点都执行自己的定时任务,一方面耗费了系统资源,另一方面有些任务多次执行,可能引发应用逻辑问题,所以需要一个分布式的调 ...

  8. Spring整合Quartz分布式调度(山东数漫江湖)

    前言 为了保证应用的高可用和高并发性,一般都会部署多个节点:对于定时任务,如果每个节点都执行自己的定时任务,一方面耗费了系统资源,另一方面有些任务多次执行,可能引发应用逻辑问题,所以需要一个分布式的调 ...

  9. Spring整合Quartz (cronTrigger和simpleTrigger实现方法)

    Spring整合Quartz (cronTrigger和simpleTrigger实现方法) 之前有记录过一次springboot整合Quartz的文章,由于偶尔一次自己使用spring需要整合Qua ...

随机推荐

  1. jQuery属性,方法操作

     addClass() 向匹配的元素添加指定的类名.attr() 设置或返回匹配元素的属性和值.hasClass() 检查匹配的元素是否拥有指定的类.html() 设置或返回匹配的元素集合中的 HTM ...

  2. Django的Context和RequestContext

    参考:http://www.dannysite.com/blog/38/ Django的模板渲染中,Context可以用来传递数据,一个Context是一系列变量和值的集合,它和Python的字典有点 ...

  3. windows下安装Appserv等php套件之后无法进入数据库管理的问题

    在win7下安装Wamp或者Appserv后无法进入数据库管理,但是php.Apache运行全都没问题,mysql可以在命令行中管理,但是就是无法打开phpmyadmin数据库管理,点击后浏览器就显示 ...

  4. SpringJDBC的简单应用

    此处写上应用JdbcTemplate的dao操作数据库的一些代码(含基本的增删改查,注:重点是查询出多条语句的写法): package org.sakaiproject.zhaorui.dao.imp ...

  5. 项目总结(二)--- CocoaPods的简单介绍与使用

    先谈下,我们为什么要使用CocoaPods,它能为我们做什么吧. 所有开发过iOS应用的小伙伴们都知道,在整个项目中,第三方库的引用必不可少(特别感谢那些优秀第三方开源库的作者,给我们提供了多大的便捷 ...

  6. HDU 2588 GCD (欧拉函数)

    GCD Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status De ...

  7. JPush开发

    主要功能 保持与服务器的长连接,以便消息能够即时推送到达客户端 接收通知与自定义消息,并向开发者App 传递相关信息 SDK集成步骤 1.导入 SDK 开发包到你自己的应用程序项目 解压缩 jpush ...

  8. Myeclipse中把java代码导成UML类图

    Myeclipse中把java代码导成UML类图 1.右键点击项目名称,选择New-------àUML2 Model 2.给类图命名 3.导成类图 1)如果要把整个项目导成类图,则把整个项目拖到类图 ...

  9. cut mysqladmin

    [root@86 ~]# mysqladmin -uroot -p123456 -S /tmp/mysql.sock status Uptime: 112403 Threads: 17 Questio ...

  10. 《JavaScript高级程序设计》学习笔记

    系统学习JS, 从<JavaScript高级程序设计>入门,通过学习jQuery或者angularJS源码来进阶. 第1章 JavaScript简介 1.JS问世的目的是处理以前由服务器端 ...