码迷,mamicode.com
首页 > 其他好文 > 详细

Quartz 任务调度(二)

时间:2015-11-02 19:34:02      阅读:306      评论:0      收藏:0      [点我收藏+]

标签:

本文上传一个小Quartz 的小Demo;

项目目录如下:

技术分享

任务类 WorkJob.java :


/**
 * @package :com.andy.demo.quartz.job<br>
 * @author :wanglongjie<br>
 * @createDate :2015年11月2日下午2:19:22<br>
 */
package com.andy.demo.quartz.job;

import java.util.Date;

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

/**
 * @package :com.andy.demo.quartz.job<br>
 * @file :WorkJob.java<br>
 * @describe :<br>
 * @author :wanglongjie<br>
 * @createDate :2015年11月2日下午2:19:22<br>
 * @updater :<br>
 * @updateDate :<br>
 * @updateContent :<br>
 */
public class WorkJob implements Job {
	public static int times = 1;

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.quartz.Job#execute(org.quartz.JobExecutionContext)
	 */
	@Override
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		// TODO Auto-generated method stub
		String jobName = context.getJobDetail().getName();
		String triggerName = context.getTrigger().getName();

		JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
		String personName = jobDataMap.getString("personName");
		Integer personAge = jobDataMap.getIntegerFromString("personAge");

		System.out.println("[" + times + "]: Date[" + new Date() + "]");
		System.out.println("JOB[jobName[" + jobName + "],triggerName["
				+ triggerName + "],jobDateMap[" + personName + "," + personAge
				+ "]]");

		System.out.println(".................................");
		times++;
	}

}

调度的抽象类 TriggerRunner.java :

/**
 * @package :com.andy.demo.quartz.trigger.dao<br>
 * @author :wanglongjie<br>
 * @createDate :2015年11月2日下午4:03:19<br>
 */
package com.andy.demo.quartz.trigger.dao;

import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

/**
 * @package :com.andy.demo.quartz.trigger.dao<br>
 * @file :TriggerRunner.java<br>
 * @describe :<br>
 * @author :wanglongjie<br>
 * @createDate :2015年11月2日下午4:03:19<br>
 * @updater :<br>
 * @updateDate :<br>
 * @updateContent :<br>
 */
public abstract class TriggerRunner {
	protected static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();

	/**
	 * 
	 * @method :loadJob<br>
	 * @describe :加载 调度,默认JOB 名称、JOB 组名、Trigger 名称、Tirgger 组名<br>
	 * @author :wanglongjie<br>
	 * @createDate :2015年11月2日下午5:05:31 <br>
	 * @param data
	 * @throws Exception
	 *             void
	 */
	public abstract void loadJob(Object... data) throws Exception;

	/**
	 * 
	 * @method :loadJob<br>
	 * @describe :加载 调度,有参数<br>
	 * @author :wanglongjie<br>
	 * @createDate :2015年11月2日下午4:11:23 <br>
	 * @param jobName
	 *            :JOB 名称
	 * @param jobGroup
	 *            :JOB 组名
	 * @param triggerName
	 *            :Trigger 名称
	 * @param triggerGroup
	 *            :Tirgger 组名
	 * @param data
	 *            :可变实参
	 * @throws Exception
	 *             void
	 */
	public abstract void loadJob(String jobName, String jobGroup,
			String triggerName, String triggerGroup, Object... data)
			throws Exception;

	/**
	 * 
	 * @method :startJobs<br>
	 * @describe :启动 调度<br>
	 * @author :wanglongjie<br>
	 * @createDate :2015年11月2日下午4:04:24 <br>
	 * @throws SchedulerException
	 *             void
	 */
	public void startJobs() throws SchedulerException {
		Scheduler sched = gSchedulerFactory.getScheduler();
		System.out.println("startJobs..." + gSchedulerFactory.toString() + ", "
				+ sched.toString());
		sched.start();
	}

	/**
	 * 
	 * @method :shutdownJobs<br>
	 * @describe :关闭调度<br>
	 * @author :wanglongjie<br>
	 * @createDate :2015年11月2日下午4:04:49 <br>
	 * @throws SchedulerException
	 *             void
	 */
	public void shutdownJobs() throws SchedulerException {
		Scheduler sched = gSchedulerFactory.getScheduler();
		System.out.println("shutdownJobs..." + gSchedulerFactory.toString()
				+ ", " + sched.toString());
		if (!sched.isShutdown()) {
			sched.shutdown();
		}
	}
}
调度子类一  SimpleTriggerRunner.java :

