Quartz官方文档教程
什么是作业。我简单点说吧,比如你每天早晨7点希望被手机闹铃闹醒,闹铃在固定时间响起来就是一个作业, 手机设定某个时间闹铃就是调度。在我们项目里比较常见的就是固定某个时间执行某个任务,或者间隔一定时间反复执行某个任务,举个生活 的例子,比如我想在女朋友生日那天0点给她;又比如我想每隔1秒发送一条垃圾邮件给你(不要用quartz做坏事啊),呵呵......
上次简单看了个例子,这次看官方示例2,由于示例2比较长,我拆开来讲解,分为a,b2部分,下次一次讲完。
看了上次的例子,我们可以发现一些规律,所谓的作业,我们用JAVA写的时候只要实现Job接口,在execute方法内部实现我们的作业代码就可以了。而另外一个类则是调度类,比如对于我们的作业,我们需要调度器,用调度器给我们的作业进行一定的分组,命名,指定时间,因为我们要执行的作业可能很多,完成后就不用管了,我们的作业会在指定时间完成。
下面我们来看示例代码:
上次简单看了个例子,这次看官方示例2,由于示例2比较长,我拆开来讲解,分为a,b2部分,下次一次讲完。
看了上次的例子,我们可以发现一些规律,所谓的作业,我们用JAVA写的时候只要实现Job接口,在execute方法内部实现我们的作业代码就可以了。而另外一个类则是调度类,比如对于我们的作业,我们需要调度器,用调度器给我们的作业进行一定的分组,命名,指定时间,因为我们要执行的作业可能很多,完成后就不用管了,我们的作业会在指定时间完成。
下面我们来看示例代码:
1.新建项目QuartzL001,在src下新建l
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="/log4j/">
<appender name="default" class="org.apache.log4j.ConsoleAppender">
<param name="target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p] %d{dd MMM hh:mm:ss.SSS aa} %t [%c]%n%m%n%n"/>
</layout>
</appender>
<logger name="org.quartz">
<level value="info" />
</logger>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="/log4j/">
<appender name="default" class="org.apache.log4j.ConsoleAppender">
<param name="target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p] %d{dd MMM hh:mm:ss.SSS aa} %t [%c]%n%m%n%n"/>
</layout>
</appender>
<logger name="org.quartz">
<level value="info" />
</logger>
<root>
<level value="info" />
<appender-ref ref="default" />
</root>
</log4j:configuration>
2.导入如下包,用MyEclipse导入javaee.jar,JDK所有包,quartz-1.6.0.jar,commons-logging.jar,log4j.jar,commons-collections.jar。
3.新建com.zbaccp.SimpleJob类
package com.zbaccp;
import java.util.Date;
import org.apachemons.logging.Log;
import org.apachemons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
<level value="info" />
<appender-ref ref="default" />
</root>
</log4j:configuration>
2.导入如下包,用MyEclipse导入javaee.jar,JDK所有包,quartz-1.6.0.jar,commons-logging.jar,log4j.jar,commons-collections.jar。
3.新建com.zbaccp.SimpleJob类
package com.zbaccp;
import java.util.Date;
import org.apachemons.logging.Log;
import org.apachemons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
//上次的例子不知道有没有看懂,这次我们正式入门
//如果有想反复执行的动作,作业,任务就把相关的代码写在execute这个方法里,前提:实现Job这个接口
//至于SimpleJob这个类什么时候实例化,execute这个方法何时被调用,我们不用关注,交给Quartz
public class SimpleJob implements Job {
private static Log _log = Log(SimpleJob.class);
public SimpleJob() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException {
//上次的例子不知道有没有看懂,这次我们正式入门
//如果有想反复执行的动作,作业,任务就把相关的代码写在execute这个方法里,前提:实现Job这个接口
//至于SimpleJob这个类什么时候实例化,execute这个方法何时被调用,我们不用关注,交给Quartz
public class SimpleJob implements Job {
private static Log _log = Log(SimpleJob.class);
public SimpleJob() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException {
//这个作业只是简单的打印出作业名字和此作业运行的时间
String jobName = JobDetail().getFullName();
_log.info("SimpleJob says: " + jobName + " executing at " + new Date());
}
}
4.新建com.zbaccp.SimpleTriggerExample类
package com.zbaccp;
import java.util.Date;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;
String jobName = JobDetail().getFullName();
_log.info("SimpleJob says: " + jobName + " executing at " + new Date());
}
}
4.新建com.zbaccp.SimpleTriggerExample类
package com.zbaccp;
import java.util.Date;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;
import org.apachemons.logging.LogFactory;
import org.apachemons.logging.Log;
/**
* 这个例子展示Quartz的 简单触发器 所具备的基本调度能力
*
* @author 张帅
*/
public class SimpleTriggerExample {
public void run() throws Exception {
Log log = Log(SimpleTriggerExample.class);
log.info("------- 初始化 -------------------");
// 首先我们得获得一个调度器
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
import org.apachemons.logging.Log;
/**
* 这个例子展示Quartz的 简单触发器 所具备的基本调度能力
*
* @author 张帅
*/
public class SimpleTriggerExample {
public void run() throws Exception {
Log log = Log(SimpleTriggerExample.class);
log.info("------- 初始化 -------------------");
// 首先我们得获得一个调度器
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
log.info("------- 初始化结束 --------");
log.info("------- 调度一个作业,简单的说就是给一个任务定一个时间启动 ----------------");
// 所有的作业都可以在sched.start()被调用前调度
// 获取下个15秒的开始,如当前是10秒,则在15秒执行,如实16秒,则在30秒执行
// 如果不喜欢这个方法,自己定义一个Date也可以
long ts = NextGivenSecondDate(null, 15).getTime();
// job1将在ts这个时间触发执行,我们的作业叫job1,属于group1组
JobDetail job = new JobDetail("job1", "group1", SimpleJob.class);
SimpleTrigger trigger =
new SimpleTrigger("trigger1", "group1", new Date(ts));//此处ts可以自己设置一个Date
// 将作业加入调度队列,返回作业执行时间
Date ft = sched.scheduleJob(job, trigger);
sched.start();//调度器启动作业,相当于神舟7号点火了,具体什么时候飞天,还得看火
log.info("------- 调度一个作业,简单的说就是给一个任务定一个时间启动 ----------------");
// 所有的作业都可以在sched.start()被调用前调度
// 获取下个15秒的开始,如当前是10秒,则在15秒执行,如实16秒,则在30秒执行
// 如果不喜欢这个方法,自己定义一个Date也可以
long ts = NextGivenSecondDate(null, 15).getTime();
// job1将在ts这个时间触发执行,我们的作业叫job1,属于group1组
JobDetail job = new JobDetail("job1", "group1", SimpleJob.class);
SimpleTrigger trigger =
new SimpleTrigger("trigger1", "group1", new Date(ts));//此处ts可以自己设置一个Date
// 将作业加入调度队列,返回作业执行时间
Date ft = sched.scheduleJob(job, trigger);
sched.start();//调度器启动作业,相当于神舟7号点火了,具体什么时候飞天,还得看火
着的速度
log.FullName() +
" 将在: " + ft +
" 执行 并且重复执行: " + RepeatCount() +
" 次, 每次执行间隔 " + RepeatInterval() / 1000 + " 秒");
log.info("------- 等待1分钟... ------------");log4j2 appender
try {
// wait five minutes to show jobs
Thread.sleep(1000*60);
//
} catch (Exception e) {
}
log.info("------- 关闭调度器 ---------------------");
sched.shutdown(true);
log.FullName() +
" 将在: " + ft +
" 执行 并且重复执行: " + RepeatCount() +
" 次, 每次执行间隔 " + RepeatInterval() / 1000 + " 秒");
log.info("------- 等待1分钟... ------------");log4j2 appender
try {
// wait five minutes to show jobs
Thread.sleep(1000*60);
//
} catch (Exception e) {
}
log.info("------- 关闭调度器 ---------------------");
sched.shutdown(true);
log.info("------- 关闭结束-----------------");
}
public static void main(String[] args) throws Exception {
SimpleTriggerExample example = new SimpleTriggerExample();
example.run();
}
}
5.运行看结果吧
}
public static void main(String[] args) throws Exception {
SimpleTriggerExample example = new SimpleTriggerExample();
example.run();
}
}
5.运行看结果吧
C:\qu>javac SimpleTriggerExample.java
C:\qu>java SimpleTriggerExample
[INFO] 08 一月 10:52:36.100 下午 main [SimpleTriggerExample]
------- 初始化 -------------------
[INFO] 08 一月 10:52:36.100 下午 main [SimpleTriggerExample]
------- 初始化 -------------------
[INFO] 08 一月 10:52:36.341 下午 main [org.quartz.simpl.SimpleThreadPool]
Job execution threads will use class loader of thread: main
Job execution threads will use class loader of thread: main
[INFO] 08 一月 10:52:36.461 下午 main [SchedulerSignalerImpl]
Initialized Scheduler Signaller of type: class SchedulerSignale Impl
Initialized Scheduler Signaller of type: class SchedulerSignale Impl
[INFO] 08 一月 10:52:36.461 下午 main [QuartzScheduler]
Quartz Scheduler v.1.6.6 created.
Quartz Scheduler v.1.6.6 created.
[INFO] 08 一月 10:52:36.481 下午 main [org.quartz.simpl.RAMJobStore]
RAMJobStore initialized.
RAMJobStore initialized.
[INFO] 08 一月 10:52:36.491 下午 main [org.quartz.impl.StdSchedulerFactory]
Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
[INFO] 08 一月 10:52:36.491 下午 main [org.quartz.impl.StdSchedulerFactory]
Quartz scheduler version: 1.6.6
Quartz scheduler version: 1.6.6
[INFO] 08 一月 10:52:36.491 下午 main [SimpleTriggerExample]
------- 初始化结束 --------
------- 初始化结束 --------
[INFO] 08 一月 10:52:36.491 下午 main [SimpleTriggerExample]
------- 调度一个作业,简单的说就是给一个任务定一个时间启动 ----------------
------- 调度一个作业,简单的说就是给一个任务定一个时间启动 ----------------
[INFO] 08 一月 10:52:36.521 下午 main [QuartzScheduler]
Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
[INFO] 08 一月 10:52:36.531 下午 main [SimpleTriggerExample]
group1.job1 将在: Fri Jan 08 22:52:45 CST 2010 执行 并且重复执行: 0 次, 每次执行间隔 0 秒
group1.job1 将在: Fri Jan 08 22:52:45 CST 2010 执行 并且重复执行: 0 次, 每次执行间隔 0 秒
[INFO] 08 一月 10:52:36.541 下午 main [SimpleTriggerExample]
------- 等待1分钟... ------------
------- 等待1分钟... ------------
[INFO] 08 一月 10:52:45.224 下午 DefaultQuartzScheduler_Worker-1 [SimpleJob]
SimpleJob says: group1.job1 executing at Fri Jan 08 22:52:45 CST 2010
SimpleJob says: group1.job1 executing at Fri Jan 08 22:52:45 CST 2010
[INFO] 08 一月 10:53:36.547 下午 main [SimpleTriggerExample]
------- 关闭调度器 ---------------------
------- 关闭调度器 ---------------------
[INFO] 08 一月 10:53:36.557 下午 main [QuartzScheduler]
Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.
Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.
[INFO] 08 一月 10:53:36.557 下午 main [QuartzScheduler]
Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.
Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.
[INFO] 08 一月 10:53:36.557 下午 main [QuartzScheduler]
Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.
Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.
[INFO] 08 一月 10:53:36.557 下午 main [SimpleTriggerExample]
------- 关闭结束-----------------
------- 关闭结束-----------------
_______________________________________________________________________________________________________________________________
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论