我們是能對Job和Trigger創建自己的監聽器的.
MyTriggerListener:
package com;

import org.quartz.JobExecutionContext;
import org.quartz.Trigger;
import org.quartz.TriggerListener;

/** *//**
*
* @author zdw
*
*/
public class MyTriggerListener implements TriggerListener


{

public String getName()

{
return "myTriggerListener";
}

public void triggerComplete(Trigger trigger, JobExecutionContext jeContext,
int arg2)

{
System.out.println("triggerName:" + trigger.getName());
System.out.println("complete");
}

public void triggerFired(Trigger arg0, JobExecutionContext arg1)

{
System.out.println("fire");
System.out.println("trigger" + arg0.getGroup());
}

public void triggerMisfired(Trigger arg0)

{
System.out.println("triggerMisfired");
}

public boolean vetoJobExecution(Trigger arg0, JobExecutionContext arg1)

{
System.out.println("vetoJobException");
return false;
}

}

MyJobDetailListener:
package com;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;

/** *//**
*
* @author zdw
*
*/
public class MyJobDetailListener implements JobListener


{

/** *//**
* 注意name是必須的
*/
public String getName()

{
return "myJobListener";
}

public void jobExecutionVetoed(JobExecutionContext arg0)

{
System.out.println("jobExceution");
}

public void jobToBeExecuted(JobExecutionContext arg0)

{
System.out.println("jobTobeExecuted");
}

public void jobWasExecuted(JobExecutionContext arg0,
JobExecutionException arg1)

{
System.out.println("job was executed");
}

}
上面兩個類只要注意name是必須的就可以了.
package com;

import java.util.Date;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;


/** *//**
*
* @author zdw
*
*/
public class QuartzTest


{

public static void main(String args[])

{
// 得到可用客戶端處理調度程序的工廠
SchedulerFactory schedFact = new StdSchedulerFactory();
// 高度程序接口,控制JobDeail和Trigger
try

{
Scheduler sched = schedFact.getScheduler();
// 表示給定工作類的詳細信息
JobDetail jobDetail = new JobDetail("myJb", null, StringTest.class);
// 也可以分別設置
jobDetail.setName("angel");
jobDetail.setGroup("007");
jobDetail.setJobClass(StringTest.class);
jobDetail.getJobDataMap().put("jobSays", "I will be success!!");
// 觸發器
Trigger trigger = TriggerUtils.makeSecondlyTrigger();
// 設置開始時間,這時設置的是每一秒執行一次
trigger.setStartTime(TriggerUtils
.getEvenSecondDateBefore(new Date()));
// 必須設置,不能為空
trigger.setName("firstTrigger");
// 使用自己的監聽器
MyTriggerListener triggerListener = new MyTriggerListener();
sched.addTriggerListener(triggerListener);
sched.addJobListener(new MyJobDetailListener());
// 匹配(必須操作)
trigger.addTriggerListener("myTriggerListener");
jobDetail.addJobListener("myJobListener");
// 為調度程序設置具體工作和觸發器
sched.scheduleJob(jobDetail, trigger);
// fire
sched.start();
} catch (SchedulerException e)

{
e.printStackTrace();
}
}
}

注意:
// 匹配(必須操作)
trigger.addTriggerListener("myTriggerListener");
jobDetail.addJobListener("myJobListener");
這兩步是必須的,官方文檔沒有提及,而且必須在scheduler添加完相應的監聽器之后.
這時我們看到輸出:
vetoJobException
jobTobeExecuted
execute at Fri May 09 09:24:11 CST 2008
instName:angel instGroup:007 jobSays:I will be success!!
job was executed
triggerName:firstTrigger
complete
fire
triggerDEFAULT
vetoJobException
jobTobeExecuted
execute at Fri May 09 09:24:12 CST 2008
instName:angel instGroup:007 jobSays:I will be success!!
job was executed
triggerName:firstTrigger
complete

我們自己的監聽器已經被執行了.