10、springboot中的任务:异步任务、邮件发送、定时任务
SpringBoot任务:
一、异步任务:
1、定义service
1 2 3 4 5 6 7 8 9 10 11 12 13 | @Service @Async public class SyncService { public void demo(){ try { // 模拟网站延迟的情况 Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System. out .println( "程序正在处理~" ); } } |
2、编写controller,在请求中调用service
@Autowired SyncService syncService;
@RequestMapping("/test") public String test() { syncService.demo(); // 程序到这里会停止三秒 return "ok!"; }
3、测试
请求: localhost:8080/test 这里是模拟网站的延迟情况,如果延迟三秒钟,那么网站就会一直转圈圈,对于用户的体验很不好,所以:
在Service的类上或者方法中使用 @Async ,并在主入口(启动类)上使用 @EnableAsync 开启异步任务,网页会很快刷新、
二、邮件发送-SpringBootStrart方式
导入依赖:
<!--邮件发送--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> <version>2.2.6.RELEASE</version> </dependency> <!--thymeleaf模板引擎--> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring5</artifactId> </dependency> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-java8time</artifactId> </dependency>
在properties中配置自己的邮件信息:
1 spring.mail.username=1820712542@qq.com 2 spring.mail.password=ehhtnaacqihleaai 3 # 设置SMTP服务主机地址 4 spring.mail.host=smtp.qq.com 5 # QQ邮箱特别要设置的ssl加密规则 6 spring.mail.properties.mail.smtp.ssl.enable=true 7 # 默认编码(默认) 8 spring.mail.default-encoding=utf-8 9 # SMTP服务器使用的协议(默认) 10 # spring.mail.protocol=smtp
1、简单邮件发送
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | // 邮件发件人 @Resource JavaMailSenderImpl mailSender; @Test void test1() { SimpleMailMessage message = new SimpleMailMessage(); // 设置邮件发件人 message.setFrom( "1820712542@qq.com" ); // 设置邮件收件人 message.setTo( "zhang_zhixi@qq.com" ); // 设置邮件主题 message.setSubject( "这是一封来自未来的邮件" ); // 设置邮件发送的内容 message.setText( "小伙纸,你能成大事~" ); // 发送 mailSender.send(message); } |
2、复杂(附件)邮件发送
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | // 邮件发件人 @Resource JavaMailSenderImpl mailSender; @Test void test2() throws MessagingException, ParseException { // 复杂的邮件发送 MimeMessage message = mailSender.createMimeMessage(); // 组装(true:支持内联元素和附件*的多部分消息) MimeMessageHelper helper = new MimeMessageHelper(message, true , "UTF-8" ); // 设置邮件发件人 helper.setFrom( "1820712542@qq.com" ); // 设置邮件收件人 helper.setTo( new String[]{ "zhang_zhixi@qq.com" }); // 设置邮件发送时间 //helper.setSentDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2021-2-1 11:20:00")); // 设置邮件发送主题 helper.setSubject( "查收今天的第二封邮件~" ); // 正文 helper.setText( "<p style='color:red'>加油,干饭人!</p>" , true ); // 发送附件 helper.addAttachment( "demo.jpg" , new File( "C:\\Users\\华信彭于晏\\Pictures\\壁纸\\demo.jpg" )); // 发送 mailSender.send(message); } |
3、表单提交邮件,实现发送
表单信息:
1 <form th:action="@{/email}" method="post"> 2 发送方邮件地:<input type="email" th:name="email"><br> 3 收件方邮件地:<input type="email" th:name="toEmail"><br> 4 邮件主题:<input type="text" th:name="subject"><br> 5 邮件内容:<input type="text" th:name="text"><br> 6 <input type="submit" th:value="提交"> 7 </form>
controller发送请求:
1 @Controller 2 public class EmailSendController { 3 4 @RequestMapping("/") 5 public String toIndex() { 6 return "index"; 7 } 8 9 @Autowired 10 JavaMailSenderImpl mailSender; 11 12 @RequestMapping("/email") 13 @ResponseBody 14 public String toEmailSend(HttpServletRequest request) throws MessagingException { 15 String email = request.getParameter("email"); 16 System.out.println(email); 17 String toEmail = request.getParameter("toEmail"); 18 System.out.println(toEmail); 19 String subject = request.getParameter("subject"); 20 System.out.println(subject); 21 String text = request.getParameter("text"); 22 System.out.println(text); 23 24 // 复杂的邮件发送 25 MimeMessage message = mailSender.createMimeMessage(); 26 // 组装(true:支持内联元素和附件*的多部分消息) 27 MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); 28 29 // 设置邮件发件人 30 helper.setFrom(email); 31 // 设置邮件收件人 32 helper.setTo(toEmail); 33 // 设置邮件发送主题 34 helper.setSubject(subject); 35 // 正文 36 helper.setText("<p style='color:red'>" + text + "</p>", true); 37 38 // 设置邮件发送时间 39 //helper.setSentDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2021-2-1 11:20:00")); 40 // 发送附件 41 // helper.addAttachment("demo.jpg", new File("C:\\Users\\华信彭于晏\\Pictures\\壁纸\\demo.jpg")); 42 43 // 发送 44 mailSender.send(message); 45 return "邮件发送成功~可能有延迟,请稍后进行查看!"; 46 } 47 }
三、邮件发送-Hutool工具类
工具类参考地址:https://www.hutool.cn/docs/#/extra/%E9%82%AE%E4%BB%B6%E5%B7%A5%E5%85%B7-MailUtil
Gitee地址:https://gitee.com/zhang-zhixi/sprinboot-sendemail-hutool.git
1、导入依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <!--Hutool工具类--> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version> </dependency> <!--发送邮件--> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> |
2、编写email配置文件:resources/config/mail.setting
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # 邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀> host = smtp.qq.com # 邮件服务器的SMTP端口,可选,默认25,,SMTP服务器(端口465或587) port = 465 # 发件人(必须正确,否则发送失败) from = 志喜<zhang_zhixi@qq.com> # 用户名,默认为发件人邮箱前缀 # user = hutool # 密码(注意,某些邮箱需要为SMTP服务单独设置授权码,详情查看相关帮助) pass = cpkcejweige # 使用SSL安全连接 sslEnable = true # 指定实现javax.net.SocketFactory接口的类的名称,这个类将被用于创建SMTP的套接字 socketFactoryClass = javax.net.ssl.SSLSocketFactory # 如果设置为true,未能创建一个套接字使用指定的套接字工厂类将导致使用java.net.Socket创建的套接字类, 默认值为true socketFactoryFallback = true # 指定的端口连接到在使用指定的套接字工厂。如果没有设置,将使用默认端口456 socketFactoryPort = 465 # SMTP超时时长,单位毫秒,缺省值不超时 timeout = 0 # Socket连接超时值,单位毫秒,缺省值不超时 connectionTimeout = 0 |
3、编写Controller,发送POST请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | import cn.hutool.core.collection.CollUtil; import cn.hutool.extra.mail.MailUtil; import cn.hutool.log.Log; import cn.hutool.log.LogFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import java.util.ArrayList; /** * @ClassName EmaileController * @Author zhangzhixi * @Description * @Date 2022-3-4 23:13 * @Version 1.0 */ @Controller public class EmailController { /** * 推荐创建不可变静态类成员变量 */ private static final Log log = LogFactory. get (); /** * 发送邮件的方法 * * @param addresseeEmail 收件人的邮箱 * @param emailTitle 邮件标题 * @param emailContent 邮件内容 */ @PostMapping( "/sendEmail" ) public String senEmailTest(String addresseeEmail, String emailTitle, String emailContent) { log.info( "**************begin**************" ); // ArrayList<String> tos = CollUtil.newArrayList("1820712542@qq.com", "1477964823@qq.com", "1416318100@qq.com", "948513919@qq.com", "358944439@qq.com"); /*1、给谁发送邮件*/ ArrayList<String> tos = CollUtil.newArrayList(addresseeEmail); /*收件人、标题、正文、是否为HTML*/ MailUtil.send(tos, emailTitle, emailContent, false ); log.info( "**************end**************" ); return "success" ; } } |
4、前端页面:index.html与success.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/sendEmail" method="post"> <label> 收件人:<input type="text" name="addresseeEmail" required="required"/><br> </label> <label> 邮件标题:<input type="text" name="emailTitle" required="required"/><br> </label> <label> 邮件内容:<input type="text" name="emailContent"/><br> </label> <label> <input type="submit" value="发送" style="text-align: center"> </label> </form> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>邮件发送</title> </head> <body> <h1>发送成功!</h1> </body> </html>
5、测试发送
四、定时任务
1 2 3 4 | TaskScheduler //任务调度程序 TaskExecutor //任务执行者 @EnableScheduling //开启定时功能的注解,放在主入口 @Scheduled //什么时候执行 |
在方法上面加上@Scheduled(cron = "0 43 14 * * ?")
并加上相应的cron表达式即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 常用表达式例子 (1)0/2 * * * * ? 表示每2秒 执行任务 (1)0 0/2 * * * ? 表示每2分钟 执行任务 (1)0 0 2 1 * ? 表示在每月的1日的凌晨2点调整任务 (2)0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15执行作业 (3)0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作 (4)0 0 10,14,16 * * ? 每天上午10点,下午2点,4点 (5)0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时 (6)0 0 12 ? * WED 表示每个星期三中午12点 (7)0 0 12 * * ? 每天中午12点触发 (8)0 15 10 ? * * 每天上午10:15触发 (9)0 15 10 * * ? 每天上午10:15触发 (10)0 15 10 * * ? 每天上午10:15触发 (11)0 15 10 * * ? 2005 2005年的每天上午10:15触发 (12)0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发 (13)0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发 (14)0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 (15)0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发 (16)0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发 (17)0 15 10 ? * MON-FRI 周一至周五的上午10:15触发 (18)0 15 10 15 * ? 每月15日上午10:15触发 (19)0 15 10 L * ? 每月最后一日的上午10:15触发 (20)0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发 (21)0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发 (22)0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发 |
分类:
微服务框架
标签:
SpringBoot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话