首页>代码>quartz demo实例集合>/quartz_demo集合/quartz_demo/src/com/cn/demo2/SchedulerUtil.java
package com.cn.demo2;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.impl.StdSchedulerFactory;
import org.xml.sax.InputSource;

/**
 * 定时任务调度器
 *
 */
public class SchedulerUtil {
	/**任务调度器*/
	private static Scheduler scheduler;
	
	/**任务名与任务组的映射*/
	private static HashMap<String,String> rels;
	
	/**全部启动*/
	public static void startAll()throws Exception{
		initScheduler(true);
		scheduler.start();
	}
	
	/**
	 * Get the scheduler value
	 */
	public static Scheduler getScheduler() {
		return scheduler;
	}

	/**
	 * 被触发调度
	 * 
	 * */
	public static boolean startByTrigger(String taskName, Map params) throws Exception{
		
		boolean boo = true;
		if(scheduler==null){
			initScheduler(true);
			scheduler.start();
		}
		
		String  groupName= rels.get(taskName);
		if(StringUtils.isNotEmpty(groupName)){
			
			JobDetail detail = scheduler.getJobDetail(taskName,groupName);
			JobDataMap map = detail.getJobDataMap();
			map.put("params", params);
			
			scheduler.triggerJob(taskName,groupName,map); //要把参数带入,必须在此处传第3个参数
			//map.remove("params"); //没必要删,参数不会影响原来的定时计划,只会作用于本次触发
			
			System.out.println("任务:"+taskName+" 被触发调度成功!");
		}else{
			boo=false;
			System.out.println("任务:"+taskName+"不存在或未激活, 不可被触发调度!");
		}
		
		return boo;
	}
	
	/**初始化调度器*/
	private static void initScheduler(boolean isPrintLog) throws Exception{
		String path=System.getProperty("user.dir")+File.separator
				+"conf" + File.separator+"quartzConfig.properties";
		scheduler = new StdSchedulerFactory(path).getScheduler();
		System.out.println("使用quartzConfig.properties初始化queartz!!!");
		
		rels = new HashMap<String, String>();
		//定时任务集合
		List<TaskBeen> tasks = getTaskBean();
		int i = 1;
		for(TaskBeen task : tasks){
			List<String> taskClass = task.getTaskClass();
			String triggerTime = task.getTriggerTime();
			for(String taskName : taskClass){
				createJob(i, taskName, triggerTime, isPrintLog);
			}
			i++;
		}
		
		//触发启动时需要立即跑一次的任务
		for(TaskBeen task : tasks){
			Set<String> runOnStartTask = task.getRunOnStartTask();
			for(String taskName : runOnStartTask){
				Map params = new HashMap();
				params.put("runOnStart", "1");
				startByTrigger(taskName, params);
			}
		}

	}
	
	/**创建1个任务*/
	private static void createJob(int i, String taskName, String triggerTime, boolean isPrintLog){
		try {
			String groupName = "group" + i;
			taskName = taskName.trim();
			JobDetail jobDetail = new JobDetail(taskName, groupName, Class.forName(taskName));
			CronTrigger cronTrgger = new CronTrigger(taskName, groupName, triggerTime);
			scheduler.scheduleJob(jobDetail, cronTrgger);
			
			rels.put(taskName, groupName);
			if(isPrintLog){System.out.println("启动任务:"+taskName+", 执行时机:"+triggerTime);}
		} catch (Exception e) {
			System.out.println("任务启动失败:"+taskName+":"+triggerTime);
			System.out.println(e);
		} 
	}
	
	
	/**得到task-bean*/
	public static List<TaskBeen>  getTaskBean() throws Exception{
		List<TaskBeen> beans = new ArrayList<TaskBeen>();
		String path = System.getProperty("user.dir")+File.separator+"conf" + File.separator+"taskConfig.xml";
		Document doc = getDocByPath(path);
		
		Element rootElem = doc.getRootElement();
		List<Element> tasks = rootElem.getChildren("task");
		
		for(Element task : tasks){
			String triggerTime = task.getChildText("triggerTime");
			
			List<Element> taskBeens = task.getChild("taskBeen").getChildren("value");
			List<String> beenList = new ArrayList<String>();
			Set<String> runOnStartSet = new HashSet<String>();
			
			for(Element taskBeenName : taskBeens){
				String activate = taskBeenName.getAttributeValue("isActivate");
				//如果没有激活,则不加入到集合中
				if(!"1".equals(activate)){
					continue;
				}
				String beenName = taskBeenName.getText().toString();
				beenList.add(beenName);
				
				String runOnStart = taskBeenName.getAttributeValue("runOnStart");
				if("1".equals(runOnStart)){
					runOnStartSet.add(beenName);
				}
			}
			
			TaskBeen taskBeen = new TaskBeen();
			taskBeen.setTaskClass(beenList);
			taskBeen.setTriggerTime(triggerTime);
			taskBeen.setRunOnStartTask(runOnStartSet);
			
			beans.add(taskBeen);
		}
		return beans;
	}
	
	
	public static Document getDocByPath(String filePath) throws Exception{
    	File file = new File(filePath);
    	InputStream in = new FileInputStream(file);
		StringBuffer readStr = new StringBuffer();
		byte buf[] = new byte[1024];
		int readLen = 0;
		while ((readLen = in.read(buf, 0, 1024)) != -1) {
			readStr.append(new String(buf, 0, readLen, "utf-8"));
		}
		if (in != null){
			in.close();
		}
    	
		String xmlStr = readStr.toString();
		StringReader read = new StringReader(xmlStr);
		InputSource source = new InputSource(read);
		SAXBuilder sb = new SAXBuilder();
        Document doc = null;
        doc = sb.build(source);
        return doc;
    }
}
最近下载更多
简陋小屋123  LV1 2021年7月1日
mc870624  LV2 2021年4月27日
jibamao  LV2 2021年3月12日
胡万岁  LV2 2021年1月31日
513513  LV1 2020年3月10日
honghu123  LV2 2020年3月2日
memgkun  LV1 2020年2月27日
忆往昔丶时间淡化过去  LV12 2020年2月21日
jzlsunny  LV2 2020年2月11日
asdasdq123574  LV1 2020年1月6日
最近浏览更多
1358849392  LV21 2022年11月23日
maojianyun  LV30 2022年8月9日
cz8857216  LV4 2022年5月9日
双鱼座程序员7号  LV6 2022年4月23日
denliv_hui  LV13 2021年10月20日
国服后端  LV10 2021年7月9日
简陋小屋123  LV1 2021年7月1日
长安不测字  LV2 2021年5月18日
mc870624  LV2 2021年4月27日
cbd451304045 2021年4月6日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友