Springboot实战之定时任务
实战参考:https://www.cnblogs.com/mmzs/p/10161936.html
本次实战实现了基于properties配置文件实现定时任务配置。
总结几个点:
@Scheduled
中是可以读取properties文件中的参数的;- 定时配置类中,也能引入使用
@AutoWired
引入service bean。
实现步骤
1、yml配置文件中添加定时配置信息
开发的时候周期可以设的短一点
#设置发信的定时周期及其他信息
email:
remind:
task:
cron: 0/10 * * * * *
deptList: 21
admin: cowboy2014@qq.com
2、创建定时任务的配置类,并启用定时
import freemarker.template.Template;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
/**
* 定时统计成员的本周工时,对工时不满的人发送邮件提醒;
* 如有发送记录则抄送给管理员
* Created by dwlijx on 2020/4/6.
* connect to cowboy2014@qq.com
*/
@Configuration
@EnableScheduling
public class StaticScheduleTask {
@Autowired
TaskService taskService;
@Autowired
MailService mailService;
@Value("${email.remind.task.deptList}")
String deptList;
@Scheduled(cron = "${email.remind.task.cron}")
// @Value("${email.remind.task.cron}")
//或直接指定时间间隔,例如:5秒
//@Scheduled(fixedRate=5000)
private void configureTasks() {
HashMap<String, Object> params = new HashMap<>(4);
//1、check params:日期格式、部门格式
Date curDay = new Date();
SimpleDateFormat dfMonth = new SimpleDateFormat("yyyy-MM-dd");
params.put("startDate",dfMonth.format(curDay).substring(0,8)+"01");
params.put("endDate",dfMonth.format(curDay));
params.put("deptList", deptList.split(","));
List<HashMap<String,Object>> list = taskService.userEstimateStatistic(params);
//通过指定模板名获取FreeMarker模板实例
Template emailTpl = null;
try {
//获取邮件模板
emailTpl = FreeMarkerUtil.getTemplate("userEstimateEmail.ftl");
taskService.sendEmail(emailTpl,list);
} catch (Exception e) {
e.printStackTrace();
}
}
}
3、启动验证,就这么简单
Springboot启动时会打印定时任务加载的信息,如下:
[ restartedMain] uling.concurrent.ThreadPoolTaskScheduler[171] : Initializing ExecutorService 'taskScheduler'