spring集成动态Quartz帮助类

1 篇文章 0 订阅
1 篇文章 0 订阅
1、接口
 
package com.biz.oth.quartz.service;

import java.util.Map;

public interface QuartzManagerService {
	    
		/**
		 * 获得触发器对象
		 * @param paramMap
		 * @return
		 */
	 	public Map<String,Object> queryTriggersForMap(Map<String,Object> paramMap);
	 
	    /**
	     * 添加一个定时任务
	     * @param paramMap 
	     */
	    public void addJob(Map<String, Object> paramMap);
	    
	    /**
	     * 添加一个定时任务
	     * @param jobName 任务名 
	     * @param triggerName 触发器名 
	     * @param cronExpression 时间设置,参考quartz说明文档 
	     * @param description TODO
	     */
	    public void addJob(String jobName, String triggerName, String cronExpression, String description);
	    
	    /**
	     * 生成Cron表达式
	     * @param paramMap
	     * @return
	     */
	    public String getCroExpression(Map<String, Object> paramMap);
		
		/**
		 * 暂停触发器
		 * @param triggerName
		 * @param triggerGroup
		 */
		public void pauseTrigger(String triggerName, String triggerGroup);
		
		/**
		 * 重启触发器
		 * @param triggerName
		 * @param triggerGroup
		 */
		public void resumeTrigger(String triggerName, String triggerGroup);
		
		/**
		 * 删除触发器
		 * @param triggerName
		 * @param triggerGroup
		 * @return
		 */
		public boolean removeTrigger(String triggerName, String triggerGroup);
	  
		/**
		 * 修改一个任务的触发时间 
		 * @param paramMap
		 */
		public void modifyJobTime(Map<String, Object> paramMap);
		
		/**
		 * 修改一个任务的触发时间 
		 * @param jobName
		 * @param cronExpression
		 */
		public void modifyJobTime(String jobName, String cronExpression);
		
	    /** 
	     * 修改一个任务的触发时间 
	     * @param triggerName 
	     * @param triggerGroup 
	     * @param cronExpression 
	     */  
	    public void modifyJobTime(String triggerName, String triggerGroup, String cronExpression);
	  
	    /**
	     * 移除一个定时任务
	     * @param jobName
	     */
	    public void removeJob(String jobName);
	    
	    /**
	     *暂停一个job任务 
	     * @param jobName
	     */
	    public void pauseJob(String jobName);
	    
	    /**
	     * 恢复一个job任务
	     * @param jobName
	     */
	    public void resumeJob(String jobName);
	  
	    /**
	     * 暂停调度中所有的job任务
	     */
	    public void pauseAll();
	    
	    /**
	     * 
	     * 恢复调度中所有的job的任务
	     * 此方法重新恢复会多次调用暂停前的job
	     */
	    public void resumeAll();
	    
	    /** 
	     * 启动所有定时任务 
	     */  
	    public void startJobs();
	  
	    /** 
	     * 关闭所有定时任务 
	     * 关闭后需要重新启动TOMCAT
	     */  
	    public void shutdownJobs();
	    
	   
}

 

 

 

 
 
 
2、实现类
package com.biz.oth.quartz.service.impl;

import java.util.HashMap;
import java.util.Map;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ext.spring.jdbc.Condition;
import com.ext.spring.jdbc.ConditionDef;
import com.smart.biz.base.BaseDao;
import com.smart.biz.oth.quartz.MyQuartzJobBean;
import com.smart.biz.oth.quartz.service.QuartzManagerService;
import com.smart.common.Constant;
import com.smart.util.Utils;

@Service
public class QuartzManagerServiceImpl implements QuartzManagerService {
	    
	    @Autowired
		private BaseDao baseDao;
	    @Autowired
	    private Scheduler scheduler;
	  
	    private ConditionDef trggerCondition = new ConditionDef(new Object[][] {
			{ "JOB_NAME=:jobName" },
			{ "JOB_GROUP=:jobGroup" },
			{ "TRIGGER_NAME=:triggerName" },
			{ "TRIGGER_GROUP=:triggerGroup" }
	   });
	    
	    @Override
	    public Map<String,Object> queryTriggersForMap(Map<String,Object> paramMap) {
	    	Condition condition = new Condition(trggerCondition, paramMap);
	    	StringBuilder sql = new StringBuilder("select JOB_NAME jobName, JOB_GROUP jobGroup, TRIGGER_NAME triggerName, \n");
					      sql.append(" TRIGGER_GROUP triggerGroup \n ");
	    				  sql.append(" from QRTZ_TRIGGERS ");
	    				  sql.append(condition.getConditionClauseWithWhere());
	    	return baseDao.queryForMap(sql.toString(), paramMap);
	    }
	    
