quartz 执行了两次任务调度问题,每次都执行两次 相隔只有几微秒

博客分类:
一、Quartz简介
&&& Quartz是一个开放源码项目,专注于任务调度器,提供了极为广泛的特性如持久化任务,集群和分布式任务等。Spring对Quartz的集成与其对JDK Timer的集成在任务、触发器和调度计划的声明式配置方面等都非常相似。
&&& Quartz的核心由两个接口和两个类组成:Job和Scheduler接口,JobDetail和Trigger类。不同于JDK Timer,任务不是从实现一个Job接口的类实例开始运行,实际上Quartz在需要的时候才创建job类实例。可以使用JobDetail类来包装任务状态,并传递一个信息给Job,或在一个Job的多次执行过程之间保存信息。
二、Quartz任务调度
1. 简单任务调度
&&& 在Quartz中创建一个任务并执行,只需要实现Job接口类,在其execute()方法中处理你的业务逻辑。下面举例说明。
HelloWorldJob.java
package com.learnworld.
import org.quartz.J
import org.quartz.JobExecutionC
import org.quartz.JobExecutionE
public class HelloWorldJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
//实现你的业务逻辑
System.out.println("Hello!");
HelloScheduling.java
package com.learnworld.
import java.util.D
import org.quartz.JobD
import org.quartz.S
import org.quartz.SimpleT
import org.quartz.T
import org.quartz.impl.StdSchedulerF
public class HelloScheduling {
public static void main(String[] args) throws Exception {
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
JobDetail jobDetail = new JobDetail("helloWorldJob",
Scheduler.DEFAULT_GROUP, HelloWorldJob.class);
Trigger trigger = new SimpleTrigger("simpleTrigger",
Scheduler.DEFAULT_GROUP, new Date(), null,
SimpleTrigger.REPEAT_INDEFINITELY, 1000);
scheduler.scheduleJob(jobDetail, trigger);
需要说明几点:
&&& 1)开始使用StdSchedulerFactory来获取Scheduler的实例。每一个scheduler可以被启动(start)、中止(stop)和暂停(pause)。如果一个scheduler没有被启动或已经被暂停,则没有触发器会被启用,所以首先使用start()方法启动scheduler。
&&& 2)创建JobDetail实例。它的构造参数有三个,第一个是任务名,任务名可以被用作参数来应用需要暂停的任务;第二个是组名,组名可以用来引用一组被集合在一起的任务,这里采用缺省组名,每一个任务名在组内必须是唯一的;第三个参数是实现了特定任务的类。
&&& 3)创建Trigger实例。我们使用SimpleTrigger类,它提供了类似JDK Timer风格的触发器行为。它的构造参数有六个,第一个和第二个为触发器名和组名,和上面类似;第三个为任务开始时间;第四个为结束时间,如果设置为空,表示不存在结束时间;第五个为重复次数,允许你指的触发器被触发的最大次数,使用REPEAT_INDEFINITELY允许触发器可以被触发无限次;第六个是触发器运行的时间间隔,是毫秒数。
&&& 4)最后通过scheduler.scheduleJob()方法调度任务。
2. 使用JobDetail传递数据
&&& 每个JobDetail实例都有关联的JobDataMap实例,它实现了Map接口并允许通过键值来传递任务相关的数据。任务也可以修改JobDataMap中的数据,在同一任务的多次执行之间传递数据。下面举例说明。
MessageJob.java
package com.learnworld.
import java.util.M
import org.quartz.J
import org.quartz.JobExecutionC
import org.quartz.JobExecutionE
public class MessageJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
Map properties = context.getJobDetail().getJobDataMap();
System.out.println("Previous Fire Time: " + context.getPreviousFireTime());
System.out.println("Current Fire Time: " + context.getFireTime());
System.out.println("Next Fire Time: " + context.getNextFireTime());
System.out.println(properties.get("message"));
MessageScheduling.java
package com.learnworld.
import java.util.D
import java.util.M
import org.quartz.JobD
import org.quartz.S
import org.quartz.SimpleT
import org.quartz.T
import org.quartz.impl.StdSchedulerF
public class MessageScheduling {
public static void main(String[] args) throws Exception {
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
JobDetail jobDetail = new JobDetail("messageJob",
Scheduler.DEFAULT_GROUP, MessageJob.class);
Map map = jobDetail.getJobDataMap();
map.put("message", "This is a message from Quartz");
Trigger trigger = new SimpleTrigger("simpleTrigger",
Scheduler.DEFAULT_GROUP, new Date(), new Date("Sat, 12 Aug :00 GMT+0430"),
SimpleTrigger.REPEAT_INDEFINITELY, 5000);
scheduler.scheduleJob(jobDetail, trigger);
3. 使用CronTrigger
&& 上面提到了SimpleTrigger类,它提供了类似JDK Timer风格的触发器功能。Quartz的出色在于它使用CronTrigger提供了对复杂触发器的支持。
&&& 一个CronTrigger表达式,包含六个必须组件和一个可选组件。关于cron表达式,可以参考这篇文档:
&& 下面举例说明CronTrigger的使用。
CronWithCalendarScheduling.java
package com.learnworld.
import java.util.C
import java.util.D
import java.util.M
import org.quartz.CronT
import org.quartz.JobD
import org.quartz.S
import org.quartz.SimpleT
import org.quartz.T
import org.quartz.impl.StdSchedulerF
import org.quartz.impl.calendar.HolidayC
public class CronWithCalendarScheduling {
public static void main(String[] args) throws Exception {
Calendar cal = Calendar.getInstance();
cal.set(2010, Calendar.OCTOBER, 31);
HolidayCalendar calendar
= new HolidayCalendar();
calendar.addExcludedDate(cal.getTime());
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.addCalendar("calendar", calendar, true, false);
JobDetail jobDetail = new JobDetail("messageJob",
Scheduler.DEFAULT_GROUP, MessageJob.class);
Map map = jobDetail.getJobDataMap();
map.put("message", "This is a message from Quartz");
String cronExpression = "3/5 * 17,18,19,20 * * ?";
Trigger trigger = new CronTrigger("cronTrigger",
Scheduler.DEFAULT_GROUP, cronExpression);
scheduler.scheduleJob(jobDetail, trigger);
需要说明几点:
&&& 1)创建了HolidayCalendar实例,使用addExcluderData()方法排除了日。再使用addCalendar()方法,将这个Calendar加入到Scheduler中。
&&& 2)这个cron表达式的含义是,每天17:00-20:59之间每一分钟的第三秒开始运行,每五秒执行一次。
三. Spring对Quartz调度的支持
&&& Spring对Quartz集成与其对JDK Timer调度集成类似,你可以在配置文件中配置任务调度。仅需要在程序里加载ApplicationContext,Spring会自动启动调度器。
quartz.xml
&?xml version="1.0" encoding="UTF-8"?&
&!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&
&bean id="job"
class="org.springframework.scheduling.quartz.JobDetailBean"&
&property name="jobClass"&
&value& com.learnworld.quartz.MessageJob &/value&
&/property&
&property name="jobDataAsMap"&
&entry key="message"&
&value&This is a message from Spring Quartz configuration!&/value&
&/property&
&bean id="trigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"&
&property name="startDelay"&
&value&1000&/value&
&/property&
&property name="repeatInterval"&
&value&3000&/value&
&/property&
&property name="jobDetail"&
&ref local="job" /&
&/property&
&bean id="schdulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&
&property name="triggers"&
&ref local="trigger" /&
&/property&
SimpleSpringQuartzIntegration.java
package com.learnworld.
import org.springframework.context.ApplicationC
import org.springframework.context.support.FileSystemXmlApplicationC
public class SimpleSpringQuartzIntegration {
public static void main(String[] args) {
ApplicationContext ac = new FileSystemXmlApplicationContext("src/conf/quartz.xml");
需要说明几点:
&&& 1)采用JobDetailBean类,它扩展了JobDetai类,采用可声明方式配置任务数据。缺省情况下,采用&bean&标签的id作为任务名,使用缺省组作为组名,通过jobDataAsMap作为配置任务数据。
&&& 2)建立触发器。可以选择SimpleTriggerBean或CronTriggerBean类。SimpleTriggerBean缺省情况下把可重复执行次数设为无限。
&&& 3)创建schedulerFactory。缺省情况下,SchedulerFactoryBean创建一个StdSchedulerFactory的实例,后者创建Scheduler的实现。可以通过设置schedulerFactoryClass属性来覆盖这个行为,需要继承SchedulerFactory接口来实现你自己的版本。
论坛回复 /
(11 / 17553)
[ 13:47:22]ERROR org.springframework.web.context.ContextLoader(line:215) -Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'quartzScheduler' defined in file [F:\Project\My2Space\.metadata\.plugins\com.genuitec.eclipse.easie.tomcat.myeclipse\tomcat\webapps\quartzMonitor\WEB-INF\classes\spring\applicationContext-quartz.xml]: Invocation o nested exception is org.quartz.SchedulerConfigException: Failure occured during job recovery. [See nested exception: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: 第 1 行: 只有 DECLARE CURSOR 才允许使用 FOR UPDATE 子句。 [See nested exception: com.microsoft.sqlserver.jdbc.SQLServerException: 第 1 行: 只有 DECLARE CURSOR 才允许使用 FOR UPDATE 子句。]]
这个错误是为什么啊???
能否把你的配置文件贴出来,看上去应该是任务配置的数据源和已有的其他数据源冲突了。
没看出来HelloWorldJob跟MessageScheduler有什么关系??楼主是否拷错了,少个HelloScheduler?
谢谢提醒,我把HelloScheduler拷贝成MessageScheduler,已经修改过来。
learnworld
浏览: 124350 次
来自: 南京
用webloginc或者websphere容器的时候 jps抄 ...
赞,忍不住转载分享一下
api callback error!是怎么回事,谢谢
java struts框架demo使用实例教程源代码下载,地址 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'quartz任务调度执行时每次都执行两次 - CSDN博客
quartz任务调度执行时每次都执行两次
&&&&&&&&问题解决:把quartz 单独用一个xml配置,在中导入,就不会执行两次了
本文已收录于以下专栏:
相关文章推荐
转自 :http://my.oschina.net/EugeneQiu/blog/265040?p=1
解决quartz定时任务被触发两次的问题 方法1、通过改TOMCAT的配置文件se...
这两天发现部署到tomcat中的quartz定时任务每回都被执行了两次,但是在myeclipse执行时又不会,后来搜了网上,才发现该问题只发生于部署在tomcat服务器上,由tomcat的自启动导致。...
元素类型为 &package& 的内容必须匹配 &(result-types?,interceptors?,default-interceptor-ref?,default-action-ref?..
Java用JavaService实现Windows系统服务
此次项目使用的是Win7系统
at文件[含有启动jar包]做成系统服务
Bat文件内容:
cd d:/test/
echo in success!
ping 127.1 & test11log.t...
如果你玩windows系统,你对服务这个东西并不会陌生,服务可以帮我们做很多事情,在不影响用户正常工作的情况下,可以完成很多我们需要的需求。
众所周知,微软的visio studio内置的Servic...
1、下载JavaService.exe
2、在D盘建立一个文件夹如:D:/server 将要发布的jar文件和JavaService.exe拷贝到新建的server下面
3、用cmd命令进...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 quartz任务调度框架 的文章

 

随机推荐