一、什么是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:

 package com.quartz.mail;

 import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail; import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import java.util.ArrayList;
import java.util.Date;
import java.util.List; /**
* Created by xiwu.xxw on 2015/8/8.
*/
public class SimpleMail {
private SimpleEmail mail; /**
* 初始化一封邮件,暂不支持富媒体和附件
* @param receivers 邮件的接收者
* @param subject 邮件主题
* @param content 邮件内容
* @throws EmailException
* @throws AddressException
*/
public SimpleMail(List<String> receivers,String subject,String content) throws EmailException, AddressException {
mail=new SimpleEmail();
mail.setCharset("UTF-8");
List<InternetAddress> toList=new ArrayList<InternetAddress>();
for(String receiver: receivers){
toList.add(new InternetAddress(receiver));
}
mail.setTo(toList);
mail.setSubject(subject);
mail.setContent(content, "text/html;charset=utf-8");
} /**
* 发送邮件
* @param from 发送方邮件地址
* @param password 发送授权码
* @return
* @throws EmailException
*/
public String sendEmail(String from,String password) throws EmailException {
mail.setFrom(from);
//发送方邮箱权限认证,发送方邮箱须开通SMTP/POP/IMAP功能
mail.setAuthentication(from, password);
mail.setHostName("smtp." + from.split("@")[1]);
mail.setSentDate(new Date());
return mail.send();
}
}

MailJob:

 package com.quartz.job;

 import com.quartz.mail.SimpleMail;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean; import java.util.List; /**
* Created by xiwu.xxw on 2015/8/8.
*/
public class MailJob extends QuartzJobBean {
/**
* 执行Job任务
* @param context
* @throws JobExecutionException
*/
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
JobDataMap map=context.getJobDetail().getJobDataMap();
try {
SimpleMail mail=new SimpleMail((List<String>) map.get("receivers"),map.getString("subject"),map.getString("content"));
String result=mail.sendEmail(map.getString("from"), map.getString("password"));
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}

EmailScheduler:

 package com.quartz.scheduler;

