在Quartz工作中添加监听器

本文介绍了如何在Quartz调度器中添加Job监听器。通过Job1Listener示例展示了两种添加方式:一种是在代码中直接实例化并添加,另一种是从配置文件动态加载类。监听器的实现关键在于实现JobListener接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可以在程序中控制对一个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监听执行完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值