LaunchJob.java 2.88 KB
package com.sitech.jmx.manage;

import java.util.Date;
import java.util.HashMap;

import com.sitech.util.Formater;
import org.apache.log4j.Logger;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.StatefulJob;

import com.sitech.schedule.SchedulerService;
import com.sitech.schedule.bean.Job;
import com.sitech.util.JSONUtil;

/**
 * Description: quartz作业类
 * 
 * 2012-02-10 linxc 给所有的作业统一增加了一个参数:采集周期 COLL_INTERVALS(主要用于SHELL采集)
 * 每个采集指标都加一个采集周期,用于自监控
 * 
 * 2012-12-17 linxc 任务调度方式修改:quartz只负责发送消息通知,不直接调用采集任务
 */
public class LaunchJob implements StatefulJob {
	public static final String SCHEDULE_ID = "SCHEDULE_ID";
	public static final String OBJECTNAME = "OBJECTNAME";
	public static final String OPERATIONNAME = "OPERATIONNAME";
	public static final String EXEOBJECT = "EXEOBJECT";
	public static final String PARAMS = "PARAMS";

	private static Logger logger = Logger.getLogger("SCHEDULE");

	@SuppressWarnings("unchecked")
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		String guid = "";
		String objectname = "";
		String cOperation = "";
		HashMap<String, String> params = null;

		// 计算采集周期
		Date nextFireTime = context.getNextFireTime();
		long interval = nextFireTime.getTime() - new Date().getTime();

		try {
			JobDataMap data = context.getJobDetail().getJobDataMap();
			guid = data.getString(SCHEDULE_ID);
			objectname = data.getString(OBJECTNAME);
			cOperation = data.getString(OPERATIONNAME);
			params = (HashMap<String, String>) data.get(PARAMS);
			params.put("COLL_INTERVAL", Long.toString(interval));
			params.put("SCHEDULE_ID", guid);
            params.put("NEXT_FIRE_TIME", Formater.datetimeToString(nextFireTime,"yyyy-MM-dd HH:mm:ss"));
			logger.info("-- Begin coll job, objectName[" + objectname
					+ "], methodName[" + cOperation + "], collInterval["
					+ interval + "],params=" + JSONUtil.toJSON(params));

			Job job = new Job();
			job.setId(guid);
			job.setInterval(interval);
			job.setObjectName(objectname);
			job.setOperation(cOperation);
			job.setParams(params);

			SchedulerService.getInstance().addJob(job);
		} catch (Exception e) {
			logger.error("Exception while executing job, objectName["
					+ objectname + "], methodName[" + cOperation + "],params="
					+ JSONUtil.toJSON(params), e);
			JobExecutionException e2 = new JobExecutionException(e);
			// this job will refire immediately
			e2.refireImmediately();
			throw e2;
		} finally {
			logger.info(" --End coll job, objectName[" + objectname
					+ "], methodName[" + cOperation + "].\n --next fire at["
					+ nextFireTime + "],params=" + JSONUtil.toJSON(params));
			Runtime.getRuntime().freeMemory();
			Runtime.getRuntime().gc();
		}	
	}
}