Quartz學習——Quartz簡單入門Demo(二)

要學習Quartz框架,首先大概瞭解了Quartz的基本知識後,在經過簡單的例子入門,一步一個腳印的走下去。 
下面介紹Quartz入門的示例,因爲Quartz的存儲方式分爲RAM和JDBC,分別對這兩種進行簡單的說明。並附上代碼! 
首先須要添加Quartz的Jar包 ,我使用的是quartz.2.2.1版本! 
Demo代碼下載地址quartz-studyjava

<!-- quartz -->
    <dependency>
         <groupId>org.quartz-scheduler</groupId>
         <artifactId>quartz</artifactId>
         <version>2.2.1</version>
    </dependency>
    <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>2.2.1</version>
    </dependency>

 

1:RAM方式 
要測試RAMdemo的代碼,請先刪除demo中這個quartz.properties文件,或者重命名!不然會測試不成功! 
(1):Jobmysql

package com.liuzhihu.learn;

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 
 * @author liuzhihu
 *
 */
public class RAMJob implements Job {

	private static Logger _log = LoggerFactory.getLogger(RAMJob.class);

	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {

		_log.info("Say hello to Quartz" + new Date());
	}

}

 

(2):RAMQuartzgit

 

package com.liuzhihu.learn;

import java.util.Date;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/***
 * 
 * @author liuzhihu
 *
 */
public class RAMQuartz {

	private static Logger _log = LoggerFactory.getLogger(RAMQuartz.class);

	public static void main(String[] args) throws SchedulerException {
		// 1.建立Scheduler的工廠
		SchedulerFactory sf = new StdSchedulerFactory();
		// 2.從工廠中獲取調度器實例
		Scheduler scheduler = sf.getScheduler();

		// 3.建立JobDetail
		JobDetail jb = JobBuilder.newJob(RAMJob.class).withDescription("this is a ram job") // job的描述
				.withIdentity("ramJob", "ramGroup") // job 的name和group
				.build();

		// 任務運行的時間,SimpleSchedle類型觸發器有效
		long time = System.currentTimeMillis() + 3 * 1000L; // 3秒後啓動任務
		Date statTime = new Date(time);

		// 4.建立Trigger
		// 使用SimpleScheduleBuilder或者CronScheduleBuilder
		Trigger t = TriggerBuilder.newTrigger().withDescription("").withIdentity("ramTrigger", "ramTriggerGroup")
				 .withSchedule(SimpleScheduleBuilder.simpleSchedule())
				.startAt(statTime) // 默認當前時間啓動
				//.withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")) // 兩秒執行一次
				.build();

		// 5.註冊任務和定時器
		scheduler.scheduleJob(jb, t);

		// 6.啓動 調度器
		scheduler.start();
		_log.info("啓動時間 : " + new Date());

	}
}

 

運行結果: 
SimpleScheduleBuilder:github

 

CronScheduleBuilder:sql

 

 

2.JDBC方式數據庫

使用jdbc方式,就要配置quartz.properties文件,而且在開始的時候在數據庫中新增表! 
我使用的數據庫是mysql,數據庫中表在quartz_demo裏面有,須要的請在裏面下載! 
運行 tables_db2_v8.sql 這個文件。框架

#JDBC驅動
org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver
org.quartz.dataSource.qzDS.URL:jdbc:mysql://localhost:3306/quartz_test
org.quartz.dataSource.qzDS.user:root
org.quartz.dataSource.qzDS.password:root
org.quartz.dataSource.qzDS.maxConnection:10 

(1)MyJobide

 

package com.liuzhihu.jdbctest;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/***
 * 
 * @author liuzhihu
 *
 */
public class MyJob implements Job {
	private static final Logger log = LoggerFactory.getLogger(MyJob.class);

	public void execute(JobExecutionContext context) throws JobExecutionException {
		log.info("MyJob  is start ..................");

		log.info("Hello quzrtz  " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ").format(new Date()));

		log.info("MyJob  is end .....................");
	}

}

  

(2)QuartzJdbcTest學習

 

package com.liuzhihu.jdbctest;

import java.text.ParseException;
import java.util.List;

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.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

/***
 * 
 * @author liuzhihu
 *
 */
public class QuartzJdbcTest {

	public static void main(String[] args) throws SchedulerException, ParseException {
		startSchedule();
		// resumeJob();
	}

	/**
	 * 開始一個simpleSchedule()調度
	 */
	public static void startSchedule() {
		try {
			// 一、建立一個JobDetail實例,指定Quartz
			JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
					// 任務執行類
					.withIdentity("job1_1", "jGroup1")
					// 任務名,任務組
					.build();

			// 觸發器類型
			SimpleScheduleBuilder builder = SimpleScheduleBuilder
					// 設置執行次數
					.repeatSecondlyForTotalCount(5);

			// CronScheduleBuilder builder =
			// CronScheduleBuilder.cronSchedule("0/2 * * * * ?");
			// 二、建立Trigger
			Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1_1", "tGroup1").startNow()
					.withSchedule(builder).build();

			// 三、建立Scheduler
			Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
			scheduler.start();
			// 四、調度執行
			scheduler.scheduleJob(jobDetail, trigger);
			try {
				Thread.sleep(60000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

			// 一分鐘後,關閉調度器
			scheduler.shutdown();

		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 從數據庫中找到已經存在的job,並從新開戶調度
	 */
	public static void resumeJob() {
		try {

			SchedulerFactory schedulerFactory = new StdSchedulerFactory();
			Scheduler scheduler = schedulerFactory.getScheduler();
			JobKey jobKey = new JobKey("job1_1", "jGroup1");
			List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
			// SELECT TRIGGER_NAME, TRIGGER_GROUP FROM {0}TRIGGERS WHERE
			// SCHED_NAME = {1} AND JOB_NAME = ? AND JOB_GROUP = ?
			// 從新恢復在jGroup1組中,名爲job1_1的 job的觸發器運行
			if (triggers.size() > 0) {
				for (Trigger tg : triggers) {
					// 根據類型判斷
					if ((tg instanceof CronTrigger) || (tg instanceof SimpleTrigger)) {
						// 恢復job運行
						scheduler.resumeJob(jobKey);
					}
				}
				scheduler.start();
			}

		} catch (Exception e) {
			e.printStackTrace();

		}
	}
}

  

運行結果: 測試

 

 

 

控制檯打印: 

 

Cron和Simple類型,Simple類型的若是JobDetail沒有設置.storeDurably(true),則job在運行完成以後會在數據庫中刪除!

 

原文地址:http://blog.csdn.net/u010648555/article/details/54863394

相關文章
相關標籤/搜索