到下班时间了,赶快把这篇博文写完。今天终于把项目中用到Quartz部分的功能写完了。好了,废话不多说了,继续上次的学习记录。我们来看第二个例子,这个例子中主要讲到的是使用SimpleTrigger这个对象,这个对象可以在未来某一个时刻定时执行一项任务,可以执行多个任务,可以重复这些任务和次数与间隔(时间、次数)。
项目界面:
首先,我们当然需要看下我们执行任务的类,直接上代码:
SimpleJob.java
- package main.java.org.quartz.examples.example2;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.quartz.Job;
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
- import org.quartz.JobKey;
- public class SimpleJob implements Job {
- private static Logger _log = LoggerFactory.getLogger(SimpleJob.class);
- public SimpleJob() {}
- public void execute(JobExecutionContext context)
- throws JobExecutionException {
- JobKey jobKey = context.getJobDetail().getKey();
- SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- //这里的jobkey,API里是这样说的:
- //它标识一个唯一的jobDetail
- //key是由组名称和job名称组成,job名称必须是惟一的。
- //如果只有一个组名称,那么它的组名称默认就被指定为这个组名称。
- //意思就是job的组名称和job名称
- _log.info("jobKey: " + jobKey + "执行时间:" + sdf.format(new Date()));
- }
- }
下面是我们的任务调度程序(记得上节讲的那几个步骤,创建调度就不成问题)
SimpleTriggerExample.java
- package main.java.org.quartz.examples.example2;
- import static org.quartz.JobBuilder.newJob;
- import static org.quartz.TriggerBuilder.newTrigger;
- import java.util.Date;
- import org.quartz.DateBuilder;
- import org.quartz.JobDetail;
- import org.quartz.Scheduler;
- import org.quartz.SchedulerFactory;
- import org.quartz.SchedulerMetaData;
- import org.quartz.SimpleTrigger;
- import org.quartz.impl.StdSchedulerFactory;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- public class SimpleTriggerExample {
- public void run() throws Exception {
- Logger log = LoggerFactory.getLogger(SimpleTriggerExample.class);
- log.info("------- Initializing -------------------");
- SchedulerFactory sf = new StdSchedulerFactory();
- Scheduler sched = sf.getScheduler();
- log.info("------- Initialization Complete --------");
- log.info("------- Scheduling Jobs ----------------");
- //当前时间加15秒
- Date startTime = DateBuilder.nextGivenSecondDate(null, 15);
- JobDetail job = newJob(SimpleJob.class)
- .withIdentity("job1", "group1")
- .build();
- SimpleTrigger trigger = (SimpleTrigger) newTrigger()
- .withIdentity("trigger1", "group1")
- .startAt(startTime)
- .build();
- Date ft = sched.scheduleJob(job, trigger);
- sched.addJob(job, true);
- log.info(job.getKey() +
- " will run at: " + ft +
- " and repeat: " + trigger.getRepeatCount() +
- " times, every " + trigger.getRepeatInterval() / 1000 + " seconds");
- log.info("------- 开始 Scheduling Jobs... --------------");
- log.info("------- 等待 30 秒... --------------");
- sched.start();
- try {
- Thread.sleep(30 * 1000);
- } catch (Exception e) {
- }
- log.info("------- 关闭 ---------------------");
- sched.shutdown(true);
- log.info("------- 关闭完成 -----------------");
- SchedulerMetaData metaData = sched.getMetaData();
- log.info("执行了 " + metaData.getNumberOfJobsExecuted() + " 个工作。");
- }
- public static void main(String[] args) throws Exception {
- SimpleTriggerExample example = new SimpleTriggerExample();
- example.run();
- }
- }
这里我只执行了一次任务调度,如果想要执行多个任务只需要newJob、newTrigger,之后sched.addJob(job, true);将其加进任务调度队列里面就可以了。
- SimpleTrigger trigger = newTrigger()
- .withIdentity("trigger7", "group1")
- .startAt(startTime)
- .withSchedule(simpleSchedule()
- .withIntervalInMinutes(5)
- .withRepeatCount(20))
- .build();
这里可以设置它的循环次数和间隔时间。(这里指的意思是每隔5分钟执行一次任务,共执行20次)
withIntervalInminutes()这个方法是在org.quartz.SimpleScheduleBuilder包下的,里面包含了很多方法(它们都返回 SimpleScheduleBuilder)
withIntervalInHours(int intervalInHours) 指定一个重复间隔以小时为单位。
withIntervalInMilliseconds(long intervalInMillis) 指定一个重复间隔以毫秒为单位。
withIntervalInMinutes(int intervalInMinutes) 指定一个重复间隔以分钟为单位。
withIntervalInSeconds(int intervalInSeconds) 指定一个重复间隔以秒为单位。
……
withRepeatCount(int number):这个一看就明白,是执行多少次的意思。
startAt(Date startTime):定时开始执行的时间
endAt(Date triggerEndTime):定时结束执行的时间
具体可以到DOC文件夹下看API。。。。这里不多说了。。。
好吧,来看下执行后控制台打印的信息:
- [INFO] 12 六月 07:15:30.812 下午 main [main.java.org.quartz.examples.example2.SimpleTriggerExample]
- ------- Initializing -------------------
- [INFO] 12 六月 07:15:30.859 下午 main [org.quartz.impl.StdSchedulerFactory]
- Using default implementation for ThreadExecutor
- [INFO] 12 六月 07:15:30.859 下午 main [org.quartz.simpl.SimpleThreadPool]
- Job execution threads will use class loader of thread: main
- [INFO] 12 六月 07:15:30.890 下午 main [org.quartz.core.SchedulerSignalerImpl]
- Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
- [INFO] 12 六月 07:15:30.890 下午 main [org.quartz.core.QuartzScheduler]
- Quartz Scheduler v.2.1.5 created.
- [INFO] 12 六月 07:15:30.890 下午 main [org.quartz.simpl.RAMJobStore]
- RAMJobStore initialized.
- [INFO] 12 六月 07:15:30.890 下午 main [org.quartz.core.QuartzScheduler]
- Scheduler meta-data: Quartz Scheduler (v2.1.5) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
- Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
- NOT STARTED.
- Currently in standby mode.
- Number of jobs executed: 0
- Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
- Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.
- [INFO] 12 六月 07:15:30.890 下午 main [org.quartz.impl.StdSchedulerFactory]
- Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
- [INFO] 12 六月 07:15:30.890 下午 main [org.quartz.impl.StdSchedulerFactory]
- Quartz scheduler version: 2.1.5
- [INFO] 12 六月 07:15:30.890 下午 main [main.java.org.quartz.examples.example2.SimpleTriggerExample]
- ------- Initialization Complete --------
- [INFO] 12 六月 07:15:30.890 下午 main [main.java.org.quartz.examples.example2.SimpleTriggerExample]
- ------- Scheduling Jobs ----------------
- [INFO] 12 六月 07:15:30.921 下午 main [main.java.org.quartz.examples.example2.SimpleTriggerExample]
- group1.job1 will run at: Tue Jun 12 19:15:45 CST 2012 and repeat: 0 times, every 0 seconds
- [INFO] 12 六月 07:15:30.921 下午 main [main.java.org.quartz.examples.example2.SimpleTriggerExample]
- ------- 开始 Scheduling Jobs... --------------
- [INFO] 12 六月 07:15:30.921 下午 main [main.java.org.quartz.examples.example2.SimpleTriggerExample]
- ------- 等待 30 秒... --------------
- [INFO] 12 六月 07:15:30.921 下午 main [org.quartz.core.QuartzScheduler]
- Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
- [INFO] 12 六月 07:15:45.000 下午 DefaultQuartzScheduler_Worker-1 [main.java.org.quartz.examples.example2.SimpleJob]
- jobKey: group1.job1执行时间:2012-06-12 19:15:45
- [INFO] 12 六月 07:16:00.921 下午 main [main.java.org.quartz.examples.example2.SimpleTriggerExample]
- ------- 关闭 ---------------------
- [INFO] 12 六月 07:16:00.921 下午 main [org.quartz.core.QuartzScheduler]
- Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.
- [INFO] 12 六月 07:16:00.921 下午 main [org.quartz.core.QuartzScheduler]
- Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.
- [INFO] 12 六月 07:16:01.406 下午 main [org.quartz.core.QuartzScheduler]
- Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.
- [INFO] 12 六月 07:16:01.406 下午 main [main.java.org.quartz.examples.example2.SimpleTriggerExample]
- ------- 关闭完成 -----------------
- [INFO] 12 六月 07:16:01.406 下午 main [main.java.org.quartz.examples.example2.SimpleTriggerExample]
- 执行了 1 个工作。
饿死了,赶快回家吃饭。下节继续。
=======================================================================
以上属于个人观点,难免有错误,如发现错误请留言告之,我会订正的。
=======================================================================