Quartz动态添加定时任务

1.添加Quartz的依赖

		 <dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
			<version>2.2.1</version>
		</dependency>
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz-jobs</artifactId>
			<version>2.2.1</version>
		</dependency>

2.定时任务的工具类 

import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.EverythingMatcher;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;


/**
 * Quartz 管理器(暂不支持集群处理)
 * 
 * @author listen
 */
@Component
public class QuartzManagerUtil {
	private static Logger logger = LoggerFactory.getLogger(QuartzManagerUtil.class);
	private static SchedulerFactory schedulerFactory;
	private static Scheduler scheduler;
	
	QuartzManagerUtil(){
		try {
			schedulerFactory = new StdSchedulerFactory();
			scheduler = schedulerFactory.getScheduler();
			scheduler.getListenerManager().addJobListener(new JobRunLogInterceptor(), EverythingMatcher.allJobs());
			scheduler.start();
		}catch (Exception e) {
			logger.error("Quartz 管理器初始化失败");
		}
		
	}

	/**
	 * 添加Job
	 */
	public static void addJob(String jobName, String cronTime, Class jobClass) {
		try {
			JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobName + "_Group").build();
			CronTrigger cronTrigger = new CronTriggerImpl(jobName + "_CronTrigger", jobName + "_TriggerGroup", cronTime);
			scheduler.scheduleJob(jobDetail, cronTrigger);
		} catch (Exception ex) {
			logger.error("添加定时任务[" + jobName + "]失败:" + ex.getMessage());
		}
	}

	/**
	 * 删除Job
	 */
	public static void deleteJob(String jobName) {
		try {
			JobKey jk = new JobKey(jobName, jobName + "_Group");
			scheduler.deleteJob(jk);
		} catch (Exception ex) {
			logger.error("删除定时任务[" + jobName + "]失败:" + ex.getMessage());
		}
	}

	/**
	 * 暂停所有Job
	 */
	public static void PauseAll() {
		try {
			scheduler.pauseAll();
		} catch (Exception ex) {
			logger.error("暂停所有Job失败:" + ex.getMessage());
		}
	}

	/**
	 * 恢复所有Job
	 */
	public static void ResumeAll() {
		try {
			scheduler.resumeAll();
		} catch (Exception ex) {
			logger.error("恢复所有Job失败:" + ex.getMessage());
		}
	}

	/**
	 * 卸载定时器
	 */
	public static void shutdown(Boolean waitForJobsToComplete) {
		try {
			scheduler.shutdown(waitForJobsToComplete);
		} catch (Exception ex) {
			logger.error("卸载定时器失败:" + ex.getMessage());
		}
	}
}

3.Quartz监听器,跟踪在不同阶段任务的执行状态

import java.io.PrintWriter;
import java.io.StringWriter;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import cn.lecons.gcb.foundation.domain.RunLog;
import cn.lecons.gcb.foundation.service.RunLogService;
import cn.lecons.gcb.foundation.service.RunLogServiceImpl;
import cn.lecons.gcb.foundation.util.BeanFactoryUtil;
import cn.lecons.gcb.framework.exception.BusinessException;

/**
 * @author listen
 */
public class JobRunLogInterceptor implements JobListener {
	private static Logger logger = LoggerFactory.getLogger(JobRunLogInterceptor.class);
	/**
	 * 用于获取该JobListener的名称
	 */
	@Override
	public String getName() {
		String name = getClass().getSimpleName();
		return name;
	}

	/**
	 * Scheduler在JobDetail将要被执行时调用这个方法
	 */
	@Override
	public void jobToBeExecuted(JobExecutionContext context) {
		String jobName = context.getJobDetail().getKey().getName();
		logger.error("定时任务: "+jobName+" 开始执行!");
	}

	/**
	 * Scheduler在JobDetail即将被执行,但又被TriggerListerner否决时会调用该方法
	 */
	@Override
	public void jobExecutionVetoed(JobExecutionContext context) {
	}

	/**
	 * Scheduler在JobDetail被执行之后调用这个方法
	 */
	@Override
	public void jobWasExecuted(JobExecutionContext context, JobExecutionException exception) {
		String jobName = context.getJobDetail().getKey().getName();
		long runtime = context.getJobRunTime();
		RunLogService runLogService = BeanFactoryUtil.getBean("runLogService");
		if (exception != null) {
			if (exception.getCause() != null && exception.getCause().getCause() instanceof BusinessException) {
				BusinessException businessException = (BusinessException) exception.getCause().getCause();
				String msg = StringUtils.isEmpty(businessException.getMessage())
						? (businessException.getErrorCode() == null ? ""
								: businessException.getErrorCode().getMessage())
						: businessException.getMessage();
				RunLog runLog = new RunLog();
				runLog.setModule("业务异常");
				runLog.setAction(jobName + "-定时任务");
				runLog.setRunTime(runtime);
				runLog.setMessage(msg);
				runLog.setExceptionDetail(msg);
				runLogService.createBusinessLog(runLog);
			} else {
				RunLog exRunInfo = new RunLog();
				exRunInfo.setModule("系统异常");
				exRunInfo.setAction(jobName + "-定时任务");
				exRunInfo.setRunTime(runtime);
				StringWriter stringWriter = new StringWriter();
				PrintWriter printWriter = new PrintWriter(stringWriter);
				exception.printStackTrace(printWriter);
				String exceptionString = stringWriter.getBuffer().toString();
				exRunInfo.setExceptionDetail(exceptionString);
				runLogService.createExceptionLog(exRunInfo);
			}
		} else {
			logger.error("定时任务: " + jobName + " 执行完毕,共耗时(mm):" + runtime);
		}
	}
}

4.添加任务 TestJob为要执行的具体任务

import org.springframework.stereotype.Service;

import com.roncoo.education.task.TestJob;

import com.roncoo.education.util.quartz.QuartzManagerUtil;

/**

 */
@Service
public class JobServiceImpl implements RunLogService {

	@Override
	public void testJob(Integer id) {
			String jobName = "jobName";
			String cronTime = "0/5 * * * * ? ";
			
			//TestJob需要执行的任务
			Class jobClass = TestJob.class;
			for(int i = 0 ;i<5;i++) {
				QuartzManagerUtil.addJob(jobName+i , cronTime,  jobClass);
			}
	}	
 
}

5.TestJob

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import com.roncoo.education.util.quartz.QuartzManagerUtil;

public class TestJob implements Job{


	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		
		//arg0.getJobDetail().getKey().getName();获得任务的名字
		String jobName = arg0.getJobDetail().getKey().getName();
		System.out.println(jobName+"+执行了");
		
		
		//任务执行完删除
		QuartzManagerUtil.deleteJob(jobName);
		
	}
}

 

转载于:https://my.oschina.net/u/3788556/blog/1632765

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值