二. 与 Job 一同工作
本节为使用 Quartz 的 Job 提供了一些例子。
·创建一个新的 Job 类
创建一个新的 Job 类很简单。仅需创建一个类,让它实现 org.quartz.Job 接口即可。这个接口需要你实现 execute() 方法,它会在 Scheduler 决定 Job 要执行时被调用。
代码 12.4 演示了一个简单的 Job,它会为某个用户检查邮件服务器上是否有新的邮件。当 Scheduler 执行这个 Job 时,方法 execute() 被调用,然后其中的代码就会连接到邮件服务器并获取任何邮件消息。这一 Job 只简单的打印邮件是谁发的和邮件的主题。
代码 12.4. 一个检查邮件服务器上的邮件的 Quartz Job
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | package org.cavaness.quartzbook.chapter12; import java.security.NoSuchProviderException; import java.util.Properties; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Store; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class CheckEmailJob implements Job {   String mailHost = "some.mail.host";   String username = "aUsername";   String password = "aPassword";   // Default Constructor   public CheckEmailJob() {     super();   }   public void execute(JobExecutionContext context) throws JobExecutionException {     checkMail();   }   protected void checkMail() {     // Get session     Session session = null;     try {       // Get system properties       Properties props = System.getProperties();       session = Session.getDefaultInstance(props, null);     // Get the store     Store store = session.getStore("pop3");     store.connect(mailHost, username, password);     // Get folder     Folder folder = store.getFolder("INBOX");     folder.open(Folder.READ_ONLY);     // Get directory     Message message[] = folder.getMessages();     int numOfMsgs = message.length;     if (numOfMsgs > 0) {       for (int i = 0, n = numOfMsgs; i < n; i++) {         System.out.println("(" + i + "  of "  + numOfMsgs + "): "             + message[i].getFrom()[0] + "\t"             + message[i].getSubject());       }     } else {       System.out.println("No Messages for user");     }     // Close connection     folder.close(false);     store.close();   } catch (NoSuchProviderException e) {     // TODO Auto-generated catch block     e.printStackTrace();   } catch (MessagingException e) {     // TODO Auto-generated catch block     e.printStackTrace();   }  }  public static void main(String[] args) {    CheckEmailJob job = new CheckEmailJob();    job.checkMail();  } } | 
代码 12.4 中大部分内部是使用 JavaMail API 访问邮件服务器的。就实现一个新的 Quartz Job 类来说,只有很少的事情要做。究其本质,就是要实现 Job 接口和 execute() 方法,然后为被部署准备就绪。这在下一个例子中有所显示。
| 硬编码之于向 Job 传参 在代码 12.4 中,邮件属性,如主机、用户名和密码是硬编码在 Job 类本身中。这称不上是个好主意。在本章后面部份,我们把 Job 修改为传参到 JobDataMap 中。 | 
·部署 Quartz Job
如上个例子所演示的,要创建一个 Quartz Job 确实很直截的。幸运的是,通过 Scheduler 配置一个 Job 也不是很难。代码 12.5 展示的就是部署前面的 CheckEmailJob。
代码 12.5. 显示了如何部署 CheckEmailJob 的例子
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | package org.cavaness.quartzbook.chapter12; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.Trigger; import org.quartz.TriggerUtils; import org.quartz.impl.StdSchedulerFactory; public class Listing_12_5 {   static Log logger = LogFactory.getLog(Listing_12_5.class);   public static void main(String[] args) {     Listing_12_5 example = new Listing_12_5();     example.runScheduler();   }   public void runScheduler() {     Scheduler scheduler = null;     try {       // Get a Scheduler instance from the Factory       scheduler = StdSchedulerFactory.getDefaultScheduler();       // Start the scheduler       scheduler.start();       // Create a JobDetail for the Job       JobDetail jobDetail = new JobDetail("CheckEmailJob",           Scheduler.DEFAULT_GROUP, CheckEmailJob.class);       // Create a trigger that fires every 1 hour       Trigger trigger = TriggerUtils.makeHourlyTrigger();       trigger.setName("emailJobTrigger");       // Start the trigger firing from now       // trigger.setStartTime(new Date());       // Associate the trigger with the job in the scheduler       scheduler.scheduleJob(jobDetail, trigger);     } catch (SchedulerException ex) {       // deal with any exceptions       logger.error(ex);     }   } } | 
代码 12.5 中的内容先是从 StdSchedulerFactory 获得 Scheduler,然后启动它。接着为 CheckEmailJob 创建一个 JobDetail 和一个立即开始、每小时触发的 Trigger。
·触发 Job 一次
org.quartz.TriggerUtils 类是很方便的,包含有许多有用的方法。其中一个最有用的方法是能部署一个只立即触发一次的 Trigger。代码 12.6 演示了如何仅仅触发 CheckEmailJob 一次。
代码 12.6. 为 CheckEmailJob 使用仅触发一次的 Trigger
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | package org.cavaness.quartzbook.chapter12; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.Trigger; import org.quartz.TriggerUtils; import org.quartz.impl.StdSchedulerFactory; public class Listing_12_6 {   static Log logger = LogFactory.getLog(Listing_12_6.class);   public static void main(String[] args) {     Listing_12_6 example = new Listing_12_6();     example.runScheduler();   }   public void runScheduler() {     Scheduler scheduler = null;     try {       // Get a Scheduler instance from the Factory       scheduler = StdSchedulerFactory.getDefaultScheduler();       // Start the scheduler       scheduler.start();       // Create a JobDetail for the Job       JobDetail jobDetail = new JobDetail("CheckEmailJob",           Scheduler.DEFAULT_GROUP, CheckEmailJob.class);       // Create a trigger that fire-once only       Trigger trigger = TriggerUtils.makeImmediateTrigger(0, 0);       trigger.setName("emailJobTrigger");       // Associate the trigger with the job in the scheduler       scheduler.scheduleJob(jobDetail, trigger);     } catch (SchedulerException ex) {       // deal with any exceptions       logger.error(ex);     }   } } | 
代码 12.6 中使用了 TriggerUtils 类的静态方法 makeImmediateTrigger(),并传递给 repeatCount 和 repeatInterval 这两个参数的值都是 0,也就使得这个 Trigger 仅触发一次。
本文链接 https://yanbin.blog/quartz-job-scheduling-framework-12-2/, 来自 隔叶黄莺 Yanbin Blog
[版权声明]  本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
http://www.bt285.cn 这个BT网站,与http://yaonba.com.cn NBA中文网job也是用quartZ