一、应用场景案例
假如你开发的网站刚上线,老板每天早晨都要问你今天网站注册了多少人,然后你就要去查看数据库,然后将数据通过邮箱发送给老板,久而久之,他天天问,你就很烦他了。 那么,你就可以使用定时任务每天定时(假设早上八点)把前24小时内网站注册的人数通过邮箱发送给老板。 能通过机器干的事情为什么要通过人呢?
二、分析
首先我们需要分步骤进行:
三、代码实现
启动类上添加注解 EnableScheduling
任务类
@Component
public class MyTask {
@Autowired
private ITaskService taskService;
public void regNumberTask() {
taskService.countRegNumber();
}
}
pom.xml添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
yml配置文件 username:为发送者的邮箱 password:注意不是密码 而是邮箱授权码 host:是通过哪个服务器发送 我们这里用的是163邮箱
– 这里为了方便这里 10点半定时发送邮件 cron表达式可以通过此网址查看 cron表达式生成器
@Service
@Slf4j
public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements ITaskService {
@Autowired
private JavaMailSender javaMailSender;
@Autowired
private UserMapper userMapper;
@Autowired
private TaskMapper taskMapper;
@Value("${spring.mail.username}")
private String from;
@Override
public String findCronById(Long id) {
Task task = taskMapper.selectById(id);
return task.getCron();
}
@Scheduled(cron = "0 30 10 * * ?")
@Override
public void countRegNumber() {
int count = 0;
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
List<User> users = userMapper.selectList(lambdaQueryWrapper);
for (User u :
users) {
Date regTime = u.getRegTime();
Calendar calendar = Calendar.getInstance();
calendar.setTime(regTime);
Calendar base = Calendar.getInstance();
base.setTime(new Date());
base.add(Calendar.DATE, -1);
if (calendar.compareTo(base) >= 0) {
count++;
}
}
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage);
try {
mimeMessageHelper.setSubject(new Date() + ":网站注册人数报告");
mimeMessageHelper.setText("公司今日网站注册人数为" + count + "人\n咋啥时候涨工资啊?");
mimeMessageHelper.setFrom(from);
mimeMessageHelper.setTo("1741733558@qq.com");
log.info("今日邮件已经发送~~~今日共注册:" + count + "人");
javaMailSender.send(mimeMessage);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
四、查看邮箱
数据库中今日注册人数是3人
!!!10点半到了!!!
邮箱就发送来了
五、总结
但是 这样也有缺点。有一天,你天天给老板发送邮箱,你的老板也烦你了。他不让天天发了,让你一个星期甚至一个月再给他发送数据,那么你就要停用服务器 去修改代码。 但是为了良好的体验,我们需要将cron表达式存到数据库中,然后动态获取值。 那么应该如何实现呢?
|