定时任务是每个业务常见的需求,比如每分钟扫描超时支付的订单,每小时清理一次数据库历史数据,每天统计前一天的数据并生成报表等等。
随着微服务和云计算的兴起,定时任务技术也是发展迅速,不仅能做单机的定时任务,而且在分布式系统下应用也很广泛,成为了业务做兜底、数据处理的第一选择。
定时任务现在在业务数据处理中的比重越来越重,如果业务数据处理失败了,需要及时通知到业务方,确保了服务的可靠性和稳定性。同时,好的定时任务通知系统,还能分析任务失败的原因(比如堆栈信息)并通知给业务方,帮助用户快速定位问题。

根据通知的类型,大概可以有以下几类:
如果是自研的定时任务系统,或者使用了开源定时任务框架(比如Quartz),想要增加报警通知能力,我们可以采取什么方案呢?从实时性角度来看,短信和电话通知实时性最高,但是这两种方案需要比较大的成本,比如短信通知需要短信平台。如果没有短信平台,我们也可以采用邮件和webhook通知。
每个邮件服务器都由SMTP服务器和POP3服务器构成,其中SMTP服务器负责发邮件的请求,而POP3负责收邮件的请求。通过SMTP与POP3即可实现邮件的收发。

邮件发送原理图
以网易163邮件为例,在发送方邮箱设置里,开启POP3/SMTP服务

- import org.junit.Test;
- import javax.mail.Message;
- import javax.mail.Session;
- import javax.mail.Transport;
- import javax.mail.internet.InternetAddress;
- import javax.mail.internet.MimeMessage;
- import java.io.PrintWriter;
- import java.io.StringWriter;
- import java.util.Properties;
- public class SendMailDemo {
- public static void main(String[] args) throws Exception {
- Properties prop = new Properties();
- prop.setProperty("mail.host","smtp.163.com");//设置发送方邮箱服务器
- prop.setProperty("mail.transport.protocol","smtp");//邮件发送协议
- prop.setProperty("mail.smtp.auth","true");//需要验证用户名密码
- Session session = Session.getDefaultInstance(prop);
- Transport ts = session.getTransport();
- String mailUser = "xxx@163.com"; //邮箱的账号
- String mailPasswd = "123456789"; //邮箱的密码
- ts.connect("smtp.163.com", mailUser, mailPasswd);
- MimeMessage message = new MimeMessage(session);
- message.setFrom(new InternetAddress(mailUser));