Archive for category quartz

Java with Quartz 2.0.1

วันก่อนหลังจากย้ายงานมาจากที่ทำงานเดิมมาทำที่ใหม่ ได้โจทย์มาว่าคุณลูกค้าต้องการยังงี้ ๆ เราก็อ้อต้องการให้มีตัวกวาดไฟล์มาทำงานทุก ๆ ช่วงเวลา และในหนึ่งช่วงเวลาก็มีหลายงานที่ต้องทำเสียเหลือเกิน เราก็นึกถึง Quartz ขึ้นมาทันทีตัวหากินเลยนะ ยิ้ม เลยได้เวลากลับไปดู Quartz ซะหน่อย home page เขาก็บอกว่า release ล่าสุดเขา 2.0.1 นะเคยแต่ใช้ตัวเก่า 1.6+ ไม่เคยใช้ 2+ มาก่อนเลยโหลดมาลองใช้กัน โอ้วแตกต่างจากวิธีเขียนเดิมไม่มาก แต่ถ้าไม่ได้อ่าน doc อาจจะงงเล็กน้อย ลองเข้าไปดูที่ What’s New In Quartz Scheduler 2.0 เกริ่นมาเยอะลองไปดูวิธีเขียนกันดีกว่า

สร้าง TriggerJob ก่อน

package org.my.quartz;

import java.util.Date;

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

public class HelloTriggerJob implements Job {

	@Override
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		JobKey jobKey = context.getJobDetail().getKey();
		System.out.println("HelloJob says: " + jobKey + " executing at "
				+ new Date());
	}

}

แล้วก็สร้าง CronJob

package org.my.quartz;

import java.util.Date;

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

public class HelloCronJob implements Job {

	@Override
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		JobKey jobKey = context.getJobDetail().getKey();
		System.out.println("HelloCronJob says: " + jobKey
				+ " this time is " + new Date());

	}

}

พอได้ทั้ง cron และ trigger แล้วเรามาลองสร้าง Quartz Scheduler เพื่อจะใช้ปลุก job ทั้งสองแบบมาทำงานกัน

package org.my.quartz;

import java.text.ParseException;
import java.util.Date;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.DateBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class MyQuartzScheduler {

	SchedulerFactory sf;

	Scheduler sched;

	private void createCronTrigger() throws SchedulerException, ParseException {
		// job will run every 20 seconds
		JobDetail job = JobBuilder.newJob(HelloCronJob.class).withIdentity(
				"cronjob", "cronjobgroup1").build();
		CronScheduleBuilder cronBuilder = CronScheduleBuilder
				.cronSchedule("0/20 * * * * ?");

		// CronTrigger the job to run on the every 20 seconds
		CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(
				"crontrigger", "crontriggergroup1").withSchedule(cronBuilder)
				.build();

		// Tell quartz to schedule the job using our crontrigger
		Date ft = sched.scheduleJob(job, cronTrigger);
		System.out.println(job.getKey() + " has been scheduled to run at: "
				+ ft + " and repeat based on expression: "
				+ cronTrigger.getCronExpression());
	}

	private void createTrigger() throws SchedulerException {
		// computer a time that is on the next round minute
		Date runTime = DateBuilder.evenMinuteDate(new Date());

		System.out.println("------- Scheduling Job  -------------------");

		// define the job and tie it to our HelloTriggerJob class

		JobDetail job = JobBuilder.newJob(HelloTriggerJob.class).withIdentity(
				"triggerjob", "triggerjobgroup1").build();

		// Trigger the job to run on the next round minute
		Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger",
				"triggergroup1").startAt(runTime).build();

		// Tell quartz to schedule the job using our trigger
		sched.scheduleJob(job, trigger);
		System.out.println(job.getKey() + " will run at: " + runTime);

	}

	public void init() throws SchedulerException, ParseException {
		System.out.println("------- Initializing ----------------------");
		sf = new StdSchedulerFactory();
		sched = sf.getScheduler();
		System.out.println("------- Initialization Complete -----------");

		createTrigger();

		createCronTrigger();

		// Start up the scheduler (nothing can actually run until the
		// scheduler has been started)
		sched.start();

		System.out.println("------- Started Scheduler -----------------");

		// wait long enough so that the scheduler as an opportunity to
		// run the job!
		System.out.println("------- Waiting 65 seconds... -------------");
		try {
			// wait 65 seconds to show job
			Thread.sleep(65L * 1000L);
			// executing...
		} catch (Exception e) {
		}

		// shut down the scheduler
		System.out.println("------- Shutting Down ---------------------");
		sched.shutdown(true);
		System.out.println("------- Shutdown Complete -----------------");

		SchedulerMetaData metaData = sched.getMetaData();
		System.out.println("Executed " + metaData.getNumberOfJobsExecuted()
				+ " jobs.");
	}

	public static void main(String[] args) {
		try {
			new MyQuartzScheduler().init();
		} catch (SchedulerException e) {
			e.printStackTrace();
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}
}

ลองทดสอบรันกันดูนะครับ :)

, ,

ให้ความเห็น

Follow

Get every new post delivered to your Inbox.

Join 82 other followers