	    @Override
	    public void addJob(String jobName, String triggerName, String cronExpression, String description){  
	        try {  
	            // 任务执行类  ,任务名,任务组
	            JobBuilder jobBuilder = JobBuilder.newJob(MyQuartzJobBean.class).withIdentity(jobName, Constant.DEFAULT_JOB_GROUP);
	    		jobBuilder.withDescription(description);//描述
	    		jobBuilder.requestRecovery(true);//指示调度程序是否应该在遇到“恢复”或“失败”的情况下重新执行作业,默认false
	    		jobBuilder.storeDurably(true);//quartz会把job持久化到数据库中  默认false
	    		JobDetail jobDetail = jobBuilder.build();
	    		
	            // 触发器名,触发器组  
	    	 	TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger().withIdentity(triggerName, Constant.DEFAULT_TRIGGER_GROUP);
	    		triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression));
	            CronTrigger trigger = (CronTrigger) triggerBuilder.build();
	            
	            scheduler.scheduleJob(jobDetail, trigger);  
	        } catch (Exception e) {  
	            e.printStackTrace();  
	            throw new RuntimeException(e);  
	        }  
	    }  
	    
	    @Override
	    public void addJob(Map<String, Object> paramMap){
	    	String jobName = (String) paramMap.get("jobName");
	    	String triggerName = Utils.getUuid32();
			String cronExpression = getCroExpression(paramMap);
			addJob(jobName, triggerName, cronExpression, "");
		}
		
	    @Override
	    public String getCroExpression(Map<String, Object> paramMap){
	    	 String year = (String)paramMap.get("year"),
	    			week = (String)paramMap.get("week"),
	    	 		month = (String)paramMap.get("month"),
	    	 		day = (String) paramMap.get("day"),
	    	 		hour = (String)paramMap.get("hour"),
	    	 		minute = (String)paramMap.get("minute"),
	    	 		second = (String)paramMap.get("second");
	    	 
			 String defaultSecond = "0", defaultMinute = "0", defaultHour = "0", 
					defaultDay= "*",defaultMonth = "*", defaultWeek = "*", defaultYear = "*";
			 StringBuilder cronExpression = new StringBuilder();
			 if (second != null) defaultSecond = second;
			 if (minute != null) defaultMinute = minute;
			 if (hour != null) defaultHour = hour;
			 if (day != null) {
				 defaultDay = day;
				 //"?" 与{日期}互斥,即意味着若明确指定{日期}触发,则表示{星期}无意义,以免引起冲突和混乱
				 defaultWeek = "?";
			 }
			 if (month != null) defaultMonth = month;
			 if (week != null) {
				 defaultWeek = week;
				 //"?" 与{星期}互斥,即意味着若明确指定{星期}触发,则表示{日期}无意义,以免引起 冲突和混乱
				 defaultDay = "?";
			 }
			 if (year != null) defaultYear = year;
			 //如果都没空的时候,设置 defaultDay = "*", defaultDay = "?"
			 if (day == null && week == null) {
				 defaultDay = "*";
				 defaultWeek = "?";
			 }
			 cronExpression.append(defaultSecond).append(" ")
			 			   .append(defaultMinute).append(" ")
			 			   .append(defaultHour).append(" ")
			 			   .append(defaultDay).append(" ")
			 			   .append(defaultMonth).append(" ")
			 			   .append(defaultWeek).append(" ")
			 			   .append(defaultYear);
			 return cronExpression.toString();
		}
	  
	    @Override
		public void pauseTrigger(String triggerName, String triggerGroup) {
			try {
				scheduler.pauseTrigger(new TriggerKey(triggerName, triggerGroup));// 停止触发器
			} catch (SchedulerException e) {
				throw new RuntimeException(e);
			}
		}
		
	    @Override
		public void resumeTrigger(String triggerName, String triggerGroup) {
			try {
				scheduler.resumeTrigger(new TriggerKey(triggerName, triggerGroup));// 重启触发器
			} catch (SchedulerException e) {
				throw new RuntimeException(e);
			}
		}
		
	    @Override
		public boolean removeTrigger(String triggerName, String triggerGroup) {
			TriggerKey triggerKey = new TriggerKey(triggerName, triggerGroup);
			try {
				scheduler.pauseTrigger(triggerKey);// 停止触发器
				return scheduler.unscheduleJob(triggerKey);// 移除触发器
			} catch (SchedulerException e) {
				throw new RuntimeException(e);
			}
		}
	    
		@Override
		public void modifyJobTime(Map<String, Object> paramMap) {
			String jobName = (String) paramMap.get("jobName");
			String cronExpression = getCroExpression(paramMap);
			modifyJobTime(jobName, cronExpression);
		}
		
		@Override
		public void modifyJobTime(String jobName, String cronExpression) {
			Map<String, Object> paramMap = new HashMap<String, Object>();
			paramMap.put("jobName", jobName);
			paramMap.put("jobGroup", Constant.DEFAULT_JOB_GROUP);
			Map<String, Object> returnMap = queryTriggersForMap(paramMap);
			if (returnMap != null) {
				String triggerName = (String) returnMap.get("triggerName");
				String triggerGroup = (String) returnMap.get("triggerGroup");
				modifyJobTime(triggerName, triggerGroup, cronExpression);
			}
			
		}
	  
	    @Override
	    public void modifyJobTime(String triggerName, String triggerGroup, String cronExpression) {  
	        try {  
	            TriggerKey triggerKey = new TriggerKey(triggerName, triggerGroup);
	            TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroup);
	    		triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression));
	            CronTrigger trigger = (CronTrigger) triggerBuilder.build();
				
	            scheduler.rescheduleJob(triggerKey, trigger);
	        } catch (Exception e) {  
	            e.printStackTrace();  
	            throw new RuntimeException(e);  
	        }  
	    }  
	    
	    @Override
		public void removeJob(String jobName) {
	    	 Map<String, Object> paramMap = new HashMap<String, Object>();
	    	 paramMap.put("jobName", jobName);
	    	 String jobGroup = Constant.DEFAULT_JOB_GROUP;
	    	 paramMap.put("jobGroup", jobGroup);
			 Map<String, Object> returnMap = queryTriggersForMap(paramMap);
			 if (returnMap != null) {
		         try {
		        	String triggerName = (String) returnMap.get("triggerName");
		        	String triggerGroup = (String) returnMap.get("triggerGroup");
		        	removeTrigger(triggerName, triggerGroup); //移除触发器  
					scheduler.deleteJob(new JobKey(jobName, jobGroup));
				 } catch (SchedulerException e) {
					e.printStackTrace();
				 } 
			 }
			
		}
	  
	    @Override
	    public void startJobs() {  
	        try {  
	        	scheduler.start();  
	        } catch (Exception e) {  
	            e.printStackTrace();  
	            throw new RuntimeException(e);  
	        }  
	    }  
	  
	    @Override
	    public void shutdownJobs() {  
	        try {  
	            if(!scheduler.isShutdown()) {  
	            	scheduler.shutdown();  
	            }  
	        } catch (Exception e) {  
	            e.printStackTrace();  
	            throw new RuntimeException(e);  
	        }  
	    }

		@Override
		public void pauseAll() {
			try {  
				scheduler.pauseAll();
	        } catch (Exception e) {  
	            e.printStackTrace();  
	            throw new RuntimeException(e);  
	        }  
		}

		@Override
		public void resumeAll() {
			try {  
				scheduler.resumeAll();
	        } catch (Exception e) {  
	            e.printStackTrace();  
	            throw new RuntimeException(e);  
	        }  
			
		}

		@Override
		public void pauseJob(String jobName) {
			 try {  
				 JobKey jobKey = new JobKey(jobName, Constant.DEFAULT_JOB_GROUP);
				 scheduler.pauseJob(jobKey);
		     } catch (Exception e) {  
		            e.printStackTrace();  
		            throw new RuntimeException(e);  
		     }  
		}

		@Override
		public void resumeJob(String jobName) {
			try {  
				  JobKey jobKey = new JobKey(jobName, Constant.DEFAULT_JOB_GROUP);
				  scheduler.resumeJob(jobKey);
		      } catch (Exception e) {  
		            e.printStackTrace();  
		            throw new RuntimeException(e);  
		      }  
		}

}

 

 

 

3、quartz.xml
<pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	
	<bean name="quartzScheduler"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<property name="schedulerContextAsMap">      
            <map>      
                <!-- spring 管理的service需要放到这里,才能够注入成功 -->      
                <description>schedulerContextAsMap</description>      
                <entry key="hyService" value-ref="hyService"/>      
            </map>      
        </property>    
		<property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
		<property name="configLocation" value="classpath:quartz.properties" />
	</bean>
	
	<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
		<property name="jobClass">
			<value>com.smart.biz.oth.quartz.MyQuartzJobBean</value>
		</property>	
		  
		<property name="durability" value="true" />	
	</bean>

</beans>

 

 

 

4、quartz.properties
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

org.quartz.jobStore.misfireThreshold = 60000

#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.HSQLDBDelegate
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#org.quartz.jobStore.useProperties = true
org.quartz.jobStore.tablePrefix = QRTZ_  
org.quartz.jobStore.isClustered = true  
org.quartz.jobStore.clusterCheckinInterval = 20000
org.quartz.jobStore.maxMisfiresToHandleAtATime=1 

 

 

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值