SpringBoot-11 扩展功能

异步

同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。

异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。

但是在某些时刻,线程进行休眠,如果不进行异步编程,你就要等待休眠时间过去,程序才可以进行。

Service层

@Service
public class AsynService {
// 要告诉Spring这是一个异步方法
@Async
public void hello() {
try {
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.printf("数据正在处理。。。。");
}
}

controller层

@RestController
public class AsynController {
@Autowired
AsynService asynService;
@RequestMapping("/hello")
public String hello(){
asynService.hello(); //停止3s
return "OK";
}
}

启动器

@SpringBootApplication
@EnableAsync // 开启异步功能
public class SpringBoot10AsynApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBoot10AsynApplication.class, args);
}
}

这个时候,不会等待休眠结束才输出语句。

邮箱

导入依赖

<!--        邮件       -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

Test类测试代码

1.开启自己邮件smtp

打开自己的邮箱,设置中开启:

开启之后,经过验证,会出现授权码;授权码填入后面的密码处:

2.配置文件

#qq邮箱就.qq ; 163邮箱就.163
spring.mail.host=smtp.qq.com
spring.mail.username=1437101473@qq.com
#这里就是授权码
spring.mail.password=owahyrpgzrtfbaca
spring.mail.default-encoding=utf-8
# 开启加密验证
spring.mail.properties.mail.smtp.ssl.enable=true

3.注入邮件类

@Autowired
JavaMailSenderImpl mailSender;

问题:

JavaMailSenderImpl 注入报错。

解决方法:

一、

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<scope>test</scope>
</dependency>

该依赖中存在 test,删除即可。

二、

配置文件中没加入 host

spring.mail.host=xxxx

4.简单邮件发送

@Test
void contextLoads() {
SimpleMailMessage message = new SimpleMailMessage();
message.setSubject("这是一个Test"); // 标题
message.setText("这里是正文"); // 正文
message.setTo("1437101473@qq.com"); // 发送给
message.setFrom("1437101473@qq.com"); // 发送来自 mailSender.send(message);
}

5.复杂邮件发送

@Test
void contextLoads1() throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
//组装
helper.setSubject("这是一个复杂邮件Test");
helper.setText("<h1>这里是正文</h1>", true); // 正文
//附件
helper.addAttachment("1.jpg", new File("D:\\桌面\\1.jpg")); helper.setTo("1437101473@qq.com"); // 发送给
helper.setFrom("1437101473@qq.com"); // 发送来自 mailSender.send(message);
}

定时

可以让一个操作进行定时开始,或者循环执行

1.启动器开启定时功能

@SpringBootApplication
@EnableScheduling //开启定时功能
public class SpringBoot10AsynApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBoot10AsynApplication.class, args);
}
}

2.编写功能类

@Service
public class ScheduledService {
// cron表达式
// 秒 分 时 日 月 周几
@Scheduled(cron = "0/2 * * * * ?")
public void hello() {
System.out.println("hello---");
}
}

3.扩展

该功能使用的是cron表达式

当然,可以直接使用生成器:https://cron.qqe2.com/

cron表达式格式:

{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}

例 : "0 0 12 ? * WED" -------> 在每星期三下午12:00 执行(年份通常 省略)

位置 时间域名 允许值 允许的特殊字符
1 0-59 , - * /
2 分钟 0-59 , - * /
3 小时 0-23 , - * /
4 日期 1-31 , - * / ? L W C
5 月份 1-12 , - * /
6 星期 1-7 , - * / ? L C #
7 年(可选) 空值 1970-2099 , - * /

Cron表达式的时间字段除允许设置数值之外,还可以使用一些特殊的字符,提供列表、范围、通配符等功能:如下:

星号():可用在所有的字段中,表示对应时间域的每一个时刻。如:在分钟字段时,表示“每分钟”。

问号(?):该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,想当于占位符。

减号(-):表达一个范围。如在小时字断中使用“10-12”,则表示从10点到12点,即10,11,12.