 import org.quartz.SchedulerException;
import org.quartz.impl.StdScheduler;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.scheduling.quartz.CronTriggerBean;
import org.springframework.scheduling.quartz.JobDetailBean;
import org.springframework.scheduling.quartz.SimpleTriggerBean; import java.util.ArrayList;
import java.util.List; /**
* Created by xiwu.xxw on 2015/8/8.
*/
public class EMailScheduler {
public static void main(String[] args) throws SchedulerException {
//收件人
List<String> receivers=new ArrayList<String>();
receivers.add("xxxxx@qq.com");
receivers.add("xxxxx@126.com");
receivers.add("xxxxx@163.com"); ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
//邮件JobBean
JobDetailBean mailJob= (JobDetailBean) context.getBean("mailJob");
mailJob.setName("mailJob");
mailJob.setGroup("textEmail");
// 指明任务就算没有绑定Trigger仍保留在Quartz的JobStore中
//mailJob.setDurability(true);
mailJob.getJobDataMap().put("receivers",receivers);
mailJob.getJobDataMap().put("subject","基于Quartz实现邮件发送");
mailJob.getJobDataMap().put("content","本程序基于Quartz实现了定时群发邮件的功能,目前只支持文本发送!"); //发送邮件任务的SimpleTrigger触发器
SimpleTriggerBean simpleTrigger= (SimpleTriggerBean) context.getBean("SimpleTrigger"); //发送邮件任务调度器
StdScheduler scheduler= (StdScheduler) context.getBean("startQuartzTask");
//加入一个任务到Quartz框架中, 并与simpleTrigger关联
//Quartz会自动校正与设置simpleTrigger的JobName与JobGroup属性
scheduler.scheduleJob(mailJob,simpleTrigger); //发送邮件任务的CronTrigger触发器
CronTriggerBean croTrigger= (CronTriggerBean) context.getBean("CronTrigger");
//将发送邮件任务的触发器与邮件任务关联并注册到调度器
croTrigger.setJobName("mailJob");
croTrigger.setJobGroup("textEmail");
//因为任务已在上一条语句中已加入, 所以不能再使用scheduleJob(JobDetail, Trigger)
scheduler.scheduleJob(croTrigger); try {
//开始调度
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}

3.配置applicationContext.xml

 <?xml version="1.0" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
"> <bean id="dataEditor" class="org.springframework.beans.propertyeditors.CustomDateEditor">
<constructor-arg>
<bean class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd H:m:s"/>
</bean>
</constructor-arg>
<constructor-arg value="true"/>
</bean> <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="java.util.Date">
<ref local="dataEditor"/>
</entry>
</map>
</property>
</bean> <bean id="mailJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>com.quartz.job.MailJob</value>
</property>
<property name="jobDataAsMap">
<map>
<entry key="from">
<value>xxxxxxx@126.com</value>
</entry>
<entry key="password">
<value>uebbqvlizrywzhei</value>
</entry>
</map>
</property>
</bean> <bean id="SimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="startDelay">
<value>5000</value>
</property>
<property name="repeatInterval">
<value>120000</value>
</property>
<property name="repeatCount">
<value>3</value>
</property>
</bean> <bean id="CronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="cronExpression">
<value>0 25/2 17 8 8 ? 2015</value>
</property>
<property name="endTime" value="2015-08-08 17:30:00"/>
</bean> <bean id="startQuartzTask" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" />
</beans>

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实例的属性可以从当前任务传递到下一个任务,做串行。

基于Quartz实现简单的定时发送邮件的更多相关文章

  1. 控制台基于Quartz.Net组件实现定时任务调度(一)

    前言: 你曾经需要应用执行一个任务吗?比如现在有一个需求,需要每天在零点定时执行一些操作,那应该怎样操作呢? 这个时候,如果你和你的团队是用.NET编程的话,可以考虑使用Quartz.NET调度器.允 ...

  2. Window服务基于Quartz.Net组件实现定时任务调度(二)

    前言: 在上一章中,我们通过利用控制台实现定时任务调度,已经大致了解了如何基于Quartz.Net组件实现任务,至少包括三部分:job(作业),trigger(触发器),scheduler(调度器). ...

  3. spring利用javamail,quartz定时发送邮件 <转>

    原文地址:spring利用javamail,quartz定时发送邮件 <转>作者:物是人非 spring提供的定时发送邮件功能,下面是一个简单的例子以供大家参考,首先从spring配置文件 ...

  4. asp.net基于windows服务实现定时发送邮件的方法

    本文实例讲述了asp.net基于windows服务实现定时发送邮件的方法.分享给大家供大家参考,具体如下: //定义组件 private System.Timers.Timer time; publi ...

  5. Java 基于quartz实现定时 之二(XML方式配置)

    <!-- 在spring核心配置文件中进行如下配置 --> <!-- Spring基于quartz定时任务 --> <bean id="triggerByBea ...

  6. 十七、.net core(.NET 6)搭建基于Quartz组件的定时调度任务

     搭建基于Quartz组件的定时调度任务 先在package包项目下,添加Quartz定时器组件: 新建类库项目Wsk.Core.QuartzNet,并且引用包类库项目.然后新建一个中间调度类,叫Qu ...

  7. 一行代码完成定时任务调度,基于Quartz的UI可视化操作组件 GZY.Quartz.MUI

    前言 之前发布过第一个版本,有兴趣的可以去看看: NET Core 基于Quartz的UI可视化操作组件 GZY.Quartz.MUI 简介 GitHub开源地址:l2999019/GZY.Quart ...

  8. Java系列--第八篇 基于Maven的SSME之定时邮件发送

    关于ssme这个我的小示例项目,想做到麻雀虽小,五脏俱全,看到很多一些web都有定时发送邮件的功能,想我ssme也加入一下这种功能,经查询相关文档,发现spring本身自带了一个调度器quartz,下 ...

  9. LBPL--基于Asp.net、 quartz.net 快速开发定时服务的插件化项目

    LBPL 这一个基于Asp.net. quartz.net 快速开发定时服务的插件化项目 由于在实际项目开发中需要做定时服务的操作,大体上可以理解为:需要动态化监控定时任务的调度系统. 为了实现快速开 ...

随机推荐

  1. ASP.Net Core Razor 页面路由

    在服务器端 Web 应用程序框架中,其中非常重要的设计是开发人员如何将URL与服务器上的资源进行匹配,以便正确的处理请求.最简单的方法是将 URL 映射到磁盘上的物理文件,在 Razor 页面框架中, ...

  2. 斐波那契数列—Java

    斐波那契数列想必大家都知道吧,如果不知道的话,我就再啰嗦一遍, 斐波那契数列为:1 2 3 5 8 13 ...,也就是除了第一项和第二项为1以外,对于第N项,有f(N)=f(N-1)+f(N-2). ...

  3. 在shell脚本中使用alias

    Linux shell有交互式与非交互式两种工作模式.我们日常使用shell输入命令得到结果的方式是交互式的方式,而shell脚本使用的是非交互式方式.   shell提供了alias功能来简化我们的 ...

  4. 公司python入职培训流程

     时间分为4周,全部自学,仅提供大纲.适用于Web方向:1.Week1:读完<简明Python教程>,适应Python开发环境2.Week2:写个爬虫,需要深入了解re.urllib2.s ...

  5. (转载)Java变量作用域详解

    转载自http://www.cnblogs.com/AlanLee/p/6627949.html 大多数程序设计语言都提供了"作用域"(Scope)的概念. 对于在作用域里定义的名 ...

  6. Android studio 安装的安装一些问题

    在国内如何更新android sdk? 由于众所周知的某些原因,我们无法直接连接android sdk的更新服务更新sdk,所以可以通过国内的ftp站点把常用的sdk组件如android platfo ...

  7. jQuery框架Ajax常用选项

    json(JavaScript Object Notation):轻量级的数据交换(交换的数据转换成与平台无关的)格式 java对象转换成json字符串:使用ObjectMapper类的writeVa ...

  8. 线上Java程序导致服务器CPU占用率过高的问题排除过程

    博文转至:http://www.jianshu.com/p/3667157d63bb,博文更好效果看原版,转本博文的目的就算是个书签吧,需要时候可以定位原文学习 1.故障现象 客服同事反馈平台系统运行 ...

  9. ASP.NET Core 运行原理解剖[5]:Authentication

    在现代应用程序中,认证已不再是简单的将用户凭证保存在浏览器中,而要适应多种场景,如App,WebAPI,第三方登录等等.在 ASP.NET 4.x 时代的Windows认证和Forms认证已无法满足现 ...

  10. ES6的语法

    一,定义变量let(类似var) 在js一直有一个bug是var: 1.var 声明的变量会有变量提升 console.log(name); //jhon var name = 'jhon'; 2.v ...