=======================================================================
以下屬于個人觀點,難免有錯誤,如發現錯誤請留言告之,我會訂正的。
這篇講解怎麼設定參數傳遞給執行的任務,我們需要用到jobDataMap()這個方法。
JobDataMap能夠支援任何序列化的對象,當job執行時,這些對象能夠在job執行個體中可用。JobDataMap實作了Java Map接口,它有一些附加的方法,這些方法用來儲存和跟蹤簡單類型的資料。如下代碼可以很快地給job增加JobDataMap:
jobDetail.getJobDataMap().put("jobSays", "Hello World!");
jobDetail.getJobDataMap().put("myFloatValue", 3.141f);
jobDetail.getJobDataMap().put("myStateData", new ArrayList());
在job執行時,我們可以在job裡通過如下代碼得到JobDataMap:
public class DumbJob implements Job {
public DumbJob() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException
{
String instName = context.getJobDetail().getName();
String instGroup = context.getJobDetail().getGroup();
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
String jobSays = dataMap.getString("jobSays");
float myFloatValue = dataMap.getFloat("myFloatValue");
ArrayList state = (ArrayList)dataMap.get("myStateData");
state.add(new Date());
System.err.println("Instance " + instName + " of DumbJob says: " + jobSays);
}
看官方的例子裡,我們在run()方法裡可以看到:
JobDetail job = newJob(ColorJob.class)
.withIdentity("job1", "group1")
.build();
job.getJobDataMap().put(key, value);
隻要put(key,value)即可傳遞參數。
我們在實作了job接口的類中
JobDataMap data = context.getJobDetail().getJobDataMap();
String favoriteColor = data.getString(key);
int count = data.getInt(key);
看官方提供的例子example4:
<a href="http://blog.51cto.com/attachment/201206/103157751.png" target="_blank"></a>
JobStateExample.java
package main.java.org.quartz.examples.example4;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
import static org.quartz.DateBuilder.*;
import java.util.Date;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class JobStateExample {
public void run() throws Exception {
Logger log = LoggerFactory.getLogger(JobStateExample.class);
log.info("------- Initializing -------------------");
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
log.info("------- Initialization Complete --------");
log.info("------- Scheduling Jobs ----------------");
Date startTime = nextGivenSecondDate(null, 10);
JobDetail job1 = newJob(ColorJob.class)
SimpleTrigger trigger1 = newTrigger()
.withIdentity("trigger1", "group1")
.startAt(startTime)
.withSchedule(simpleSchedule()
.withIntervalInSeconds(10)
.withRepeatCount(4))
//設定參數,調用ColorJob中的預設變量
job1.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "Green");
job1.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1);
Date scheduleTime1 = sched.scheduleJob(job1, trigger1);
log.info(job1.getKey() +
" will run at: " + scheduleTime1 +
" and repeat: " + trigger1.getRepeatCount() +
" times, every " + trigger1.getRepeatInterval() / 1000 + " seconds");
log.info("------- Starting Scheduler ----------------");
sched.start();
log.info("------- Started Scheduler -----------------");
log.info("------- Waiting 60 seconds... -------------");
try {
Thread.sleep(60L * 1000L);
} catch (Exception e) {
}
log.info("------- Shutting Down ---------------------");
sched.shutdown(true);
log.info("------- Shutdown Complete -----------------");
SchedulerMetaData metaData = sched.getMetaData();
log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");
public static void main(String[] args) throws Exception {
JobStateExample example = new JobStateExample();
example.run();
}
ColorJob.java
import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.PersistJobDataAfterExecution;
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class ColorJob implements Job {
private static Logger _log = LoggerFactory.getLogger(ColorJob.class);
public static final String FAVORITE_COLOR = "favorite color";
public static final String EXECUTION_COUNT = "count";
private int _counter = 1;
public ColorJob() {}
throws JobExecutionException {
JobKey jobKey = context.getJobDetail().getKey();
JobDataMap data = context.getJobDetail().getJobDataMap();
String favoriteColor = data.getString(FAVORITE_COLOR);
int count = data.getInt(EXECUTION_COUNT);
_log.info("ColorJob: " + jobKey + " executing at " + new Date() + "\n" +
" favorite color is " + favoriteColor + "\n" +
" execution count (from job map) is " + count + "\n" +
" execution count (from job member variable) is " + _counter);
count++;
data.put(EXECUTION_COUNT, count);
_counter++;
控制台輸出資訊:
[INFO] 14 六月 10:34:40.640 上午 main [main.java.org.quartz.examples.example4.JobStateExample]
------- Initializing -------------------
[INFO] 14 六月 10:34:40.687 上午 main [org.quartz.impl.StdSchedulerFactory]
Using default implementation for ThreadExecutor
[INFO] 14 六月 10:34:40.687 上午 main [org.quartz.simpl.SimpleThreadPool]
Job execution threads will use class loader of thread: main
[INFO] 14 六月 10:34:40.718 上午 main [org.quartz.core.SchedulerSignalerImpl]
Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
[INFO] 14 六月 10:34:40.718 上午 main [org.quartz.core.QuartzScheduler]
Quartz Scheduler v.2.1.5 created.
[INFO] 14 六月 10:34:40.718 上午 main [org.quartz.simpl.RAMJobStore]
RAMJobStore initialized.
Scheduler meta-data: Quartz Scheduler (v2.1.5) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.
[INFO] 14 六月 10:34:40.718 上午 main [org.quartz.impl.StdSchedulerFactory]
Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
Quartz scheduler version: 2.1.5
[INFO] 14 六月 10:34:40.718 上午 main [main.java.org.quartz.examples.example4.JobStateExample]
------- Initialization Complete --------
------- Scheduling Jobs ----------------
[INFO] 14 六月 10:34:40.734 上午 main [main.java.org.quartz.examples.example4.JobStateExample]
group1.job1 will run at: Thu Jun 14 10:34:50 CST 2012 and repeat: 4 times, every 10 seconds
------- Starting Scheduler ----------------
[INFO] 14 六月 10:34:40.734 上午 main [org.quartz.core.QuartzScheduler]
Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
------- Started Scheduler -----------------
------- Waiting 60 seconds... -------------
[INFO] 14 六月 10:34:50.000 上午 DefaultQuartzScheduler_Worker-1 [main.java.org.quartz.examples.example4.ColorJob]
ColorJob: group1.job1 executing at Thu Jun 14 10:34:50 CST 2012
favorite color is Green
execution count (from job map) is 1
execution count (from job member variable) is 1
[INFO] 14 六月 10:35:00.000 上午 DefaultQuartzScheduler_Worker-2 [main.java.org.quartz.examples.example4.ColorJob]
ColorJob: group1.job1 executing at Thu Jun 14 10:35:00 CST 2012
execution count (from job map) is 2
[INFO] 14 六月 10:35:10.015 上午 DefaultQuartzScheduler_Worker-3 [main.java.org.quartz.examples.example4.ColorJob]
ColorJob: group1.job1 executing at Thu Jun 14 10:35:10 CST 2012
execution count (from job map) is 3
[INFO] 14 六月 10:35:20.000 上午 DefaultQuartzScheduler_Worker-4 [main.java.org.quartz.examples.example4.ColorJob]
ColorJob: group1.job1 executing at Thu Jun 14 10:35:20 CST 2012
execution count (from job map) is 4
[INFO] 14 六月 10:35:30.015 上午 DefaultQuartzScheduler_Worker-5 [main.java.org.quartz.examples.example4.ColorJob]
ColorJob: group1.job1 executing at Thu Jun 14 10:35:30 CST 2012
execution count (from job map) is 5
[INFO] 14 六月 10:35:40.734 上午 main [main.java.org.quartz.examples.example4.JobStateExample]
------- Shutting Down ---------------------
[INFO] 14 六月 10:35:40.734 上午 main [org.quartz.core.QuartzScheduler]
Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.
Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.
[INFO] 14 六月 10:35:41.062 上午 main [org.quartz.core.QuartzScheduler]
Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.
[INFO] 14 六月 10:35:41.062 上午 main [main.java.org.quartz.examples.example4.JobStateExample]
------- Shutdown Complete -----------------
Executed 5 jobs.
本文轉自shyy8712872 51CTO部落格,原文連結:http://blog.51cto.com/shuyangyang/898198,如需轉載請自行聯系原作者