逗号(,):表示一个列值表。如在星期字段中使用“MON,WED,FRI”,则表示星期一、星期三和星期五。

斜杠(/):x/y表达一个等步长序列,x为起始值,y为增量步长值。如:在分钟字段中使用0/15,则表示0,15,30,和45秒;5/15在分钟字段中表示5,20,35和50分钟。用户也可以使用*/y,它等同于0/y。

L:该字段只在日期和星期字段中使用,代表“Last”的意思,但它在两个字段中的意思不同。如果L用在日期字段中,则表示这个月份的最后一天;如果L用在星期字段中,则表示星期六,等同于7(这里的规则是星期六为一星期的最后一天)。如果L出现在星期字段中,而且前面还有一个数字N,则表示“这个月的最后一个星期N”。例如,6L表示该月的最后一个星期五。

W:该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日。如:15W表示离该月15日最近的工作日,如果15日是星期六,则匹配14日星期五;如果15日是星期日,则匹配16日星期一;如果15日是星期二,那结果就是15日星期二。但必须注意到关联的匹配日期不能跨月,如用户指定1W,如果1日是星期六,结果匹配的是3日星期一,而非上个月最后一天。W字符只能指定单一日期,而不能指定日期范围。

LW组合:在日期字段中可以组合使用LW,它的意思是当月的最后一个工作日。

号:该字符只能在星期字段中使用,表示当月的某个工作日。如6#3表示当月的第三个星期五(6表示星期五,#3表示当前的第三个),而4#5表示当月的第五个星期三。假设当月没有第五个星期三,则忽略不触发。

C:该字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中的所有日期。例如,5C在日期字段中相当于5日以后的那一天,1C在星期字段中相当于星期日后的第一天。

常用的Cron表达式

“0 0 12 * * ?” 每天12:00运行

“0 15 10 ?* *” 每天10:15运行

“0 15 10 * * ?” 每天10:15运行

“0 15 10 * * ? ” 每天10:15运行

“0 15 10 * * ? 2008” 在2008年的每天10:15运行

“0 * 14 * * ?” 每天14点到15点每分钟运行一次,开始于14:00,结束于14:59

“0 0/5 14 * * ?” 每天14点到15点每5分钟运行一次,开始于14:00,结束于14:55

“0 0/5 14,18 * * ?” 每天14点到15点每5分钟运行一次,此外每天18点到19点每5分钟也运行一次

“0 0-5 14 * * ?” 每天14:00到14:05,每分钟运行一次

“0 10,44 14 ? 3 WED” 三月每周三的14:10和14:44,运行一次

“0 15 10 ?
MON-FRI” 每周一、二、三、四、五的10:15运行

“0 15 10 15 * ?” 每月的15日的10:15运行

“0 15 10 L * ?” 每月最后一天的10:15运行

“0 15 10 ? * 6L” 每月最后一个星期五的10:15运行

“0 15 10 ? * 6L 2014-2016” 2014年、2015年、2016年每月最后一个星期五的10:15运行

“0 15 10 ? * 6#3” 每月第三个星期五的10:15运行

个人博客为:

MoYu's HomePage

MoYu's Gitee Blog