/**
 * @package :com.andy.demo.quartz.trigger<br>
 * @author :wanglongjie<br>
 * @createDate :2015年11月2日下午4:15:21<br>
 */
package com.andy.demo.quartz.trigger;

import java.util.Date;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleTrigger;

import com.andy.demo.quartz.job.WorkJob;
import com.andy.demo.quartz.trigger.dao.TriggerRunner;

/**
 * @package :com.andy.demo.quartz.trigger<br>
 * @file :SimpleTriggerRunner.java<br>
 * @describe :<br>
 * @author :wanglongjie<br>
 * @createDate :2015年11月2日下午4:15:21<br>
 * @updater :<br>
 * @updateDate :<br>
 * @updateContent :<br>
 */
public class SimpleTriggerRunner extends TriggerRunner {
	private static String jobName = "simple_printPerson";
	private static String jobGroup = "simple_person";

	private static String triggerName = "simple_tri_printPerson";
	private static String triggerGroup = "simple_tri_group_person";

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.andy.demo.quartz.trigger.dao.TriggerRunner#loadJob(java.lang.Object
	 * [])
	 */
	@Override
	public void loadJob(Object... data) throws Exception {
		// TODO Auto-generated method stub
		this.loadJob(jobName, jobGroup, triggerName, triggerGroup, data);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.andy.demo.quartz.trigger.dao.TriggerRunner#loadJob(java.lang.String,
	 * java.lang.String, java.lang.String, java.lang.String, java.lang.Object[])
	 */
	@Override
	public void loadJob(String jobName, String jobGroup, String triggerName,
			String triggerGroup, Object... data) throws Exception {
		// TODO Auto-generated method stub
		// 1、创建 Scheduler 对象
		Scheduler scheduler = gSchedulerFactory.getScheduler();
		System.out.println("loadJob..." + gSchedulerFactory.toString() + ", "
				+ scheduler.toString());

		// 2、创建 一个 JobDetail 实例, 指定 SimpleJob
		JobDetail jobDetail = new JobDetail(jobName, jobGroup, WorkJob.class);
		// 给 JobDetail 添加一些参数
		if (data != null && data.length >= 2 && data.length % 2 == 0) {
			for (int i = 0; i < data.length - 1; i = i + 2) {
				jobDetail.getJobDataMap().put(data[i], data[i + 1]);
			}
		}

		// 3、创建 一个 SimpleTrigger 实例
		SimpleTrigger simpleTrigger = new SimpleTrigger(triggerName,
				triggerGroup);
		System.out.println(new Date());
		// 定义调度规则
		// ①马上启动
		// simpleTrigger.setStartTime(new Date());
		// 5秒后启动
		simpleTrigger
				.setStartTime(new Date(System.currentTimeMillis() + 5000L));
		// ①两分钟后停止(当运行次数和时间范围冲突时,超过时间范围的任务运行不被执行)
		simpleTrigger.setEndTime(new Date(
				System.currentTimeMillis() + 2 * 60 * 1000L));
		// ②每5秒运行一次
		simpleTrigger.setRepeatInterval(3000);
		// ③共运行50次
		simpleTrigger.setRepeatCount(50);

		// 4、注册并进行调度
		scheduler.removeJobListener(jobName);
		scheduler.removeTriggerListener(jobName);
		scheduler.scheduleJob(jobDetail, simpleTrigger);
	}

}
调度子类一  CronTriggerRunner.java :

/**
 * @package :com.andy.demo.quartz.trigger<br>
 * @author :wanglongjie<br>
 * @createDate :2015年11月2日下午4:15:46<br>
 */
package com.andy.demo.quartz.trigger;

import java.util.Date;

import org.quartz.CronExpression;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;

import com.andy.demo.quartz.job.WorkJob;
import com.andy.demo.quartz.trigger.dao.TriggerRunner;

/**
 * @package :com.andy.demo.quartz.trigger<br>
 * @file :CronTriggerRunner.java<br>
 * @describe :<br>
 * @author :wanglongjie<br>
 * @createDate :2015年11月2日下午4:15:46<br>
 * @updater :<br>
 * @updateDate :<br>
 * @updateContent :<br>
 */
