scheduler.deleteJob(taskName,quartz schedulerr.DEFAULT_GROUP);删除定时任务后怎么任务还会执行

初探quartz scheduler
- CSDN博客
初探quartz scheduler
quartz是opensymphony提供的用来做SCHEDULE的框架在spring中通过org.springframework.scheduling.quartz.SchedulerFactoryBean来获得Schedule类 &bean id="quartzSchedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" scope="singleton"&
&!-- set quartz scheduler factory configuration location --&
&!-- &property name="configLocation" value="" /& --&
&!-- 系统会在启动时加载 --&
&property name="autoStartup" value="true" /&
&bean id="taskManage" class="com.sumit.task.TaskManage" scope="singleton"&
&property name="taskDAO" ref="taskDao" /&
&property name="scheduler" ref="quartzSchedulerFactory" /&
QUARTZ中有Job与Trigger两种概念一.Job详细描述具体的任务运行代码实现1.新增一个任务到schedulerJobDetail job = new JobDetail(taskName, Scheduler.DEFAULT_GROUP,DefaultQuartzJob.class);
JobDataMap jobDataMap = job.getJobDataMap();
//根据PUT不同的TASK而运行不同的任务
jobDataMap.put("Task", task);
job.setDurability(true);
scheduler.addJob(job, true);
==&DefaultQuartzJob public class DefaultQuartzJob implements Job {
private static Logger logger = Logger.getLogger(DefaultQuartzJob.class);
public void execute(JobExecutionContext ctx) throws JobExecutionException {
JobDataMap jobDataMap = ctx.getJobDetail().getJobDataMap();
TaskTO task = (TaskTO) jobDataMap.get("Task");
Task entryTask = task.getEntryTask();
if (entryTask == null) {
.error("Task " + task.getName()
+ " couldn't be initialized!");
TaskContext taskContext = new DefaultTaskContext();
// 将触发任务的Trigger中所有的参数添加到上下文中
JobDataMap triggerDataMap = ctx.getTrigger().getJobDataMap();
String[] keys = triggerDataMap.getKeys();
if (keys != null) {
for (int i = 0; i & keys. i++) {
Object obj = triggerDataMap.get(keys[i]);
if (obj instanceof String[]) {
String [] data=(String[])
if(data.length&0){
taskContext.setParameter(keys[i], data[0]);
else if(obj instanceof String){
taskContext.setParameter(keys[i], (String)obj);
// 为任务时间执行次数加1
TaskManage tm = (TaskManage) triggerDataMap
.get(TaskManage.TASKMANAGE_ATTRIBUTE_NAME);
tm.addTriggerExecuteTimes(triggerDataMap
.getString(TaskManage.TRIGGER_ATTRIBUTE_NAME));
} catch (TaskException e) {
logger.error(
"catch exception while process task " + task.getName(), e);
//根据实例化不同的TASK而运行不同的任务
entryTask.process(taskContext);
} catch (TaskException e) {
logger.error(
"catch exception while process task " + task.getName(), e);
==&TASK接口,继承它可以实现不同的任务实现/**
* 定时任务的基本接口
public interface Task
* 任务执行
* @param request
* @param response
* @param cxt
* @roseuid AC
public void process(TaskContext cxt) throws TaskE
* 任务名称
* @return java.lang.String
* @roseuid 453DB0AB01B5
public String getName();
2.从scheduler中删除一个任务scheduler.deleteJob(taskName, Scheduler.DEFAULT_GROUP);
二.Trigger定时器,任务与定时器是一对多的关系1.新建Trigger,初步分为CRONTRIGGER,SIMPLETRIGGERif (TRIGGER_CRON.equals(triggerType)) {
//创建CRONTRIGGER
trigger = new CronTrigger(triggerName, Scheduler.DEFAULT_GROUP,
taskName, Scheduler.DEFAULT_GROUP, validStartTime,
validEndTime, triggerPattern);
trigger.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
//创建SIMPLETRIGGER
trigger = new SimpleTrigger(triggerName,
Scheduler.DEFAULT_GROUP, taskName,
Scheduler.DEFAULT_GROUP, validStartTime, validEndTime,
repeatCount, repeatInterval);
trigger.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT);
//添加trigger到scheduler
scheduler.scheduleJob(trigger);
logger.debug("trigger " + trigger.getName()
+ " have been loaded to scheduler!");
} catch (SchedulerException e) {
logger.error("Catch exception " + e.getMessage()
+ " while adding trigger " + triggerName
+ " into scheduler", e);
throw new TaskException("0096", "Catch exception " + e.getMessage()
+ " while adding trigger " + triggerName
+ " into scheduler", e);
2.删除Triggertry {
scheduler.unscheduleJob(triggerName, Scheduler.DEFAULT_GROUP);
} catch (SchedulerException e) {
logger.error("Catch exception " + e.getMessage()
+ " while remove trigger " + triggerName
+ " from scheduler", e);
throw new TaskException("0096", "Catch exception " + e.getMessage()
+ " while removing trigger " + triggerName
+ " from scheduler", e);
ps:以上代码片段只提供参考,不可能运行成功,原因是没有贴出全部依赖代码.scheduler的所有方法都是官方提供,可以使用.
本文已收录于以下专栏:
相关文章推荐
由于需要实现一个scheduler,用于添加job,更改job
本文将演示如何通过 Spring 使用 Quartz Scheduler 进行任务调度。Spring 为简化 Quartz 的操作提供了相关支持类。本文示例使用的相关工具如下:Spring 4.2.2...
Hello Quartz / 本文通过一个简单的例子让大家快速了解Quartz,上手,并了解Quartz内的一些关键对象 如 Scheduler、Job、Trigger、JobExecutionCon...
实现 Quartz监听 Scheduler 事件
 Quartz is a full-featured, open source job scheduling service that can be integrated with, or u...
Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。你可以配置作业和触发器监听为全局监听或者是特定于...
什么是Quartz
Quartz是一个开源的作业调度框架,由java编写,在.NET平台为Quartz.Net,通过Quart可以快速完成任务调度的工作.
Quartz能干什么/应用场景
如网页游...
转载什么是Quartz
Quartz是一个开源的作业调度框架,由java编写,在.NET平台为Quartz.Net,通过Quart可以快速完成任务调度的工作.
Quartz能干什么/应用场景
...
一,可以使用crontab风格定义时间规则;二,阻止任务在某些特定时间点的运行;三,支持持久化任务
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)任务调度quartz的实现 - 吉春虎 - 博客园
随笔 - 145
1.方式一Java代码方式
需要quartz-1.8.0.jar, 核心代码实现如下:
package&com.ibm.
import&java.util.D
import&org.quartz.J
import&org.quartz.JobD
import&org.quartz.JobExecutionC
import&org.quartz.JobExecutionE
import&org.quartz.S
import&org.quartz.SchedulerF
import&org.quartz.T
import&org.quartz.helpers.TriggerU
public&class&QuartzTest&implements&Job&{
&@Override
&public&void&execute(JobExecutionContext&arg0)&throws&JobExecutionException&{
&&System.out.println("Generating&report&-&"
&&&&+&arg0.getJobDetail().getFullName()&+&",&type&="
&&&&+&arg0.getJobDetail().getJobDataMap().get("type"));
&&System.out.println(new&Date().toString());
&public&static&void&main(String[]&args)&{
&&&SchedulerFactory&schedFact&=&
&&&new&org.quartz.impl.StdSchedulerFactory();
&&&Scheduler&sched&=&schedFact.getScheduler();
&&&sched.start();
&&&JobDetail&jobDetail&=&new&JobDetail("myJob",&"myJobGroup",
&&&&&QuartzTest.class);
&&&jobDetail.getJobDataMap().put("type",&"FULL");
&&&Trigger&trigger&=&TriggerUtils.makeWeeklyTrigger(3,&16,&38);
&&&trigger.setGroup("myTriggerGroup");
&&&trigger.setStartTime(TriggerUtils.getEvenSecondDate(new&Date()));
&&&trigger.setName("myTrigger");
&&&sched.scheduleJob(jobDetail,&trigger);
&&}&catch&(Exception&e)&{
&&&e.printStackTrace();
Generating&report&-&myJobGroup.myJob,&type&=FULL
Tue&Feb&8&16:38:00&CST&2011
Generating&report&-&myJobGroup.myJob,&type&=FUL
Tue&Feb&15&16:38:00&CST&2011
&2.方式二Spring整合方式
需要spring的jar包和quartz-1.8.0.jar, 核心代码配置实现如下:
&?xml&version="1.0"&encoding="UTF-8"?&
&beans&xmlns="http://www.springframework.org/schema/beans"
&xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&xmlns:jee="http://www.springframework.org/schema/jee"
&xmlns:tx="http://www.springframework.org/schema/tx"&xmlns:context="http://www.springframework.org/schema/context"
&xsi:schemaLocation="http://www.springframework.org/schema/beans&http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&http://www.springframework.org/schema/tx&http://www.springframework.org/schema/tx/spring-tx-2.5.xsd&http://www.springframework.org/schema/jee&http://www.springframework.org/schema/jee/spring-jee-2.5.xsd&http://www.springframework.org/schema/context&http://www.springframework.org/schema/context/spring-context-2.5.xsd"
&default-lazy-init="false"&
&&!--&订单状态自动更新&&--&
&&bean&id="initOrderStatusTaskTrigger"&class="org.springframework.scheduling.quartz.CronTriggerBean"&
&&&property&name="jobDetail"&
&&&&class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"&
&&&&&property&name="targetObject"&
&&&&&&ref&bean="OrderQuartzService"&/&
&&&&&/property&
&&&&&property&name="targetMethod"&
&&&&&&value&init&/value&
&&&&&/property&
&&&&/bean&
&&&/property&
&&&property&name="cronExpression"&
&&&&value&0&0&1&*&*&?&/value&
&&&/property&
&&!--&加入任务&&--&
&&bean&id="schedulerFactory"&class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&
&&&property&name="triggers"&
&&&&&ref&local="initOrderStatusTaskTrigger"/&
&&&&/list&
&&&/property&
&& 备注:OrderQuartzService是普通java接口,init为方法。
& 3.方式三 Java界面方式管理
&主要文件分布
(1)TaskService.java
(2)TaskServiceImpl.java
(3)MyJob.java
(4)MyTask.java
(5)spring-task-schedule.xml
(6)界面管理JSP页面lvTaskQuartz_list.jsp,lvTaskQuartz_add.jsplvTaskQuartz_edit.jsp
package&mon.
import&java.text.ParseE
import&com.gv.core.datastructure.D
import&com.gv.core.exception.ServiceE
public&interface&TaskService&{
public&void&initTask()throws&ServiceException,ParseException&;
public&void&addJob(Dto&dto);
public&void&updateJob(Dto&dto);
public&void&deleteJob(Dto&dto);
public&void&pauseJob(Dto&dto);
public&void&resumeJob(Dto&dto);
package&mon.task.
import&java.text.ParseE
import&java.util.L
import&javax.annotation.PostC
import&javax.annotation.R
import&org.quartz.CronT
import&org.quartz.JobD
import&org.quartz.S
import&org.quartz.SchedulerE
import&org.quartz.T
import&org.springframework.context.annotation.L
import&org.springframework.stereotype.S
import&com.gv.core.datastructure.D
import&com.gv.core.datastructure.impl.BaseD
import&com.gv.core.exception.ServiceE
import&com.gv.core.hibernate3.HibernateBaseDAO;
import&mon.pojo.logic.LvTaskQ
import&mon.task.TaskS
import&mon.task.job.MyJ
import&mon.task.job.MyT
@Lazy(false)
@Service("TaskService")
public&class&TaskServiceImpl&implements&TaskService&{
&@Resource
&private&HibernateBaseDAO&
&@Resource
&private&Scheduler&
&private&String&job&=&"job_";
&private&String&trigger&=&"cron_";
&@Override
&@PostConstruct
&public&void&initTask()&throws&ServiceException,&ParseException&{
&&List&LvTaskQuartz&&listTask&=&dao.find("from&LvTaskQuartz",&null);
&&if&(listTask&!=&null&&&&listTask.size()&&&0)&{
&&&for&(int&i&=&0;&i&&&listTask.size();&i++)&{
&&&&LvTaskQuartz&quartz&=&listTask.get(i);
&&&&Dto&dto&=&new&BaseDto();
&&&&dto.put("lvTaskQuartz",&quartz);
&&&&this.addJob(dto);
&&&&if(quartz.getStatus()==0){
&&&&&this.pauseJob(dto);
&&*&增加任务
&&*&@param&quartz
&&*&@throws&SchedulerException
&&*&@throws&ParseException
&@Override
&public&void&addJob(Dto&dto)&{
&&LvTaskQuartz&ttaskQuartz&=&(LvTaskQuartz)&dto.get("lvTaskQuartz");
&&String&jobName&=&this.job&+&ttaskQuartz.getId();
&&String&triggerName&=&this.trigger&+&ttaskQuartz.getId();
&&&JobDetail&jobDetail&=&new&JobDetail();
&&&jobDetail.setName(jobName);
&&&MyTask&myTask&=&new&MyTask();
&&&myTask.setTargetObject(ttaskQuartz.getTargetObject());
&&&myTask.setTargetMethod(ttaskQuartz.getTargetMethod());
&&&jobDetail.getJobDataMap().put("myTask",&myTask);
&&&jobDetail.setJobClass(MyJob.class);
&&&scheduler.addJob(jobDetail,&true);
&&&CronTrigger&cronTrigger&=&new&CronTrigger(triggerName,&Scheduler.DEFAULT_GROUP,&jobDetail
&&&&&.getName(),&Scheduler.DEFAULT_GROUP);
&&&cronTrigger.setCronExpression(ttaskQuartz.getTargetTime());
&&&scheduler.scheduleJob(cronTrigger);
&&}&catch&(ParseException&e)&{
&&&e.printStackTrace();
&&}&catch&(SchedulerException&e)&{
&&&e.printStackTrace();
&&*&删除任务
&@Override
&public&void&deleteJob(Dto&dto)&{
&&LvTaskQuartz&ttaskQuartz&=&(LvTaskQuartz)&dto.get("lvTaskQuartz");
&&String&jobName&=&this.job&+&ttaskQuartz.getId();
&&String&triggerName&=&this.trigger&+&ttaskQuartz.getId();
&&&scheduler.pauseTrigger(triggerName,&Scheduler.DEFAULT_GROUP);
&&&scheduler.unscheduleJob(triggerName,&Scheduler.DEFAULT_GROUP);
&&&scheduler.deleteJob(jobName,&Scheduler.DEFAULT_GROUP);
&&}&catch&(SchedulerException&e)&{
&&&e.printStackTrace();
&&*&修改任务
&@Override
&public&void&updateJob(Dto&dto)&{
&&LvTaskQuartz&ttaskQuartz&=&(LvTaskQuartz)&dto.get("lvTaskQuartz");
&&String&jobName&=&this.job&+&ttaskQuartz.getId();
&&String&triggerName&=&this.trigger&+&ttaskQuartz.getId();
&&&Trigger&trigger&=&scheduler.getTrigger(triggerName,
&&&&&Scheduler.DEFAULT_GROUP);
&&&if&(trigger&!=&null)&{
&&&&JobDetail&jobDetail=scheduler.getJobDetail(jobName,&Scheduler.DEFAULT_GROUP);
&&&&MyTask&myTask&=&(MyTask)jobDetail.getJobDataMap().get("myTask");;
&&&&myTask.setTargetObject(ttaskQuartz.getTargetObject());
&&&&myTask.setTargetMethod(ttaskQuartz.getTargetMethod());
&&&&CronTrigger&ct&=&(CronTrigger)&&
&&&&&ct.setCronExpression(ttaskQuartz.getTargetTime());
&&&&}&catch&(ParseException&e)&{
&&&&&e.printStackTrace();
&&&&scheduler.rescheduleJob(triggerName,Scheduler.DEFAULT_GROUP,&trigger);&
&&}&catch&(SchedulerException&e)&{
&&&e.printStackTrace();
&&&&&*&暂停任务
&@Override
&public&void&pauseJob(Dto&dto)&{
&&LvTaskQuartz&ttaskQuartz&=&(LvTaskQuartz)&dto.get("lvTaskQuartz");
&&String&jobName&=&this.job&+&ttaskQuartz.getId();
&&String&triggerName&=&this.trigger&+&ttaskQuartz.getId();
&&Trigger&
&&&trigger&=&scheduler.getTrigger(triggerName,
&&&&&Scheduler.DEFAULT_GROUP);
&&&if&(trigger&!=&null)&{
&&&&scheduler.pauseJob(jobName,&Scheduler.DEFAULT_GROUP);
&&&&scheduler.pauseTrigger(triggerName,&Scheduler.DEFAULT_GROUP);
&&}&catch&(SchedulerException&e)&{
&&&e.printStackTrace();
&&&&&*&恢复任务
&@Override
&public&void&resumeJob(Dto&dto)&{
&&LvTaskQuartz&ttaskQuartz&=&(LvTaskQuartz)&dto.get("lvTaskQuartz");
&&String&triggerName&=&this.trigger&+&ttaskQuartz.getId();
&&String&jobName&=&this.job&+&ttaskQuartz.getId();
&&Trigger&
&&&trigger&=&scheduler.getTrigger(triggerName,
&&&&&Scheduler.DEFAULT_GROUP);
&&&if&(trigger&!=&null)&{
&&&&scheduler.resumeJob(jobName,&Scheduler.DEFAULT_GROUP);
&&&&scheduler.resumeTrigger(triggerName,&Scheduler.DEFAULT_GROUP);
&&}&catch&(SchedulerException&e)&{
&&&e.printStackTrace();
package&mon.task.
import&java.lang.reflect.M
import&mons.logging.L
import&mons.logging.LogF
import&com.gv.core.proxy.ServiceC
public&class&MyTask&{
&private&String&targetO
&private&String&targetM
&private&static&final&Log&logger&=&LogFactory.getLog(MyTask.class);
&public&void&run()&{
&&if&(ServiceConstants.beanFactory&!=&null)&{
&&&(targetObject+"==="+targetMethod);
&&&Object&bean&=&ServiceConstants.beanFactory.getBean(targetObject);
&&&if&(bean&!=&null)&{
&&&&Class&clazz&=&bean.getClass();
&&&&&Method&m&=&clazz.getDeclaredMethod(targetMethod);
&&&&&m.invoke(bean,&null);
&&&&}&catch&(Exception&e)&{
&&&&&e.printStackTrace();
&public&String&getTargetObject()&{
&&return&targetO
&public&void&setTargetObject(String&targetObject)&{
&&this.targetObject&=&targetO
&public&String&getTargetMethod()&{
&&return&targetM
&public&void&setTargetMethod(String&targetMethod)&{
&&this.targetMethod&=&targetM
package&mon.task.
import&org.springframework.scheduling.quartz.QuartzJobB
import&org.quartz.JobExecutionC
import&org.quartz.JobExecutionE
import&org.springframework.scheduling.quartz.QuartzJobB
public&class&MyJob&extends&QuartzJobBean&{
&private&MyTask&myT
&protected&void&executeInternal(JobExecutionContext&context)
&&&throws&JobExecutionException&{
&&myTask.run();
&public&MyTask&getMyTask()&{
&&return&myT
&public&void&setMyTask(MyTask&myTask)&{
&&this.myTask&=&myT
&?xml&version="1.0"&encoding="UTF-8"?&
&!DOCTYPE&beans&PUBLIC&"-//SPRING//DTD&BEAN//EN"
&&&&"http://www.springframework.org/dtd/spring-beans.dtd"&
&&!--sheduler容器调度--&
&&bean&id="scheduler"
&&class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
&&lazy-init="false"&
&&&property&name="triggers"&
&&&&/list&
&&&/property&
& 定时任务管理表结构设计lv_task_quartz
CREATE&TABLE&`lv_task_quartz`&(
&&`id`&int(11)&NOT&NULL&AUTO_INCREMENT,
&&`task_name`&varchar(64)&NOT&NULL&COMMENT&'任务名称',
&&`target_object`&varchar(64)&NOT&NULL&COMMENT&'目标实例',
&&`target_method`&varchar(64)&NOT&NULL&COMMENT&'目标方法',
&&`target_time`&varchar(64)&NOT&NULL&COMMENT&'定时目标时间',
&&`description`&varchar(225)&DEFAULT&NULL&COMMENT&'描述',
&&`status`&int(4)&NOT&NULL&DEFAULT&'1'&COMMENT&'0=&暂停任务,1=&启用任务',
&&`create_time`&datetime&DEFAULT&NULL&COMMENT&'创建时间',
&&`modify_time`&datetime&DEFAULT&NULL&COMMENT&'修改时间',
&&`modify_user_id`&int(11)&DEFAULT&NULL&COMMENT&'修改人id',
&&`modify_user_name`&varchar(64)&DEFAULT&NULL&COMMENT&'修改人名称',
&&PRIMARY&KEY&(`id`)
)&ENGINE=InnoDB&AUTO_INCREMENT=6&DEFAULT&CHARSET=utf8&ROW_FORMAT=COMPACT;
& 代码省略了JSP代码和action请求代码
"0&0&0/2&*&*&?"&每隔2个小时触发
"0&0&12&*&*&?"&每天中午12点触发
"0&15&10&?&*&*"&每天上午10:15触发
"0&15&10&*&*&?"&每天上午10:15触发
"0&15&10&*&*&?&*"&每天上午10:15触发
"0&15&10&*&*&?&2005"&2005年的每天上午10:15触发
"0&*&14&*&*&?"&在每天下午2点到下午2:59期间的每1分钟触发
"0&0/5&14&*&*&?"&在每天下午2点到下午2:55期间的每5分钟触发
"0&0/5&14,18&*&*&?"&在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0&0-5&14&*&*&?"&在每天下午2点到下午2:05期间的每1分钟触发
"0&10,44&14&?&3&WED"&每年三月的星期三的下午2:10和2:44触发
"0&15&10&?&*&MON-FRI"&周一至周五的上午10:15触发
"0&15&10&15&*&?"&每月15日上午10:15触发
"0&15&10&L&*&?"&每月最后一日的上午10:15触发
"0&15&10&?&*&6L"&每月的最后一个星期五上午10:15触发
"0&15&10&?&*&6L&"&2002年至2005年的每月的最后一个星期五上午10:15触发
"0&15&10&?&*&6#3"&每月的第三个星期五上午10:15触发
阅读(...) 评论() &博客分类:
今天把项目中的一部分移出来,主要是实现定时器任务,定时任务是从数据库配置的的,所以采用spring读取数据库配置文件来实现定时器。
需要的JAR包 见上传文件
见上传文件
数据库映射类:
package com.
public class DbsynConfigQuartz {
// Constructors
/** default constructor */
public DbsynConfigQuartz() {
/** minimal constructor */
public DbsynConfigQuartz(String triggername, String jobdetailname,
String targetobject, String concurrent, String state,String isspringbean) {
this.triggername =
this.jobdetailname =
this.targetobject =
this.concurrent =
this.state =
this.isspringbean=
/** full constructor */
public DbsynConfigQuartz(String triggername, String cronexpression,
String jobdetailname, String targetobject, String methodname,
String concurrent, String state, String readme,String isspringbean) {
this.triggername =
this.cronexpression =
this.jobdetailname =
this.targetobject =
this.methodname =
this.concurrent =
this.state =
this.readme =
this.isspringbean=
// Property accessors
public String getTriggername() {
return this.
public void setTriggername(String triggername) {
this.triggername =
public String getCronexpression() {
return this.
public void setCronexpression(String cronexpression) {
this.cronexpression =
public String getJobdetailname() {
return this.
public void setJobdetailname(String jobdetailname) {
this.jobdetailname =
public String getTargetobject() {
return this.
public void setTargetobject(String targetobject) {
this.targetobject =
public String getMethodname() {
return this.
public void setMethodname(String methodname) {
this.methodname =
public String getConcurrent() {
return this.
public void setConcurrent(String concurrent) {
this.concurrent =
public String getState() {
return this.
public void setState(String state) {
this.state =
public String getReadme() {
return this.
public void setReadme(String readme) {
this.readme =
public String getIsspringbean() {
public void setIsspringbean(String isspringbean) {
this.isspringbean =
连接数据库公共方法:
package com.
import java.io.F
import java.sql.BatchUpdateE
import java.sql.C
import java.sql.DriverM
import java.sql.ResultS
import java.sql.ResultSetMetaD
import java.sql.SQLE
import java.sql.S
import java.text.SimpleDateF
import java.util.ArrayL
import java.util.D
import java.util.HashM
import java.util.L
import java.util.M
import org.apache.log4j.L
public class Connect {
private static int tag1 = 0;
private static Logger log = Logger.getLogger(Connect.class);
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
* 获得数据连接
public static Connection getCon(String name) {
Connection connection =
try {// 保证只进行一次初始化
if (tag1 == 0) {
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
connection = DriverManager.getConnection("proxool." + name);
} catch (Exception e) {
e.printStackTrace();
读取定时器触发类:
package com.
import java.sql.C
import java.sql.ResultS
import java.sql.SQLE
import java.sql.S
import java.text.ParseE
import java.util.ArrayL
import java.util.D
import java.util.L
import org.apache.log4j.L
import org.quartz.JobD
import org.quartz.S
import org.springframework.beans.BeansE
import org.springframework.beans.factory.BeanF
import org.springframework.beans.factory.BeanFactoryA
import org.springframework.scheduling.quartz.CronTriggerB
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryB
import com.util.C
public class QuartzManager implements BeanFactoryAware {
private Logger log = Logger.getLogger(QuartzManager.class);
private static BeanFactory beanFactory =
// private ApplicationC
@SuppressWarnings("unused")
private void reScheduleJob() throws Exception, ParseException {
// 通过查询数据库里计划任务来配置计划任务
DbsynConfigQuartz d= new DbsynConfigQuartz();
List&DbsynConfigQuartz& quartzList = this.getConfigQuartz();
if (quartzList != null && quartzList.size() & 0) {
for (DbsynConfigQuartz tbcq : quartzList) {
configQuatrz(tbcq);
public boolean configQuatrz(DbsynConfigQuartz tbcq) {
boolean result =
// 运行时可通过动态注入的scheduler得到trigger
CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger(
tbcq.getTriggername(), Scheduler.DEFAULT_GROUP);
// 如果计划任务已存在则调用修改方法
if (trigger != null) {
change(tbcq, trigger);
// 如果计划任务不存在并且数据库里的任务状态为可用时,则创建计划任务
if (tbcq.getState().equals("1")) {
this.createCronTriggerBean(tbcq);
} catch (Exception e) {
e.printStackTrace();
public void change(DbsynConfigQuartz tbcq, CronTriggerBean trigger)
throws Exception {
// 如果任务为可用
if (tbcq.getState().equals("1")) {
// 判断从DB中取得的任务时间和现在的quartz线程中的任务时间是否相等
// 如果相等,则表示用户并没有重新设定数据库中的任务时间,这种情况不需要重新rescheduleJob
if (!trigger.getCronExpression().equalsIgnoreCase(
tbcq.getCronexpression())) {
trigger.setCronExpression(tbcq.getCronexpression());
scheduler.rescheduleJob(tbcq.getTriggername(),
Scheduler.DEFAULT_GROUP, trigger);
(new Date() + ": 更新" + tbcq.getTriggername() + "计划任务");
scheduler.pauseTrigger(trigger.getName(), trigger.getGroup());// 停止触发器
scheduler.unscheduleJob(trigger.getName(), trigger.getGroup());// 移除触发器
scheduler.deleteJob(trigger.getJobName(), trigger.getJobGroup());// 删除任务
(new Date() + ": 删除" + tbcq.getTriggername() + "计划任务");
* 创建/添加计划任务
* @param tbcq
计划任务配置对象
* @throws Exception
public void createCronTriggerBean(DbsynConfigQuartz tbcq) throws Exception {
// 新建一个基于Spring的管理Job类
MethodInvokingJobDetailFactoryBean mjdfb = new MethodInvokingJobDetailFactoryBean();
mjdfb.setName(tbcq.getJobdetailname());// 设置Job名称
// 如果定义的任务类为Spring的定义的Bean则调用 getBean方法
if (tbcq.getIsspringbean().equals("1")) {
mjdfb.setTargetObject(beanFactory.getBean(tbcq.getTargetobject()));// 设置任务类
// 否则直接new对象
mjdfb.setTargetObject(Class.forName(tbcq.getTargetobject())
.newInstance());// 设置任务类
mjdfb.setTargetMethod(tbcq.getMethodname());// 设置任务方法
mjdfb.setConcurrent(tbcq.getConcurrent().equals("0") ? false : true); // 设置是否并发启动任务
mjdfb.afterPropertiesSet();// 将管理Job类提交到计划管理类
// 将Spring的管理Job类转为Quartz管理Job类
JobDetail jobDetail = new JobDetail();
jobDetail = (JobDetail) mjdfb.getObject();
jobDetail.setName(tbcq.getJobdetailname());
scheduler.addJob(jobDetail, true); // 将Job添加到管理类
// 新一个基于Spring的时间类
CronTriggerBean c = new CronTriggerBean();
c.setCronExpression(tbcq.getCronexpression());// 设置时间表达式
c.setName(tbcq.getTriggername());// 设置名称
c.setJobDetail(jobDetail);// 注入Job
c.setJobName(tbcq.getJobdetailname());// 设置Job名称
scheduler.scheduleJob(c);// 注入到管理类
scheduler.rescheduleJob(tbcq.getTriggername(), Scheduler.DEFAULT_GROUP,
c);// 刷新管理类
(new Date() + ": 新建" + tbcq.getTriggername() + "计划任务");
* 查询数据库任务设置,返回列表
* @return 数据库任务设置列表
public List&DbsynConfigQuartz& getConfigQuartz() {
List&DbsynConfigQuartz& result = new ArrayList&DbsynConfigQuartz&();
Connection con =
Statement smt =
ResultSet rs =
con = Connect.getCon("sys");
if(con!=null) {
smt = con.createStatement();
con.setAutoCommit(false);
.executeQuery("select triggername,cronexpression,jobdetailname,targetobject,methodname,concurrent,state,readme,isspringbean from dbsyn_config_quartz");
while (rs.next()) {
DbsynConfigQuartz tbcq = new DbsynConfigQuartz();
tbcq.setTriggername(rs.getString("triggername"));
tbcq.setCronexpression(rs.getString("cronexpression"));
tbcq.setJobdetailname(rs.getString("jobdetailname"));
tbcq.setTargetobject(rs.getString("targetobject"));
tbcq.setMethodname(rs.getString("methodname"));
tbcq.setConcurrent(rs.getString("concurrent"));
tbcq.setState(rs.getString("state"));
tbcq.setReadme(rs.getString("readme"));
tbcq.setIsspringbean(rs.getString("isspringbean"));
result.add(tbcq);
rs.close();
}catch (SQLException e) {
e.printStackTrace();
con.close();
} catch (SQLException e) {
e.printStackTrace();
public Scheduler getScheduler() {
public void setScheduler(Scheduler scheduler) {
this.scheduler =
* public ApplicationContext getApc() { }
* public void setApc(ApplicationContext apc) { this.apc = }
public void setBeanFactory(BeanFactory factory) throws BeansException {
this.beanFactory =
public BeanFactory getBeanFactory() {
return beanF
定时器调用方法类:
package com.
import org.apache.log4j.L
public class DrvServiceImpl {
private static Logger log = Logger.getLogger(DrvServiceImpl.class);
public void getHz() {
System.out.println("调用成功");
applicationContext-quartz.xml
配置定时器的spring文件
&?xml version="1.0" encoding="UTF-8"?&
&beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"&
&bean id="quartzManagerBean" class="com.quartz.QuartzManager"&
&property name="scheduler" ref="schedulerManager" /&
&bean id="quartzManagerJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"&
&property name="targetObject" ref="quartzManagerBean" /&
&property name="targetMethod" value="reScheduleJob" /&
&property name="concurrent" value="false" /&
&!-- 主定时计划 --&
&bean id="quartzManagerTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerBean"&
&property name="jobDetail" ref="quartzManagerJobDetail" /&
&!-- 延时1分钟 执行任务 --&
&property name="startDelay" value="1000" /&
&!-- 任务执行周期 5分钟 --&
&property name="repeatInterval" value="6000" /&
&!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序
&bean id="schedulerManager" lazy-init="false" autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&
&property name="triggers"&
&ref bean="quartzManagerTrigger" /&
&/property&
proxool.xml数据库配置文件:
&?xml version="1.0" encoding="UTF-8"?&
&something-else-entirely&
&alias&sys&/alias&
&driver-url&
jdbc:oracle:thin:@localhost:1521:ajhz
&/driver-url&
&driver-class&oracle.jdbc.driver.OracleDriver&/driver-class&
&driver-properties&
&property name="user" value="ajhz" /&
&property name="password" value="ajhz" /&
&property name="autoReconnect" value="true" /&
&/driver-properties&
&maximum-connection-count&70&/maximum-connection-count&
&minimum-connection-count&10&/minimum-connection-count&
&house-keeping-sleep-time&90000&/house-keeping-sleep-time&
&simultaneous-build-throttle&10&/simultaneous-build-throttle&
&prototype-count&5&/prototype-count&
&test-before-use&true&/test-before-use&
&house-keeping-test-sql&
select sysdate from dual
&/house-keeping-test-sql&
&verbose&true&/verbose&
&statistics&10s,1m,1d&/statistics&
&statistics-log-level&ERROR&/statistics-log-level&
&/proxool&
&/something-else-entirely&
log4j.properties日志配置文件:
log4j.rootLogger= info,logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - &%m&%n
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
#log4j.appender.logfile.File=${catalina.base}/webapps/zdin/zdin.log
log4j.appender.logfile.MaxFileSize=512KB
log4j.appender.logfile.MaxBackupIndex=100
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
web.xml配置文件
&?xml version="1.0" encoding="UTF-8"?&
&web-app version="2.4" xmlns="/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/j2ee
/xml/ns/j2ee/web-app_2_4.xsd"&
&!-- proxool连接池 --&
&servlet-name&ServletConfigurator&/servlet-name&
&servlet-class&
org.logicalcobwebs.proxool.configuration.ServletConfigurator
&/servlet-class&
&init-param&
&param-name&xmlFile&/param-name&
&param-value&WEB-INF/classes/proxool.xml&/param-value&
&/init-param&
&load-on-startup&1&/load-on-startup&
&/servlet&
&servlet-name&Admin&/servlet-name&
&servlet-class&
org.logicalcobwebs.proxool.admin.servlet.AdminServlet
&/servlet-class&
&/servlet&
&servlet-name&contextConfigLocation&/servlet-name&
&servlet-class&
org.springframework.web.context.ContextLoaderServlet
&/servlet-class&
&load-on-startup&2&/load-on-startup&
&/servlet&
&context-param&
&param-name&contextConfigLocation&/param-name&
&param-value&classpath:applicationContext*.xml&/param-value&
&/context-param&
&welcome-file-list&
&welcome-file&index.jsp&/welcome-file&
&/welcome-file-list&
&/web-app&
下载次数: 489
浏览 13046
浏览: 112986 次
来自: 长沙
您好,能把dbsyn_config_quartz这个表发给我一 ...
我用了comet4j 结果因为推送比较频繁(基本上1秒一次), ...
nice,还不错哦,谢谢啦!!!
自定义的线程中的逻辑每次都是被执行两次,不知道为什么啊。比如打 ...
我倒,原来要配置tomcat。。。果然是高手,对于只看不动手的 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 python scheduler 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信