任务
异步任务
小案例:我如何解决假如我访问了一个hello页面,页面调用的方法是睡眠3秒,再返回ok,那么再前端页面我就要等待空白页面3秒钟。如何解决?
Springboot中有一个注解叫@async
异步任务
我们要使用他需要在主启动类开启注解支持@enableasync
代码示例
@Service
public class AsyncService {
@Async
public void hello(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("您好");
}
}
这段代码会让执行方法的时候网页加载三秒。
控制层
@RestController
public class AsyncController {
@Autowired
AsyncService asyncService;
@RequestMapping("/hello")
public String hello(){
asyncService.hello();
return "ok";
}
}
我们访问hello这个请求,就会等待三秒,之后页面返回ok,
执行顺序是:
发起请求-----》执行方法—》等三秒—》返回ok
我们启动了异步任务,并且将等待方法上加入注解@Aynsc
再次启动的时候,顺序就变成了这样 发起请求-----》执行方法—》等三秒(同时)—》等待完毕
------------------------------------------------------》返回ok(同时)
定时任务
gogogo函数接口
第一个接口:TaskExecutor // 任务执行者
第二个接口:TaskScheduler// 任务调度者
注解
@EnableScheduling//开启定时任务功能注解
@Scheduled
使用定时任务首先我们要在主启动类上添加注解开启定时任务:
@EnableScheduling//开启定时任务功能注解
之后就可以通过@Scheduled
来设置cron表达式实现定时任务了
cron表达式
计划任务,是任务在约定的时间执行已经计划好的工作,这是表面的意思。在Linux中,我们经常用到 cron 服务器来完成这项工作。cron服务器可以根据配置文件约定的时间来执行特定的任务。
一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。
按顺序依次为
秒(0~59)
分钟(0~59)
小时(0~23)
天(月)(0~31,但是你需要考虑你月的天数)
月(0~11)
天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
年份(1970-2099)
字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /
PS:
- ?只能用在日期和星期,月上
- 在使用“L”参数时,不要指定列表或范围,因为这会导致问题
测试小例子:
@Service
public class ScheduledService {
//需求:在一定的时间执行这个方法 方法千百种
//cron表达式
@Scheduled(cron = "0 14 10 * * ?")
public void hello(){
System.out.println("你被执行了");
}
}
我想在每天的10点14分的时候,打印你被执行了,
邮件任务
首先要去qq邮箱开启服务
spring配置文件中的邮件配置
spring.mail.username=3132774018@qq.com
spring.mail.password=vymozuqhwxmadhae
spring.mail.host= smtp.qq.com
#开启加密验证
spring.mail.properties.mail.stmp.ssl.enable=true
spring中关于邮件的实现类:javaMailSenderImpl
他是一个bean所以我们可以拿来使用
@Autowired
javaMailSenderImpl sender;
简单的邮件发送
@SpringBootTest
class Spring8TestApplicationTests {
@Autowired
javaMailSenderImpl sender;
@Test
void contextLoads() {
//一个简单的邮件的发送
SimpleMailMessage message = new SimpleMailMessage();
//标题
message.setSubject("你好啊,hyc组内的成员,看到这条消息的时候 hyc还在为了大厂努力");
//内容
message.setText("冲进大厂没有什么是不可以的,好好努力,一切都在掌握之中");
//发送给谁
message.setTo("2549273958@qq.com");
//谁来发送
message.setFrom("3132774018@qq.com");
sender.send(message);
}
}
复杂邮件,带有附件,html,
我们这里使用sender.createMimeMessage
的方式来创建复杂的邮件发送对象
springboot给我们提供了一个帮助类,MimeMessageHelper
我们用这个helper对象来操作MImeMessage
,
就可以完成复杂邮件发送了
@Test
void contextLoads1() throws MessagingException {
//复杂的邮件的发送
MimeMessage mimeMessage = sender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
helper.setSubject("hyc-plus");
helper.setText("<p style='color:red'>你好</p>",true);
//附件
helper.addAttachment("1.jpg",new File("D:\\java工程师\\SpringBoot\\spring-8-test\\src\\main\\resources\\public\\1600837482167.jpg"));
//发送给谁
helper.setTo("3132774018@qq.com");
//谁来发送
helper.setFrom("3132774018@qq.com");
sender.send(mimeMessage);
}
邮件发送工具类
话不多说都在码里面了
MailsenderUtils:
@Component
public class MailsenderUtils {
@Autowired
private javaMailSenderImpl mailSender;
/**
*
* @param subject :邮件标题
* @param text 邮件内容
* @param html 是否开启html,
* @param to 发送给谁
* @param from 谁来发送
* @param filename 附件名字
* @param acc 附件路径
* @return
* 1 :发送成功
* -1:发送失败
*/
public int MailsenderbyHyc(String subject, String text, boolean html, String to, String from,String filename, File acc){
//复杂的邮件的发送
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = null;
try {
helper = new MimeMessageHelper(mimeMessage,true);
helper.setSubject(subject);
helper.setText(text,html);
//附件
helper.addAttachment(filename,acc);
//发送给谁
helper.setTo(to);
//谁来发送
helper.setFrom(from);
mailSender.send(mimeMessage);
return 1;
} catch (MessagingException e) {
e.printStackTrace();
return -1;
}
}
}