案例码云仓库地址: https://gitee.com/mootong_top/auto_message_info
因为疫情防控需要,学校开设了健康信息填报平台,要求所有在校学生每天定时上传体温等健康信息。作为班级负责人,每天需要提醒同学填报信息,晚上还需要对未填报的同学逐一通知,工作繁琐而又必要,却又总因为各种事情会耽误,有了痛点就有了需求。
- 1.0版方案:每天闹钟提醒自己,然后再提醒别人。(关闹钟还不是分分钟的事情)
- 2.0版方案:启用QQ群机器人,然而必须自己用QQ才能发送,作为好几年的TIM用户,QQ是很难回去了,而且下午还是得自己通知没填的人
- 3.0版方案:写个定时任务,没天定时提醒,不用人工参与。下午把未填报学生的名单用Excel导出,上传文件后自动提醒。
然后周末就搞了个3.0版的解决方案,基本需求得到满足了,下面简单记录一下。
1 存在的问题
首先说存在的问题,问题主要是提醒手段方面的问题:
-
1.比较理想的手段是采用短信提醒,然而作为个人用户在各个短信服务商那里都申请不到适用的短信签名和模板;
-
2.QQ邮箱在批量发送邮件的过程中会出现javax.mail.AuthenticationFailedException:535 authentication failed的错误,大概发送10封左右就会出现这个错误,尝试了一下,没解决掉;换成163邮箱,每天上午的50封左右的邮件是能正常发送的,到了下午的时候部分会报com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 163的错误,大意是被标识为垃圾邮件了,另外邮箱会有少部分的退信。
总得来说,要想能很好的达到提醒效果,最好是能拿到由学院或学校申请的短信验证签名和模板,当然这大概率不现实,所以只能将就着用吧,起码上午的自动提醒完美实现了。
2 数据库
秉持这一切从简的原则,就用了两张表,一张定时任务定义表,一张学生信息表。定时任务定义表中存放了定时任务执行类的类名(继承了Quartz中Job接口类)、任务执行计划(Cron表达式),系统启动时自动读取数据配置任务;学生表中存放了学生的学号,姓名,邮箱,班级等基本信息,另外设置了上午是否提醒,下午是否提醒以及当天是否已经填报等三个状态标识字段。建表语句如下:
create table task_definit (
task_code varchar (10),
name varchar (50),
cron varchar (50)
);
create table student (
student_number varchar (20),
name varchar (10),
grade varchar (20),
mail varchar (30),
phone varchar (20),
info_morning tinyint (1),
info_afternoon tinyint (1),
is_registed tinyint (1)
);
3 定时任务
- 3.1 定时提醒任务
//上午提示任务
public class MorningInfoMessageJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) {
System.out.println("上午提醒定时任务执行!");
Set<String> students = DomainConfig.student.keySet();
Iterator<String> iterator = students.iterator();
while (iterator.hasNext()) {
Student student = DomainConfig.student.get(iterator.next());
if (student.getInfoMorning() == true && student.getRegisted() == false) {
MailUtil.autoInfoMail(student);
}
}
}
}
//下午提示任务
public class AfternoonInfoMessageJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) {
System.out.println("下午提醒定时任务执行!");
Set<String> students = DomainConfig.student.keySet();
Iterator<String> iterator = students.iterator();
while (iterator.hasNext()) {
Student student =