一. 什么是Quartz?
简介:
- 定时任务调度的框架, 可以在框架中放入很多个应用程序(重点关注的是应用程序的编写)
使用场景:
- 闹钟
- 账单提醒
核心概念
- scheduler(SchedulerFactoryBean)是一个计划调度器容器,容器里面可以盛放众多的JobDetail和trigger,当容器启动后,里面的每个JobDetail都会根据trigger按部就班自动去执行。
- Trigger(CronTriggerFactoryBean)触发器代表一个调度参数的配置,什么时候去调。
JobDetail(MethodInvokingJobDetailFactoryBean)是一个可执行的工作,它本身可能是有状态的。
当JobDetail和Trigger在scheduler容器上注册后,形成了装配好的作业(JobDetail和Trigger所组成的一对儿),就可以伴随容器启动而调度执行了。
- scheduler是个容器,容器中有一个线程池,用来并行调度执行每个作业,这样可以提高容器效率。
二. 如何使用Quartz
1. 添加maven中的依赖
<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>
2.在spring的配置文件中配置quartz
<bean id="myjobs" class="quartz.MyJobs"></bean>
<!-- 注册jobDetail,通过反射调用自定义任务对象 -->
<bean id="myJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 目标对象 -->
<property name="targetObject" ref="myjobs"></property>
<property name="targetMethod" value="sayHello"></property>
</bean>
<!-- 配置触发器,指定任务触发时间 -->
<bean id="myTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!-- 注入jobDetail -->
<property name="jobDetail" ref="myJobDetail"></property>
<!-- 通过表达式指定配置任务触发时间 -->
<property name="cronExpression">
<!-- 每5秒钟执行一次任务 -->
<value>0/5 * * * * ? </value>
</property>
</bean>
<!-- 配置调度工厂对象,统一调用自定义任务 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- 配置触发器,可以配置多个 -->
<property name="triggers">
<list>
<ref bean="myTrigger" />
</list>
</property>
</bean>
3. 关于cron表达式
- 在线生成网站:http://cron.qqe2.com/
三. 使用Quartz框架实现定时发送邮件
- 需求:
- 通过quartz定时任务调度框架, 将查询所有工单数据, 通过邮件工具类发送给管理员
- 分析
- 创建一个jobs的类, 获取工单信息, 拼接发送邮件的字符串
- 实现:
package com.lyric.bos.jobs;
import java.util.List;
import javax.annotation.Resource;
import com.lyric.bos.dao.base.WorkBillDao;
import com.lyric.bos.domain.base.Courier;
import com.lyric.bos.domain.base.WorkBill;
import com.lyric.bos.utils.MailUtils;
public class WorkBillJobs {
@Resource
private WorkBillDao workBillDao;
//通过quartz定时任务调度框架, 将查询所有工单数据, 通过邮件工具类发送给管理员
public void sendMail(){
List<WorkBill> workBills = workBillDao.findAll();
if(workBills != null && workBills.size() > 0){
String content = "<table border='1px'><tr><td>工单id</td><td>工单类型 </td><td>取件状态 </td><td>快递员</td></tr>";
for (WorkBill workBill : workBills) {
Integer id = workBill.getId();
String type = workBill.getType();
String pickstate = workBill.getPickstate();
Courier courier = workBill.getCourier();
String cname = "";
if(courier != null){
cname = courier.getName();
}
content += "<tr><td>"+id+"</td><td>"+type+" </td><td>"+pickstate+" </td><td>"+cname+"</td></tr>";
}
content += "</table>";
String subject = "工单数据";
String to = "";
MailUtils.sendMail(subject, content, to);
System.out.println("success");
}
}
}
邮件工具类:
package com.lyric.bos.utils;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
public class MailUtils {
private static String smtp_host = "smtp.126.com";
private static String username = "";
private static String password = "";
private static String from = ""; // 使用当前账户
public static String activeUrl = "http://localhost:8890/bos_fore/customerAction_activeMail";
public static void sendMail(String subject, String content, String to) {
Properties props = new Properties();
props.setProperty("mail.smtp.host", smtp_host);
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.smtp.auth", "true");
Session session = Session.getInstance(props);
Message message = new MimeMessage(session);
try {
message.setFrom(new InternetAddress(from));
message.setRecipient(RecipientType.TO, new InternetAddress(to));
message.setSubject(subject);
message.setContent(content, "text/html;charset=utf-8");
Transport transport = session.getTransport();
transport.connect(smtp_host, username, password);
transport.sendMessage(message, message.getAllRecipients());
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("邮件发送失败...");
}
}
public static void main(String[] args) {
sendMail("测试邮件", "邮件的内容", "");
}
}