微信扫一扫

028-83195727 , 15928970361
business@forhy.com

quartz2实战

quartz,java,任务调度2016-06-14

上篇文章介绍了java的几种任务调度实现的方式,今天用一个例子来说明一下
quartz 2的使用方法。

Talk is cheap, show me the code. 废话不多说!

package quartz2;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzTest {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            // Grab the Scheduler instance from the Factory
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            JobDataMap jobDataMap = new JobDataMap();
            jobDataMap.put("param1", "a");
            jobDataMap.put("param2", "a");
            // define the job and tie it to our HelloJob class
            JobDetail job = newJob(HelloJob.class)
                .withIdentity("job1", "group1")
                // set JobDataMap to transfer parameters
                .setJobData(jobDataMap)
                .build();

            // Trigger the job to run now, and then repeat every 5 seconds
            Trigger trigger = newTrigger()
                .withIdentity("trigger1", "group1")
                //start at 
                //.startAt(format.parse("2016-06-14 17:25:00"))
                .startNow()
                      .withSchedule(simpleSchedule()
                        .withIntervalInSeconds(5)
                        .repeatForever())            
                .build();

            // Tell quartz to schedule the job using our trigger
            scheduler.scheduleJob(job, trigger);

            //  start it 
            scheduler.start();

           //  stop it 
          //scheduler.shutdown(true);
        } catch (SchedulerException se) {
            se.printStackTrace();
        }
    }
}

package quartz2;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class HelloJob implements  Job{
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobDataMap dataMap = context.getJobDetail().getJobDataMap();
        System.out.println("Hello World! - " + new Date());
        System.out.println("param1=" + dataMap.getString("param1"));
        System.out.println("param2=" + dataMap.getString("param2"));
    }
}

总结:

可以向 JobDataMap 中存入键/值对,那些数据对可在你的 Job 类中传递和进行访问。这是一个向你的 Job 传送配置的信息便捷方法。
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put(“param1”, “a”);
jobDataMap.put(“param2”, “a”);

JobDetail job = newJob(HelloJob.class)
.withIdentity(“job1”, “group1”)
// set JobDataMap to transfer parameters
.setJobData(jobDataMap)
.build();

通过 JobExecutionContext 对象访问 JobDataMap
JobExecutionContext 对象让 Job 能访问 Quartz 运行时候环境和 Job 本身的明细数据。这就类似于在 Java Web 应用中的 servlet 访问 ServletContext 那样。通过 JobExecutionContext,Job 可访问到所处环境的所有信息,包括注册到 Scheduler 上与该 Job 相关联的 JobDetail 和 Triiger

JobDataMap dataMap = context.getJobDetail().getJobDataMap();
System.out.println(“Hello World! - ” + new Date());
System.out.println(“param1=” + dataMap.getString(“param1”));
System.out.println(“param2=” + dataMap.getString(“param2”));