当前位置:网站首页>异步、邮件、定时三大任务
异步、邮件、定时三大任务
2022-07-03 00:46:00 【奔走的王木木Sir】
异步任务
创建
service
包,在其下创建类AsyncService
伪造正在处理数据,导致线程延时,模拟同步等待。
package com.hxl.service; import org.springframework.stereotype.Service; @Service public class AsyncService { public void hello(){ try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("数据处理中...."); } }
创建
controller
包,在其下创建类AsyncController
package com.hxl.controller; import com.hxl.service.AsyncService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class AsyncController { @Autowired AsyncService asyncService; @RequestMapping("/hello") public String hello(){ asyncService.hello(); return "没毛病了"; } }
访问测试
http://localhost:8080/hello
,此时可以发现网页等待3秒之后会出现没毛病了
的字样。这就是同步等待的情况。为了让用户体验好,先让用户得到消息,然后后台使用多线程的方式处理结果。我们需要加一个注解,这样,Springboot就会开一个线程池,进行调用。
//告诉Spring这是一个异步方法 @Async public void hello(){ try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("数据处理中...."); }
还需要在主启动程序上添加一个注解,让异步注解开启
@EnableAsync //开启异步注解功能 @SpringBootApplication public class SpringbootAsyncApplication { public static void main(String[] args) { SpringApplication.run(SpringbootAsyncApplication.class, args); } }
此时测试发现,网页会瞬间打开,但是后台数据会持续进行,直到数据处理结束。
邮件任务
引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
在其中可以看到相关的邮件发送依赖
查看
JavaMailSenderImpl
找到之后,看配置文件也就是properties
下的,我们可以看到相关的配置将QQ邮箱里面的服务打开,我们使用IMAP/SMTP服务
配置文件
[email protected] spring.mail.password=自己的QQ授权码 spring.mail.host=smtp.qq.com spring.mail.properties.mail.smtp.ssl.enable=true
测试
package com.hxl; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.MimeMessageHelper; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.File; @SpringBootTest class SpringbootAsyncApplicationTests { @Autowired JavaMailSenderImpl mailSender; @Test void contextLoads() { //一个简单的邮件 SimpleMailMessage message = new SimpleMailMessage(); message.setSubject("明天放假"); message.setText("直接10天小长假"); message.setTo("[email protected]"); message.setFrom("[email protected]"); mailSender.send(message); } @Test public void contextLoads2() throws MessagingException { //一个复杂的邮件 MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); helper.setSubject("明天放假"); helper.setText("<b style='color:red'>你想啥呢</b>",true); //发送附件 helper.addAttachment("1.jpg",new File("文件的路径")); helper.addAttachment("2.jpg",new File("比如:D:\\2.jpg")); helper.setTo("[email protected]"); helper.setFrom("[email protected]"); mailSender.send(mimeMessage); } }
然后就可以看到我们的邮件发送成功了。
定时任务
TaskExecutor接口
TaskScheduler接口
两个注解:
- @EnableScheduling //开启定时功能的注解,在主启动类中
- @Scheduled //什么时候执行
测试
创建
Service
包,创建类ScheduledService
package com.hxl.service; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; @Service public class ScheduledService { //在一个特定的时间执行这个方法 //cron表达式 //秒 分 时 日 月 周几 //下面这句话就是从星期一到星期日,的0秒 @Scheduled(cron = "0 * * * * 0-7") public void hello(){ System.out.println("hello,你被执行了"); } }
在主程序上增加@EnableScheduling 开启定时任务功能
package com.hxl; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; @EnableAsync //开启异步注解功能 @EnableScheduling //开启定时功能的注解 @SpringBootApplication public class SpringbootAsyncApplication { public static void main(String[] args) { SpringApplication.run(SpringbootAsyncApplication.class, args); } }
然后就可以了
cron表达式
cron:https://baike.baidu.com/item/cron/10952601?fr=aladdin
cron的生成:https://www.bejson.com/othertools/cron/
边栏推荐
- Rk3568 development board evaluation (II): development environment construction
- Solve the cache problem of reactnative using WebView
- 研发一款国产ARM智能边缘计算网关需要什么
- First hand evaluation of Reza electronics rz/g2l development board
- 1038 Recover the Smallest Number
- Vulkan performance and refinement
- [love crash] neglected details of gibaro
- Arduino开发之按键检测与正弦信号输出
- [AUTOSAR eight OS]
- 【AutoSAR 十一 通信相关机制】
猜你喜欢
Initial order of pointer (basic)
[AUTOSAR II appl overview]
Leetcode-849: maximum distance to the nearest person
excel表格计算时间日期的差值,并转化为分钟数
飞凌搭载TI AM62x的ARM核心板/开发板首发上市,亮相Embedded World 2022
[love crash] neglected details of gibaro
2022.2.14 resumption
【AutoSAR 一 概述】
无向图的割点
Leetcode-2280: represents the minimum number of line segments of a line graph
随机推荐
[daily training] 871 Minimum refueling times
Cordova plugin device obtains the device information plug-in, which causes Huawei to fail the audit
Vulkan并非“灵药“
excel表格计算时间日期的差值,并转化为分钟数
[AUTOSAR I overview]
Initial order of pointer (basic)
【AutoSAR 九 C/S原理架构】
Unity learns from spaceshooter to record the difference between fixedupdate and update in unity for the second time
FPGA - 7 Series FPGA internal structure clocking -04- multi area clock
1.11 - bus
Basic use of sringcloud & use of component Nacos
Meaning of Tencent cloud free SSL certificate extension file
【AutoSAR 一 概述】
Linear programming of mathematical modeling (including Matlab code)
Liad: the consumer end of micro LED products is first targeted at TVs above 100 inches. At this stage, it is still difficult to enter a smaller size
Hdu3507 (slope DP entry)
Vulkan practice first bullet
瑞萨RZ/G2L 处理器简介|框架图|功耗|原理图及硬件设计指南
图解网络:什么是虚拟路由器冗余协议 VRRP?
The difference between relational database and non relational database