二. 与 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) 进行许可。
http://www.bt285.cn 这个BT网站,与http://yaonba.com.cn NBA中文网job也是用quartZ