SpringBoot-11 扩展功能的更多相关文章

  1. java框架之SpringBoot(11)-缓存抽象及整合Redis

    Spring缓存抽象 介绍 Spring 从 3.1 版本开始定义了 org.springframework.cache.Cache 和 org.springframework.cache.Cache ...

  2. springBoot(11)---整合Active消息队列

    Springboot整合Active消息队列 简单理解: Active是Apache公司旗下的一个消息总线,ActiveMQ是一个开源兼容Java Message Service(JMS) 面向消息的 ...

  3. SpringBoot(11) SpringBoot自定义拦截器

    自定义拦截器共两步:第一:注册.第二:定义拦截器. 一.注册 @Configuration 继承WebMvcConfigurationAdapter(SpringBoot2.X之前旧版本) 旧版本代码 ...

  4. 【springboot】知识点总结

    [springboot 基础编] 01.SpringBoot>01 - 第一个应用–HelloWorld 02.SpringBoot>02 - 整合 MyBatis 03.SpringBo ...

  5. Spring Boot整合Dubbo使用及开发笔记

    一.概述: Spring Dubbo是我开发的一个基于spring-boot和dubbo,目的是使用Spring boot的风格来使用dubbo.(即可以了解Spring boot的启动过程又可以学习 ...

  6. opencart 3.0 版本数据库数据表字典(详细篇)

    1.下文是opencart3.0版本数据库数据表字典,表字段与功能的介绍都比较详细.             数据表 address :地址表,会员在结账时储存的账单地址或者配送地址(这个与区域配送方 ...

  7. 地区sql

    /*Navicat MySQL Data Transfer Source Server : localhostSource Server Version : 50136Source Host : lo ...

  8. SpringBoot学习笔记(11):使用WebSocket构建交互式Web应用程序

    SpringBoot学习笔记(11):使用WebSocket构建交互式Web应用程序 快速开始 本指南将引导您完成创建“hello world”应用程序的过程,该应用程序在浏览器和服务器之间来回发送消 ...

  9. springboot实战(汪云飞)学习-1-1

    java EE开发的颠覆者 spring boot 实战 随书学习-1 1.学习案例都是maven项目,首先要在eclipse 中配置 maven,主要修改maven的配置文件:配置文件下载链接: h ...

  10. 【SpringBoot】11.Springboot整合SpringMVC+Mybatis(上)

    Springboot整合SpringMVC+Mybatis 需求分析:通过使用Springboot+SpringMVC+Mybatis 整合实现一个对数据库表users表的CRUD操作. 1.创建项目 ...

随机推荐

  1. 树莓派 4B 入门教程

    树莓派 4B 入门教程 Raspberry Pi, Raspberry Pi 3B, Raspberry Pi 4B 树莓派 4B 入门手册 PDF Raspberry Pi Beginners Gu ...

  2. tree traversal

    tree traversal tree 遍历 中序,顺序,左中右 先序,先父节点,中左右 后序,先子节点,左右中 二叉搜索树 "use strict"; /** * * @auth ...

  3. windows driver 简单的驱动和通信

    sysmain.c #pragma once #pragma warning(disable: 4100) #include <ntifs.h> #include <ntddk.h& ...

  4. perl 打印简单的help文档

    更多 PrintHelp.pm #!/usr/bin/perl package PrintHelp; require Exporter; use v5.26; use strict; use utf8 ...

  5. NGK每日快讯2021.1.29日NGK公链第87期官方快讯!

  6. “NGK公链+5G”——打造智慧城市

    智慧城市目前被全球各国当成城市建设的重点,旨在城市在智能化的同时,还能给民众带来幸福感和安全感.随着5G的到来,城市智能化又到了一个新的高度.比如无人驾驶.无人机等方面将会产生质的变化,因为5G的加入 ...

  7. python 相对路径和绝对路径的区别

    一,Python中获得当前目录和上级目录 获取当前文件的路径: from os import path d = path.dirname(__file__) #返回当前文件所在的目录 # __file ...

  8. SpringCloud之服务调用

    1.Ribbon 1.1负载均衡LB 全称Load Balance,将用户的请求平摊到多个服务器上,从而达到系统的HA.集中式LB:在服务消费者和服务提供者之间使用独立的LB设施,如硬件,由该设施负责 ...

  9. TcaplusDB服务体系揭秘

    导言 TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码完全自研.具备缓存+落地融合架构.PB级存储.毫秒级时延.无损水平扩展和复杂数据结构等特性.同时具备丰富的生态.便捷的迁移. ...

  10. 硬件交互 snmp 使用

    # *********************************snmp使用******************************************** # coding=utf-8 ...