This is the text that describe how to use quartz to create a schedule job in java application
1. web.xml add SchedularLauncher listener
<listener>
<listener-class>com.hp.proctool.common.servlet.SchedularLauncher</listener-class>
</listener>
2. create jobinfo.xml
<jobs>
<!-- "0 15 23 ? * *" means every day trigger at 23:15:00. -->
<!-- generate OMS synchronous data job -->
<job jobName="CiSyncJob" groupName="ReportJob" cronExp="0 15 22 ? * *"
jobClassName="com.hp.proctool.common.job.CiSyncJob" >
</job>
</jobs>
3. Add the SchedularLauncher to the application.
public class SchedularLauncher implements ServletContextListener {
private Logger logger = Logger.getLogger(SchedularLauncher.class);
public void contextDestroyed(ServletContextEvent event) {
// do nothing
}
public void contextInitialized(ServletContextEvent event) {
ServletContext sc = event.getServletContext();
InputStream is = sc.getResourceAsStream("/WEB-INF/jobinfo.xml");
com.hp.proctool.common.job.SimpleScheduler scheduler =
new com.hp.proctool.common.job.SimpleScheduler(is);
try {
scheduler.startScheduler();
} catch (Exception e) {
logger.error("error when call the job schedular:", e);
}
}
}
4. add the SimpleScheduler to the application
public class SimpleScheduler {
private InputStream is;
/** The configuration File */
private Logger logger = Logger.getLogger(this.getClass());
/** Quartz Scheduler Factory */
private SchedulerFactory sf = new StdSchedulerFactory();
/**
* Default Constructor, use Default XML conf file
*/
public SimpleScheduler(InputStream is) {
this.is = is;
}
/**
* Constructor that will use configuration file as the job input
*
* @param confFile
*/
/**
* Start the Simple Scheduler.
*
* @throws SimpleSchedulerException
*/
public void startScheduler() throws Exception {
try {
logger.debug("Start Job Scheduler...");
Scheduler sched = sf.getScheduler();
/*
* Remove the previously job store. Although this may not required,
* as we use RAMJobStore.
*/
String[] groups = sched.getTriggerGroupNames();
for (int i = 0; i < groups.length; i++) {
String[] names = sched.getTriggerNames(groups[i]);
for (int j = 0; j < names.length; j++)
sched.unscheduleJob(names[j], groups[i]);
}
groups = sched.getJobGroupNames();
for (int i = 0; i < groups.length; i++) {
String[] names = sched.getJobNames(groups[i]);
for (int j = 0; j < names.length; j++)
sched.deleteJob(names[j], groups[i]);
}
logger.debug("Already clear all old jobs");
// Read the job information from configration files.
logger.debug("Get Conf from XML file");
Digester digester = setupDigester();
Vector jobInfo = (Vector) digester.parse(this.is);
logger.debug("Already read job info from config file");
// Set Job to the scheduler.
Iterator jobIt = jobInfo.iterator();
int i = 0;
while (jobIt.hasNext()) {
JobInfo jinfo = (JobInfo) jobIt.next();
Class jobClass = Class.forName(jinfo.getJobClassName());
System.out.println("the job info is:" + jinfo.getJobName()
+ " " + jinfo.getGroupName() + " "
+ jinfo.getJobClassName());
JobDetail jobDetail = new JobDetail(jinfo.getJobName(),
jinfo.getGroupName(), jobClass);
Vector params = jinfo.getJobParams();
if (params.size() > 0) {
Iterator paramIt = params.iterator();
JobDataMap paramMap = new JobDataMap();
while (paramIt.hasNext()) {
JobParam param = (JobParam) paramIt.next();
paramMap.put(param.getName(), param.getValue());
}
jobDetail.setJobDataMap(paramMap);
}
CronTrigger cTrigger = new CronTrigger("Trigger" + i,
"defaultGroup", jinfo.getCronExp());
sched.scheduleJob(jobDetail, cTrigger);
i++;
}// while
sched.start();
} catch (Exception ex) {
throw ex;
}
System.out.println("[debug]already run the jobs.....");
}
/**
*
* Return current cron expression of the job
*
* @param jobName
* Name of Job
* @param groupName
* Group of Job
* @return Cron Expression of given job.
* @throws SimpleSchedulerException
*/
public String findCronExpOfJob(String jobName, String groupName)
throws Exception {
try {
Scheduler sched = sf.getScheduler();
Trigger[] triggers = sched.getTriggersOfJob(jobName, groupName);
if (triggers == null || triggers.length <= 0) {
logger.debug("Specified Job with Name: " + jobName
+ " and group Name: " + groupName + " does not exist!");
throw new Exception();
} else {
if (triggers[0] instanceof CronTrigger) {
CronTrigger cTrigger = (CronTrigger) triggers[0];
return cTrigger.getCronExpression();
} else {
return null;
}
}
} catch (SchedulerException ex) {
throw ex;
}
}
/**
* Get the current Group name in scheduler.
*
* @return Group names
* @throws SimpleSchedulerException
*/
public String[] getGroupNames() throws Exception {
try {
Scheduler sched = sf.getScheduler();
return sched.getJobGroupNames();
} catch (SchedulerException ex) {
throw ex;
}
}
/**
* Get current job names in the given group
*
* @param groupName
* Name of Group
* @return Job Names in the specific Group.
*
* @throws SimpleSchedulerException
*/
public String[] getJobNames(String groupName) throws Exception {
try {
Scheduler sched = sf.getScheduler();
return sched.getJobNames(groupName);
} catch (SchedulerException ex) {
throw ex;
}
}
/**
* Shut down the scheduler.
*/
public void shutdownScheudler() {
try {
Scheduler sched = sf.getScheduler();
sched.shutdown(true);
} catch (SchedulerException e) {
logger.debug(e, e);
}
}
/**
* This method will Set up the Digester..
*
* @return Digest Object that have been
*/
private Digester setupDigester() {
Digester digester = new Digester();
digester.addObjectCreate("jobs", Vector.class);
digester.addObjectCreate("jobs/job", JobInfo.class);
digester.addSetNext("jobs/job", "add");
digester.addSetProperties("jobs/job", "jobName", "jobName");
digester.addSetProperties("jobs/job", "groupName", "groupName");
digester.addSetProperties("jobs/job", "cronExp", "cronExp");
digester.addSetProperties("jobs/job", "jobClassName", "jobClassName");
digester.addObjectCreate("jobs/job/jobParam", JobParam.class);
digester.addSetNext("jobs/job/jobParam", "addParam");
digester.addSetProperties("jobs/job/jobParam", "name", "name");
digester.addSetProperties("jobs/job/jobParam", "value", "value");
return digester;
}
}
5. add JobInfo calss
public class JobInfo {
/** identifier fieldsss */
private Long id;
/** persistent field */
private String jobName;
/** persistent field */
private String groupName;
/** persistent field */
private String jobClassName;
/** persistent field */
private String cronExp;
/** persistent field */
private Set dbJobParam;
private Vector jobParams = new Vector();
/** full constructor */
public JobInfo(java.lang.String jobName, java.lang.String groupName,
java.lang.String jobClassName, java.lang.String cronExp,
Set dbJobParam) {
this.jobName = jobName;
this.groupName = groupName;
this.jobClassName = jobClassName;
this.cronExp = cronExp;
this.dbJobParam = dbJobParam;
}
/** default constructor */
public JobInfo() {
}
public java.lang.Long getId() {
return this.id;
}
public void setId(java.lang.Long id) {
this.id = id;
}
public java.lang.String getJobName() {
return this.jobName;
}
public void setJobName(java.lang.String jobName) {
this.jobName = jobName;
}
public java.lang.String getGroupName() {
return this.groupName;
}
public void setGroupName(java.lang.String groupName) {
this.groupName = groupName;
}
public java.lang.String getJobClassName() {
return this.jobClassName;
}
public void setJobClassName(java.lang.String jobClassName) {
this.jobClassName = jobClassName;
}
public java.lang.String getCronExp() {
return this.cronExp;
}
public void setCronExp(java.lang.String cronExp) {
this.cronExp = cronExp;
}
public java.util.Set getDbJobParam() {
return this.dbJobParam;
}
public void setDbJobParam(java.util.Set dbJobParam) {
this.dbJobParam = dbJobParam;
}
public String toString() {
return new ToStringBuilder(this).append("id", getId()).toString();
}
public boolean equals(Object other) {
if (!(other instanceof JobInfo))
return false;
JobInfo castOther = (JobInfo) other;
return new EqualsBuilder().append(this.getId(), castOther.getId())
.isEquals();
}
public int hashCode() {
return new HashCodeBuilder().append(getId()).toHashCode();
}
/**
* @return Returns the jobParams.
*/
public Vector getJobParams() {
return jobParams;
}
/**
* @param jobParams
* The jobParams to set.
*/
public void setJobParams(Vector jobParams) {
this.jobParams = jobParams;
}
public void addParam(JobParam param) {
this.jobParams.add(param);
}
}
6. add JobParam class
public class JobParam {
/** identifier field */
private Long id;
/** persistent field */
private String name;
/** persistent field */
private String value;
/** nullable persistent field */
private Long jobinfoId;
/** full constructor */
public JobParam(java.lang.String name, java.lang.String value,
java.lang.Long jobinfoId) {
this.name = name;
this.value = value;
this.jobinfoId = jobinfoId;
}
/** default constructor */
public JobParam() {
}
/** minimal constructor */
public JobParam(java.lang.String name, java.lang.String value) {
this.name = name;
this.value = value;
}
public java.lang.Long getId() {
return this.id;
}
public void setId(java.lang.Long id) {
this.id = id;
}
public java.lang.String getName() {
return this.name;
}
public void setName(java.lang.String name) {
this.name = name;
}
public java.lang.String getValue() {
return this.value;
}
public void setValue(java.lang.String value) {
this.value = value;
}
public java.lang.Long getJobinfoId() {
return this.jobinfoId;
}
public void setJobinfoId(java.lang.Long jobinfoId) {
this.jobinfoId = jobinfoId;
}
public String toString() {
return new ToStringBuilder(this).append("id", getId()).toString();
}
public boolean equals(Object other) {
if (!(other instanceof JobParam))
return false;
JobParam castOther = (JobParam) other;
return new EqualsBuilder().append(this.getId(), castOther.getId())
.isEquals();
}
public int hashCode() {
return new HashCodeBuilder().append(getId()).toHashCode();
}
}
7. execute up the job
public class CiSyncJob implements Job {
public CiSyncJob() {
// init
}
public void execute(JobExecutionContext arg0) throws JobExecutionException {
//do something
}
}