QuartZ简介
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。Quartz是一个完全由java编写的开源作业调度框架。
核心API
执行流程
cron表达式
定时表达式共7部分组成,第7部分是可选项,定义时每部分使用空格分隔。
参考官方文档,也可以借助在线生成工具自动生成。
定时发送邮件
pom.xml中引入依赖
<!-- 引入Spring-support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 引入QuartZ ,也可以引入最新的2.2.3版本-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
<!-- JavaMail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
自定义工具类
/**
* 定时发送邮箱工具类
*/
public class MailJob {
//注入工单service
@Autowired
private WorkBillService workBillService;
private String username;
private String password;
private String smtpServer;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSmtpServer() {
return smtpServer;
}
public void setSmtpServer(String smtpServer) {
this.smtpServer = smtpServer;
}
/**
* 执行发送邮件任务
*/
public void execute(){
try {
//查询工单类型为新单的所有工单
List<WorkBill> workBillList = workBillService.findNewWorkBills();
if (null != workBillList && workBillList.size() > 0) {
final Properties mailProps = new Properties();
mailProps.put("mail.smtp.host", this.getSmtpServer());
mailProps.put("mail.smtp.auth", "true");
mailProps.put("mail.username", this.getUsername());
mailProps.put("mail.password", this.getPassword());
//构建授权信息,用于进行SMTP进行身份验证
Authenticator authenticator = new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
//用户名、密码
String userName = mailProps.getProperty("mail.username");
String password = mailProps.getProperty("mail.password");
return new PasswordAuthentication(userName, password);
}
};
//使用环境属性和授权信息,创建邮件会话
Session mailSession = Session.getInstance(mailProps, authenticator);
for (WorkBill workBill : workBillList) {
//创建邮件消息
MimeMessage message = new MimeMessage(mailSession);
//设置发件人
InternetAddress from = new InternetAddress(mailProps.getProperty("mail.username"));
message.setFrom(from);
//设置收件人
InternetAddress to = new InternetAddress(workBill.getStaff().getEmail());
message.setRecipient(RecipientType.TO, to);
//设置邮件标题
message.setSubject("系统邮件,新单通知");
//设置邮件的内容体
message.setContent(workBill.toString(),"text/html;charset=UTF-8");
//发送邮件
Transport.send(message);
}
}
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
配置任务类
<!-- 定义一个任务类 -->
<bean id="mailJobBean" class="cn.aric.bos.quartz.MailJob" >
<!-- 注入发邮件的任务类的参数 -->
<property name="username" value="ashuai@163.com" />
<property name="password" value="123" />
<property name="smtpServer" value="smtp.163.com" />
</bean>
在spring容器中配置任务描述类
<!-- 配置任务描述类,targetObject:任务目标类,targetMethod:任务目标方法 -->
<bean id="mailJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" >
<property name="targetObject" ref="mailJobBean" />
<property name="targetMethod" value="execute" />
</bean>
在spring容器中配置触发器
<!-- 配置触发器 -->
<bean id="mailTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="mailJobDetail" />
<!-- 表达式,设置每10秒执行1次 -->
<!-- <property name="cronExpression" value="0/10 * * * * ? *" /> -->
<!-- 表达式,每天中午12点和下午16点触发一次 -->
<property name="cronExpression" value="0 0 12,16 * * ? *" />
</bean>
在spring容器中配置调度容器工厂
<!-- QuartZ调度容器工厂 -->
<bean id="startQuartZ" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="mailTrigger" />
</list>
</property>
</bean>