可以在程序中控制对一个Job进行监听,在调度器被启动之前可以调度器(Scheduler)中添加JobListener,代码如下:
JobListener listener = new Job1Listener();
Matcher<JobKey> matcher = KeyMatcher.keyEquals(job.getKey());
sched.getListenerManager().addJobListener(listener, matcher);
也可以不带参数,从配置文件中映射出该类,代码如下:
JobListener listener = (JobListener) Class.forName("ClassName+Path").newInstance();
scheduler.getListenerManager().addJobListener(listener);
具体的监听内容可以用一个实现JobListiner接口的类进行实现,举例如下:
import java.sql.SQLException;
import org.apache.log4j.Logger;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;
import com.hefeng.loader.LoadConfig;
import com.hefeng.loader.log.LogFactory;
import com.task.task.TaskInfo;
/**
* 任务监听
*/
public class TaskListener implements JobListener{
private final long WAIT_TIME = 10;
private final long WAIT_LANG_TIME = 5;
private static Logger logger = LogFactory.getLog();
private int executeTimes = 1;
@Override
public String getName() {
return "任务监听";
}
@Override
public void jobExecutionVetoed(JobExecutionContext context) {
//作业<span style="font-family: Arial, Helvetica, sans-serif;">被拒绝执行的动作内容</span>
}
@Override //作业将要被执行触发的动作
public void jobToBeExecuted(JobExecutionContext context) {
JobDetail jobDetail = context.getJobDetail();
TaskInfo taskInfo = (TaskInfo) jobDetail.getJobDataMap().get("TASK_INFO_OBJECT");
logger.debug("任务["+taskInfo.getTaskName()+"]开始执行启动后第["+(executeTimes)+"]次任务!");
try
{
watchTaskIsRunning(taskInfo);
}
catch(Exception ex)
{
}
finally
{
}
}
@Override //作业执行完成触发的动作
public void jobWasExecuted(JobExecutionContext context, JobExecutionException arg1) {
JobDetail jobDetail = context.getJobDetail();
TaskInfo taskInfo = (TaskInfo) jobDetail.getJobDataMap().get("TASK_INFO_OBJECT");
java.sql.Connection connection = null;
try {
connection = LoadConfig.getDBConnection("als");
connection.setAutoCommit(false);
// this.setTaskEndStatus(taskInfo, connection);
connection.commit();
}
catch(Exception ex)
{
ex.printStackTrace();
}
finally
{
try {
if(connection!=null) connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
logger.debug("任务["+taskInfo.getTaskName()+"]执行启动后第["+(executeTimes++)+"]次任务执行完成!");
}
可以用监听对多个job同时执行的情况进行控制,在上一个job调用jobWasExecuted()之前,判断下一个job是否需要与上一个job保持互斥,当需要时,则在下一个job的jobToBeExecuted() 对该job进行休眠,等待上一个job监听执行完成。