Java定时器Quartz初体验

Quartz 官网 http://quartz-scheduler.org
Quartz各版本下载地址http://quartz-scheduler.org/downloads/catalog
Quartz官方文档地址http://www.quartz-scheduler.org/documentation
Release Notes:
Quartz 2.0.2, 5/27/2011
Quartz 1.8.5, 4/12/2011
Quartz 1.7.3, 2/23/2010
Quartz 1.6.6, 11/2/2009
Quartz 1.5.2, 3/3/2006
Quartz 1.4.5, 3/13/2005
搜了一下网络上的很多有关Quartz的中文版的东西还都是1.6版本前的,看来近两年大家使用Quartz的不多啊。但是项目需求需要我学习一下,还是用最新的2.0.2吧。
包里面有15个例子,我慢慢看吧,估计这十五个例子看完就基本掌握了Quartz了吧。

按照官方的Quick Start:[url]http://www.quartz-scheduler.org/documentation/quartz-2.1.x/quick-start[/url]
首先看看quartz.properties的配置文件吧,不过貌似只有例10,11,14用了。
org.quartz.scheduler.instanceName: PriorityExampleScheduler

# Set thread count to 1 to force Triggers scheduled for the same time to
# to be ordered by priority.
org.quartz.threadPool.threadCount: 1
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool

org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore


先上一个例1吧:
Job类,你要执行的Job

package com.oneregal.util;

import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
* @author yiranrenxiaoyao
*/
public class HelloJob implements Job {

private static Logger _log = LoggerFactory.getLogger(HelloJob.class);

public HelloJob() {
}

/**
*
* @throws JobExecutionException
* if there is an exception while executing the job.
*/
public void execute(JobExecutionContext context)
throws JobExecutionException {


// Say Hello to the World and display the date/time
_log.info("Hello World! - " + new Date());

JobKey jobKey = context.getJobDetail().getKey();
JobDataMap dataMap = context.getJobDetail().getJobDataMap();

String jobSays = dataMap.getString("jobSays");
float myFloatValue = dataMap.getFloat("myFloatValue");
System.out.println("JobSays:" + jobSays);
}

}

真正的定时器在这里:

package com.oneregal.util;

import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
import static org.quartz.DateBuilder.*;

import java.util.Date;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* @author yiranrenxiaoyao
*/
public class SimpleExample {


public void run() throws Exception {
Logger log = LoggerFactory.getLogger(SimpleExample.class);

log.info("------- Initializing ----------------------");

// First we must get a reference to a scheduler
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();

log.info("------- Initialization Complete -----------");

// computer a time that is on the next round minute
Date runTime = evenMinuteDate(new Date());

log.info("------- Scheduling Job -------------------");

// define the job and tie it to our HelloJob class
//You will typically want to use a static import of all of its methods,
//in order to have the DSL-feel within your code.
//以上是官方文档里面的解释为什么用import static,可以让你DSL-feel,
//这feel其实我觉得到不太习惯呢,还是更喜欢JobBuilder.newJob(HelloJob.class)
JobDetail job = newJob(HelloJob.class)
.withIdentity("job1", "group1")
.usingJobData("jobSays", "Hello Quartz!")
.usingJobData("myFloatValue", 3.1415926f)
.build();
//Tutorials里面有.usingJobData("myStateData", new ArrayList()),可是我看API里面
//Value属性只有Boolean,Double,Float,Integer,Long,没看到Object或者List
//但是usingJobData(JobDataMap)这个就实用多了,类似Java的Map可以随意往里面塞数据了
//JobDataMap dMap = new JobDataMap();dMap.put(key,value);

// Trigger the job to run on the next round minute
Trigger trigger = newTrigger()
.withIdentity("trigger1", "group1")
.startAt(runTime)
.build();

// Tell quartz to schedule the job using our trigger
sched.scheduleJob(job, trigger);
log.info(job.getKey() + " will run at: " + runTime);

// Start up the scheduler (nothing can actually run until the
// scheduler has been started)
sched.start();

log.info("------- Started Scheduler -----------------");

// wait long enough so that the scheduler as an opportunity to
// run the job!
log.info("------- Waiting 65 seconds... -------------");
try {
// wait 65 seconds to show job
Thread.sleep(65L * 1000L);
// executing...
} catch (Exception e) {
}

// shut down the scheduler
log.info("------- Shutting Down ---------------------");
sched.shutdown(true);
log.info("------- Shutdown Complete -----------------");
}

public static void main(String[] args) throws Exception {

SimpleExample example = new SimpleExample();
example.run();

}

}

新老版本的改动还是挺大的
JobDetail jobDetail = new JobDetail("jobDetail-s1", "jobDetailGroup-s1", HelloJob.class);
新版本的JobDetail也改为接口类型了。
JobDetail job = newJob(HelloJob.class)
.withIdentity("job1", "group1")
.build();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值