spring+quartz新增,刪除,暫停,恢復定時任務

spring配置

<bean id="scheduler"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	<!-- 	<property name="startupDelay" value="180"/>  啓動服務器後延遲啓動定時任務-->
</bean>

先定義SchedulerJob  javabean

public class ScheduleJob {
	private String jobId;//任務id
	private String jobName;//任務名稱
	private String jobGroup;//任務分組
	private int jobStatus;//任務狀態 0禁用 1啓用 2刪除
	private String cronExpression;//任務運行時間表達式
	private String jobDesc;//任務描述
	public String getJobId() {
		return jobId;
	}
	public void setJobId(String jobId) {
		this.jobId = jobId;
	}
	public String getJobName() {
		return jobName;
	}
	public void setJobName(String jobName) {
		this.jobName = jobName;
	}
	public String getJobGroup() {
		return jobGroup;
	}
	public void setJobGroup(String jobGroup) {
		this.jobGroup = jobGroup;
	}
	
	public int getJobStatus() {
		return jobStatus;
	}
	public void setJobStatus(int jobStatus) {
		this.jobStatus = jobStatus;
	}
	public String getCronExpression() {
		return cronExpression;
	}
	public void setCronExpression(String cronExpression) {
		this.cronExpression = cronExpression;
	}
	public String getJobDesc() {
		return jobDesc;
	}
	public void setJobDesc(String jobDesc) {
		this.jobDesc = jobDesc;
	}
}

定時器JOB管理類

public class JobManage {
    private static final Logger logger = LoggerFactory.getActionLog(JobManage.class);
    private TimedTaskService timedTaskService;
    
    public TimedTaskService getTimedTaskService() {
        return timedTaskService;
    }
    public void setTimedTaskService(TimedTaskService timedTaskService) {
        this.timedTaskService = timedTaskService;
    }
    private static SchedulerFactoryBean schedulerFactoryBean;
    private static Scheduler scheduler;
    static{
        schedulerFactoryBean = (SchedulerFactoryBean) BeanUtil.getBeanByClass(SchedulerFactoryBean.class);
        scheduler = schedulerFactoryBean.getScheduler();
    }
    /**
     * 初始化定時任務
     * @throws SchedulerException
     */
    public void initTask() throws SchedulerException {
        //Scheduler scheduler = schedulerFactoryBean.getScheduler();
        // 這裏獲取任務信息數據
        List<ScheduleJob> jobList = timedTaskService.getAllJob();//從數據庫中讀取
        for (ScheduleJob job : jobList) {
            addJob(job);
        }
    }
    /**
     * 添加一個任務
     * @param job
     */
    public void addJob(ScheduleJob job){
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName(), job.getJobGroup());
            // 獲取trigger,即在spring配置文件中定義的 bean id="myTrigger"
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            // 不存在,創建一個
            if (null == trigger) {
                JobDetail jobDetail = JobBuilder.newJob(QuartzJobFactory.class)
                        .withIdentity(job.getJobName(), job.getJobGroup()).build();
                jobDetail.getJobDataMap().put("scheduleJob", job);
                // 表達式調度構建器
                CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());
                // 按新的cronExpression表達式構建一個新的trigger
                trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup())
                        .withSchedule(scheduleBuilder).build();
                scheduler.scheduleJob(jobDetail, trigger);
            } else {
                // Trigger已存在,那麼更新相應的定時設置
                // 表達式調度構建器
                CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());
                // 按新的cronExpression表達式重新構建trigger
                trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
                // 按新的trigger重新設置job執行
                scheduler.rescheduleJob(triggerKey, trigger);
            }
            if(job.getJobStatus()==0){
                pauseJob(job);
            }
            
        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * 暫停一個job
     * @param scheduleJob
     * @throws SchedulerException
     */
    public void pauseJob(ScheduleJob scheduleJob){
        //Scheduler scheduler = schedulerFactoryBean.getScheduler();
        logger.info(scheduleJob.getJobName(),"定時任務暫停");
        JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
        try {
            scheduler.pauseJob(jobKey);
        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * 恢復一個job
     * @param scheduleJob
     */
    public void resumeJob(ScheduleJob scheduleJob){
        logger.info(scheduleJob.getJobName(),"定時任務啓動");
        //Scheduler scheduler = schedulerFactoryBean.getScheduler();
        JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(),scheduleJob.getJobGroup());
        try {
            scheduler.resumeJob(jobKey);
        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * 刪除一個任務
     * @param scheduleJob
     */
    public void removeJob(ScheduleJob job){
        logger.info(job.getJobName(),"刪除定時任務");
        TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName(), job.getJobGroup());
        JobKey jobKey = JobKey.jobKey(job.getJobName(),job.getJobGroup());
        // 獲取trigger,即在spring配置文件中定義的 bean id="myTrigger"
        //CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
        try {
            scheduler.pauseTrigger(triggerKey);
            scheduler.unscheduleJob(triggerKey);
            scheduler.deleteJob(jobKey);
        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
job工廠類

@DisallowConcurrentExecution //只有上一個人任務執行完畢纔可以執行下一次任務
public class QuartzJobFactory implements Job{
	private static final Logger logger = LoggerFactory.getActionLog(QuartzJobFactory.class);
	@Override
	public void execute(JobExecutionContext context){
		// TODO Auto-generated method stub
		try{
			ScheduleJob scheduleJob = (ScheduleJob)context.getMergedJobDataMap().get("scheduleJob");
			logger.info(scheduleJob.getJobName(),"任務開始");
			((TaskService) BeanUtil.getBean(scheduleJob.getJobName())).exe();
			logger.info(scheduleJob.getJobName(),"任務結束");
		}catch(Exception e){
			e.printStackTrace();
		}
		//logger.info("任務結束", scheduleJob.getJobName());
	}

}
具體業務接口

public interface TaskService {
	/**
	 * 具體業務邏輯
	 */
	public abstract void exe();
}
實現上面的接口,在spring配置bean

<bean id="test" class="com.cmos.ccscore.service.timedTask.impl.Test" parent="baseService">
 </bean>

在數據庫中插入記錄.

spring獲取bean工具類

public class BeanUtil implements ApplicationContextAware{
	private static ApplicationContext context;
	
	@Override
	public void setApplicationContext(ApplicationContext arg0) throws BeansException {
		// TODO Auto-generated method stub
		context = arg0;
	}
	public static Object getBean(String beanName){
		return context.getBean(beanName);
	}
	public static <T> Object getBeanByClass(Class<T> c){
		return context.getBean(c);
	}
}

監聽器用於服務啓動初始化定時任務

public class TaskListener implements ServletContextListener{
	private static final Logger logger = LoggerFactory.getActionLog(TaskListener.class);
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		// TODO Auto-generated method stub
	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {

		logger.info("TaskListener", "定時任務初始化");
		JobManage m = (JobManage) BeanUtil.getBean("jobManage");
		try {
			m.initTask();
		} catch (SchedulerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
TimedTaskService 定時任務服務類就是獲取前端請求對數據庫的操作,需注入JobManage類來對定時任務進行管理

最終頁面效果


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章