Archive for category quartz
Java with Quartz 2.0.1
Posted by boysbee in java, programming, quartz on 22/05/2011
วันก่อนหลังจากย้ายงานมาจากที่ทำงานเดิมมาทำที่ใหม่ ได้โจทย์มาว่าคุณลูกค้าต้องการยังงี้ ๆ เราก็อ้อต้องการให้มีตัวกวาดไฟล์มาทำงานทุก ๆ ช่วงเวลา และในหนึ่งช่วงเวลาก็มีหลายงานที่ต้องทำเสียเหลือเกิน เราก็นึกถึง 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();
}
}
}
ลองทดสอบรันกันดูนะครับ