博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于Quartz实现简单的定时发送邮件
阅读量:5904 次
发布时间:2019-06-19

本文共 7809 字,大约阅读时间需要 26 分钟。

一、什么是Quartz

Quartz 是一个轻量级任务调度框架,只需要做些简单的配置就可以使用;它可以支持持久化的任务存储,即使是任务中断或服务重启后,仍可以继续运行。Quartz既可以做为独立的应用提供服务,也可以和其他应用集成一起使用。

核心概念:

1、Job
表示一个工作,要执行的具体内容。此接口中只有一个方法
void execute(JobExecutionContext context) 
2、JobDetail
JobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。 
3、Trigger代表一个调度参数的配置,什么时候去调。 
4、Scheduler代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。

Quartz的类关系图:

注意:Quartz的版本与Spring 的版本有关, Spring 2.x的版本最好用Quartz 1.8.5的,若是 Spring 3.0以上的Quartz 的版本最好用 2.0以上的。

二、基于Sping+Quartz实现简单的JAVA邮件发送

1.创建一个Java(Web)工程

2.实现SimpleMail、MailJob、EmailScheduler类

SimpleMail:

 

1 package com.quartz.mail; 2  3 import org.apache.commons.mail.EmailException; 4 import org.apache.commons.mail.SimpleEmail; 5  6 import javax.mail.internet.AddressException; 7 import javax.mail.internet.InternetAddress; 8 import java.util.ArrayList; 9 import java.util.Date;10 import java.util.List;11 12 /**13  * Created by xiwu.xxw on 2015/8/8.14  */15  public class SimpleMail {16     private SimpleEmail mail;17 18     /**19      * 初始化一封邮件,暂不支持富媒体和附件20      * @param receivers 邮件的接收者21      * @param subject 邮件主题22      * @param content 邮件内容23      * @throws EmailException24      * @throws AddressException25      */26     public  SimpleMail(List
receivers,String subject,String content) throws EmailException, AddressException {27 mail=new SimpleEmail();28 mail.setCharset("UTF-8");29 List
toList=new ArrayList
();30 for(String receiver: receivers){31 toList.add(new InternetAddress(receiver));32 }33 mail.setTo(toList);34 mail.setSubject(subject);35 mail.setContent(content, "text/html;charset=utf-8");36 }37 38 /**39 * 发送邮件40 * @param from 发送方邮件地址41 * @param password 发送授权码42 * @return43 * @throws EmailException44 */45 public String sendEmail(String from,String password) throws EmailException {46 mail.setFrom(from);47 //发送方邮箱权限认证,发送方邮箱须开通SMTP/POP/IMAP功能48 mail.setAuthentication(from, password);49 mail.setHostName("smtp." + from.split("@")[1]);50 mail.setSentDate(new Date());51 return mail.send();52 }53 }

 

MailJob:

1 package com.quartz.job; 2  3 import com.quartz.mail.SimpleMail; 4 import org.quartz.JobDataMap; 5 import org.quartz.JobExecutionContext; 6 import org.quartz.JobExecutionException; 7 import org.springframework.scheduling.quartz.QuartzJobBean; 8  9 import java.util.List;10 11 /**12  * Created by xiwu.xxw on 2015/8/8.13  */14 public class MailJob extends QuartzJobBean {15     /**16      * 执行Job任务17      * @param context18      * @throws JobExecutionException19      */20     @Override21     protected void executeInternal(JobExecutionContext context) throws JobExecutionException {22         JobDataMap map=context.getJobDetail().getJobDataMap();23         try {24             SimpleMail mail=new SimpleMail((List
) map.get("receivers"),map.getString("subject"),map.getString("content"));25 String result=mail.sendEmail(map.getString("from"), map.getString("password"));26 System.out.println(result);27 } catch (Exception e) {28 e.printStackTrace();29 }30 }31 }

EmailScheduler:

1 package com.quartz.scheduler; 2  3 import org.quartz.SchedulerException; 4 import org.quartz.impl.StdScheduler; 5 import org.springframework.context.support.ClassPathXmlApplicationContext; 6 import org.springframework.scheduling.quartz.CronTriggerBean; 7 import org.springframework.scheduling.quartz.JobDetailBean; 8 import org.springframework.scheduling.quartz.SimpleTriggerBean; 9 10 import java.util.ArrayList;11 import java.util.List;12 13 /**14  * Created by xiwu.xxw on 2015/8/8.15  */16 public class EMailScheduler {17         public static void main(String[] args) throws SchedulerException {18             //收件人19             List
receivers=new ArrayList
();20 receivers.add("xxxxx@qq.com");21 receivers.add("xxxxx@126.com");22 receivers.add("xxxxx@163.com");23 24 ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");25 //邮件JobBean26 JobDetailBean mailJob= (JobDetailBean) context.getBean("mailJob");27 mailJob.setName("mailJob");28 mailJob.setGroup("textEmail");29 // 指明任务就算没有绑定Trigger仍保留在Quartz的JobStore中30 //mailJob.setDurability(true);31 mailJob.getJobDataMap().put("receivers",receivers);32 mailJob.getJobDataMap().put("subject","基于Quartz实现邮件发送");33 mailJob.getJobDataMap().put("content","本程序基于Quartz实现了定时群发邮件的功能,目前只支持文本发送!");34 35 36 //发送邮件任务的SimpleTrigger触发器37 SimpleTriggerBean simpleTrigger= (SimpleTriggerBean) context.getBean("SimpleTrigger");38 39 //发送邮件任务调度器40 StdScheduler scheduler= (StdScheduler) context.getBean("startQuartzTask");41 //加入一个任务到Quartz框架中, 并与simpleTrigger关联42 //Quartz会自动校正与设置simpleTrigger的JobName与JobGroup属性43 scheduler.scheduleJob(mailJob,simpleTrigger);44 45 //发送邮件任务的CronTrigger触发器46 CronTriggerBean croTrigger= (CronTriggerBean) context.getBean("CronTrigger");47 //将发送邮件任务的触发器与邮件任务关联并注册到调度器48 croTrigger.setJobName("mailJob");49 croTrigger.setJobGroup("textEmail");50 //因为任务已在上一条语句中已加入, 所以不能再使用scheduleJob(JobDetail, Trigger)51 scheduler.scheduleJob(croTrigger);52 53 try {54 //开始调度55 scheduler.start();56 } catch (SchedulerException e) {57 e.printStackTrace();58 }59 }60 }

3.配置applicationContext.xml

1 
2
11 12
13
14
15
16
17
18
19
20 21
22
23
24
25
26
27
28
29
30 31
32
33
com.quartz.job.MailJob
34
35
36
37
38
xxxxxxx@126.com
39
40
41
uebbqvlizrywzhei
42
43
44
45
46 47
48
49
5000
50
51
52
120000
53
54
55
3
56
57
58 59
60
61
0 25/2 17 8 8 ? 2015
62
63
64
65 66
67

4.效果如下

三、注意事项

(1)Job被创建后,可以保存在Scheduler中,与Trigger是独立的,同一个Job可以有多个Trigger;这种松耦合的另一个好处是,当与Scheduler中的Job关联的trigger都过期时,可以配置Job稍后被重新调度,而不用重新定义Job;还有,可以修改或者替换Trigger,而不用重新定义与之关联的Job。

(2)将Job和Trigger注册到Scheduler时,可以为它们设置key,配置其身份属性。Job和Trigger的key(JobKey和TriggerKey)可以用于将Job和Trigger放到不同的分组(group)里,然后基于分组进行操作。同一个分组下的Job或Trigger的名称必须唯一,即一个Job或Trigger的key由名称(name)和分组(group)组成。

(3)在Quartz中,如果实现org.quartz.Job接口,那么这个job是stateless的,job实例的参数不能在多个任务之间共享,做并发,如果实现org.quartz.StatefulJob,这个job是个单例的,job实例的属性可以从当前任务传递到下一个任务,做串行。

 

转载于:https://www.cnblogs.com/cloudml/p/4713566.html

你可能感兴趣的文章
Firefox 跟踪保护技术将页面加载时间减少 44%
查看>>
java解析虾米音乐
查看>>
mysql 多行合并函数
查看>>
艾级计算机的发展与挑战
查看>>
RocketMQ事务消息实战
查看>>
手把手教你做出好看的文本输入框
查看>>
zabbix 3.2.7 (源码包)安装部署
查看>>
vsCode 快捷键、插件
查看>>
网络最大流问题算法小结 [转]
查看>>
iOS推送消息报错误“Domain=NSCocoaErrorDomain Code=3000”的可能问题
查看>>
kvm-1
查看>>
leetcode 64. Minimum Path Sum
查看>>
textkit
查看>>
CentOS7+CDH5.14.0安装CDH错误排查: HiveServer2 该角色的进程已退出。该角色的预期状态为已启动...
查看>>
The Oregon Trail 俄勒冈之旅
查看>>
Excel VBA连接MySql 数据库获取数据
查看>>
Developing a Service Provider using Java API(Service Provider Interface)(转)
查看>>
oschina程序开发
查看>>
nested exception is java.lang.NoClassDefFoundError: net/sf/cglib/proxy/CallbackFilter
查看>>
“正在注册字体”问题解决
查看>>