public class CronTriggerRunner extends TriggerRunner {
	private static String jobName = "cron_printPerson";
	private static String jobGroup = "cron_person";

	private static String triggerName = "cron_tri_printPerson";
	private static String triggerGroup = "cron_tri_group_person";

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.andy.demo.quartz.trigger.dao.TriggerRunner#loadJob(java.lang.Object
	 * [])
	 */
	@Override
	public void loadJob(Object... data) throws Exception {
		// TODO Auto-generated method stub
		this.loadJob(jobName, jobGroup, triggerName, triggerGroup, data);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.andy.demo.quartz.trigger.dao.TriggerRunner#loadJob(java.lang.String,
	 * java.lang.String, java.lang.String, java.lang.String, java.lang.Object[])
	 */
	@Override
	public void loadJob(String jobName, String jobGroup, String triggerName,
			String triggerGroup, Object... data) throws Exception {
		// TODO Auto-generated method stub
		// 1、创建 Scheduler 对象
		Scheduler scheduler = gSchedulerFactory.getScheduler();

		// 2、创建 一个 JobDetail 实例, 指定 SimpleJob
		JobDetail jobDetail = new JobDetail(jobName, jobGroup, WorkJob.class);
		// 给 JobDetail 添加一些参数
		if (data != null && data.length >= 2 && data.length % 2 == 0) {
			for (int i = 0; i < data.length - 1; i = i + 2) {
				jobDetail.getJobDataMap().put(data[i], data[i + 1]);
			}
		}

		// 3、创建 CronTrigger 实例
		CronTrigger cronTrigger = new CronTrigger(triggerName, triggerGroup);
		System.out.println(new Date());
		// 定义调度规则
		// 设置调度启动、关闭时间(立即启动,2分钟后关闭)(当运行次数和时间范围冲突时,超过时间范围的任务运行不被执行)
		cronTrigger.setStartTime(new Date());
		cronTrigger.setEndTime(new Date(
				System.currentTimeMillis() + 2 * 60 * 1000L));
		// 每5秒执行一次
		String cronExpressionStr = "0/5 * * * * ?";
		CronExpression cronExpression = new CronExpression(cronExpressionStr);
		cronTrigger.setCronExpression(cronExpression);

		// 4、注册并进行调度
		scheduler.removeJobListener(jobName);
		scheduler.removeTriggerListener(jobName);
		scheduler.scheduleJob(jobDetail, cronTrigger);
	}

}
测试类 TriggerRunnerTest.java :

/**
 * @package :com.andy.demo.quartz.trigger.test<br>
 * @author :wanglongjie<br>
 * @createDate :2015年11月2日下午5:14:52<br>
 */
package com.andy.demo.quartz.trigger.test;

import org.junit.Test;

import com.andy.demo.quartz.trigger.CronTriggerRunner;
import com.andy.demo.quartz.trigger.SimpleTriggerRunner;
import com.andy.demo.quartz.trigger.dao.TriggerRunner;

/**
 * @package :com.andy.demo.quartz.trigger.test<br>
 * @file :TriggerRunnerTest.java<br>
 * @describe :<br>
 * @author :wanglongjie<br>
 * @createDate :2015年11月2日下午5:14:52<br>
 * @updater :<br>
 * @updateDate :<br>
 * @updateContent :<br>
 */
public class TriggerRunnerTest {
	public Object data[] = new Object[] { "personName", "Andy", "personAge",
			"25" };

	public static void main(String[] args) {
		try {
			Object data[] = new Object[] { "personName", "Andy", "personAge",
					"25" };
			TriggerRunner runner = new CronTriggerRunner();
			// TriggerRunner runner = new SimpleTriggerRunner();
			runner.loadJob(data);
			runner.startJobs();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

	@Test
	public void testSimpleTirggerRunner() throws Exception {
		TriggerRunner runner = new SimpleTriggerRunner();
		runner.loadJob(data);
		runner.startJobs();

	}

	@Test
	public void testCronTirggerRunner() throws Exception {
		TriggerRunner runner = new CronTriggerRunner();
		runner.loadJob(data);
		runner.startJobs();
	}
}



最后说明一点,不知道什么原因测试类中用JUnit测试不成功,用main方法是可以的,究其原因还没仔细研究,本文就这样吧!


Quartz 任务调度(二)

标签:

原文地址:http://my.oschina.net/andy1989/blog/524981

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!