SpringBoot2开发实用篇-整合第三方技术(任务邮件)
Posted 亮点菌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot2开发实用篇-整合第三方技术(任务邮件)相关的知识,希望对你有一定的参考价值。
🍎个人主页:亮点菌的博客
🍊个人信条:点亮编程之路,做自己的亮点
🍓参加活动:CSDN话题挑战赛第2期
🍅参赛话题:学习笔记
🥭开发实用篇系列内容:
- 热部署
- 配置高级
- 测试
- 数据层解决方案
- 整合第三方技术
- 监控
文章目录
1、任务
springboot整合第三方技术第二部分我们来说说任务系统,其实这里说的任务系统指的是定时任务。定时任务是企业级开发中必不可少的组成部分,诸如长周期业务数据的计算,例如年度报表,诸如系统脏数据的处理,再比如系统性能监控报告,还有抢购类活动的商品上架,这些都离不开定时任务。本节将介绍两种不同的定时任务技术。
(1)Quartz
Quartz技术是一个比较成熟的定时任务框架,怎么说呢?有点繁琐,用过的都知道,配置略微复杂。springboot对其进行整合后,简化了一系列的配置,将很多配置采用默认设置,这样开发阶段就简化了很多。再学习springboot整合Quartz前先普及几个Quartz的概念。
- 工作(Job):用于定义具体执行的工作
- 工作明细(JobDetail):用于描述定时工作相关的信息
- 触发器(Trigger):描述了工作明细与调度器的对应关系
- 调度器(Scheduler):用于描述触发工作的执行规则,通常使用cron表达式定义规则
简单说就是你定时干什么事情,这就是工作,工作不可能就是一个简单的方法,还要设置一些明细信息。工作啥时候执行,设置一个调度器,可以简单理解成设置一个工作执行的时间。工作和调度都是独立定义的,它们两个怎么配合到一起呢?用触发器。完了,就这么多。下面开始springboot整合Quartz。
步骤①:导入springboot整合Quartz的starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
步骤②:定义任务Bean,按照Quartz的开发规范制作,继承QuartzJobBean
public class MyQuartz extends QuartzJobBean
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException
System.out.println("quartz task run...");
步骤③:创建Quartz配置类,定义工作明细(JobDetail)与触发器的(Trigger)bean
@Configuration
public class QuartzConfig
@Bean
public JobDetail printJobDetail()
//绑定具体的工作
return JobBuilder.newJob(MyQuartz.class).storeDurably().build();
@Bean
public Trigger printJobTrigger()
ScheduleBuilder schedBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
//绑定对应的工作明细
return TriggerBuilder.newTrigger().forJob(printJobDetail()).withSchedule(schedBuilder).build();
工作明细中要设置对应的具体工作,使用newJob()操作传入对应的工作任务类型即可。
触发器需要绑定任务,使用forJob()操作传入绑定的工作明细对象。此处可以为工作明细设置名称然后使用名称绑定,也可以直接调用对应方法绑定。触发器中最核心的规则是执行时间,此处使用调度器定义执行时间,执行时间描述方式使用的是cron表达式。有关cron表达式的规则,各位小伙伴可以去参看相关课程学习,略微复杂,而且格式不能乱设置,不是写个格式就能用的,写不好就会出现冲突问题。
总结
- springboot整合Quartz就是将Quartz对应的核心对象交给spring容器管理,包含两个对象,JobDetail和Trigger对象
- JobDetail对象描述的是工作的执行信息,需要绑定一个QuartzJobBean类型的对象
- Trigger对象定义了一个触发器,需要为其指定绑定的JobDetail是哪个,同时要设置执行周期调度器
思考
上面的操作看上去不多,但是Quartz将其中的对象划分粒度过细,导致开发的时候有点繁琐,spring针对上述规则进行了简化,开发了自己的任务管理组件——Task,如何用呢?咱们下节再说。
(2)Task
spring根据定时任务的特征,将定时任务的开发简化到了极致。怎么说呢?要做定时任务总要告诉容器有这功能吧,然后定时执行什么任务直接告诉对应的bean什么时间执行就行了,就这么简单,一起来看怎么做
步骤①:开启定时任务功能,在引导类上开启定时任务功能的开关,使用注解@EnableScheduling
@SpringBootApplication
//开启定时任务功能
@EnableScheduling
public class Springboot22TaskApplication
public static void main(String[] args)
SpringApplication.run(Springboot22TaskApplication.class, args);
步骤②:定义Bean,在对应要定时执行的操作上方,使用注解@Scheduled定义执行的时间,执行时间的描述方式还是cron表达式
@Component
public class MyBean
@Scheduled(cron = "0/1 * * * * ?")
public void print()
System.out.println(Thread.currentThread().getName()+" :spring task run...");
完事,这就完成了定时任务的配置。总体感觉其实什么东西都没少,只不过没有将所有的信息都抽取成bean,而是直接使用注解绑定定时执行任务的事情而已。
如何想对定时任务进行相关配置,可以通过配置文件进行
spring:
task:
scheduling:
pool:
size: 1 # 任务调度线程池大小 默认 1
thread-name-prefix: ssm_ # 调度线程名称前缀 默认 scheduling-
shutdown:
await-termination: false # 线程池关闭时等待所有任务完成
await-termination-period: 10s # 调度线程关闭前最大等待时间,确保最后一定关闭
总结
-
spring task需要使用注解@EnableScheduling开启定时任务功能
-
为定时执行的的任务设置执行周期,描述方式cron表达式
2、邮件
springboot整合第三方技术第三部分我们来说说邮件系统,发邮件是java程序的基本操作,springboot整合javamail其实就是简化开发。不熟悉邮件的小伙伴可以先学习完javamail的基础操作,再来看这一部分内容才能感触到springboot整合javamail究竟简化了哪些操作。简化的多码?其实不多,差别不大,只是还个格式而已。
学习邮件发送之前先了解3个概念,这些概念规范了邮件操作过程中的标准。
- SMTP(Simple Mail Transfer Protocol):简单邮件传输协议,用于发送电子邮件的传输协议
- POP3(Post Office Protocol - Version 3):用于接收电子邮件的标准协议
- IMAP(Internet Mail Access Protocol):互联网消息协议,是POP3的替代协议
简单说就是SMPT是发邮件的标准,POP3是收邮件的标准,IMAP是对POP3的升级。我们制作程序中操作邮件,通常是发邮件,所以SMTP是使用的重点,收邮件大部分都是通过邮件客户端完成,所以开发收邮件的代码极少。除非你要读取邮件内容,然后解析,做邮件功能的统一处理。例如HR的邮箱收到求职者的简历,可以读取后统一处理。但是为什么不制作独立的投递简历的系统呢?所以说,好奇怪的需求,因为要想收邮件就要规范发邮件的人的书写格式,这个未免有点强人所难,并且极易收到外部攻击,你不可能使用白名单来收邮件。如果能使用白名单来收邮件然后解析邮件,还不如开发个系统给白名单中的人专用呢,更安全,总之就是鸡肋了。下面就开始学习springboot如何整合javamail发送邮件。
(1)发送简单邮件
步骤①:导入springboot整合javamail的starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
步骤②:配置邮箱的登录信息
spring:
mail:
host: smtp.126.com
username: test@126.com
password: test
java程序仅用于发送邮件,邮件的功能还是邮件供应商提供的,所以这里是用别人的邮件服务,要配置对应信息。
host配置的是提供邮件服务的主机协议,当前程序仅用于发送邮件,因此配置的是smtp的协议。
password并不是邮箱账号的登录密码,是邮件供应商提供的一个加密后的密码,也是为了保障系统安全性。不然外部人员通过地址访问下载了配置文件,直接获取到了邮件密码就会有极大的安全隐患。有关该密码的获取每个邮件供应商提供的方式都不一样,此处略过。可以到邮件供应商的设置页面找POP3或IMAP这些关键词找到对应的获取位置。下例仅供参考:
步骤③:使用JavaMailSender接口发送邮件
@Service
public class SendMailServiceImpl implements SendMailService
@Autowired
private JavaMailSender javaMailSender;
//发送人
private String from = "test@qq.com";
//接收人
private String to = "test@126.com";
//标题
private String subject = "测试邮件";
//正文
private String context = "测试邮件正文内容";
@Override
public void sendMail()
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from+"(小甜甜)");
message.setTo(to);
message.setSubject(subject);
message.setText(context);
javaMailSender.send(message);
将发送邮件的必要信息(发件人、收件人、标题、正文)封装到SimpleMailMessage对象中,可以根据规则设置发送人昵称等。
(2)发送多组件邮件(附件、复杂正文)
发送简单邮件仅需要提供对应的4个基本信息就可以了,如果想发送复杂的邮件,需要更换邮件对象。使用MimeMessage可以发送特殊的邮件。
发送网页正文邮件
@Service
public class SendMailServiceImpl2 implements SendMailService
@Autowired
private JavaMailSender javaMailSender;
//发送人
private String from = "test@qq.com";
//接收人
private String to = "test@126.com";
//标题
private String subject = "测试邮件";
//正文
private String context = "<img src='ABC.JPG'/><a href='https://www.itcast.cn'>点开有惊喜</a>";
public void sendMail()
try
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message);
helper.setFrom(to+"(小甜甜)");
helper.setTo(from);
helper.setSubject(subject);
helper.setText(context,true); //此处设置正文支持html解析
javaMailSender.send(message);
catch (Exception e)
e.printStackTrace();
发送带有附件的邮件
@Service
public class SendMailServiceImpl2 implements SendMailService
@Autowired
private JavaMailSender javaMailSender;
//发送人
private String from = "test@qq.com";
//接收人
private String to = "test@126.com";
//标题
private String subject = "测试邮件";
//正文
private String context = "测试邮件正文";
public void sendMail()
try
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message,true); //此处设置支持附件
helper.setFrom(to+"(小甜甜)");
helper.setTo(from);
helper.setSubject(subject);
helper.setText(context);
//添加附件
File f1 = new File("springboot_23_mail-0.0.1-SNAPSHOT.jar");
File f2 = new File("resources\\\\logo.png");
helper.addAttachment(f1.getName(),f1);
helper.addAttachment("最靠谱的培训结构.png",f2);
javaMailSender.send(message);
catch (Exception e)
e.printStackTrace();
总结
- springboot整合javamail其实就是简化了发送邮件的客户端对象JavaMailSender的初始化过程,通过配置的形式加载信息简化开发过程
SpringBoot实用开发篇复习2
上次我们学完了实用开发篇1,这次我们继续学习实用开发篇2,该篇包含数据层解决方案、整合第三方技术和监控三大部分,这里面主要还是讨论数据层解决方案我们一起努力学习吧。
对于springboot的实用开发篇1,连接地址如下:springboot实用开发篇1
我们对实用开发篇1进行总结,主要包含三部分,热部署、配置高级、测试,具体如下:
1)手动启动热部署,配置devtools依赖坐标+构建项目,自动启动热部署,在设置->编辑器->自动构建项目,然后在任意开发界面使用组合快捷键ctrl+shift+alt+/ ,选择注册,勾选当app运行时候允许自动构建。
2)在配置文件中可以配置热部署的作用范围,可以在启动类关闭热部署。
3)@ConfigurationProperties注解可以实现bean的绑定,@EnableConfigurationProperties注解也可以进行bean绑定,要输入第三方bean的类名,同时在第三方bean上不需要再加@Component注解。
4)@ConfigurationProperties支持松散绑定,但是绑定的规范要求必须是小写字母、数字、下划线才行,不支持大写字母。
5)JDK8提供了常用的时间和空间单位。
6)对于bean的属性校验,首先需要添加JSR303坐标依赖和Hibernate校验坐标依赖,然后再bean类上加上@Validated注解,开启校验功能,最后对于具体要校验的属性设置具体的校验规则。
7)配置文件yaml支持进制转换,注意配置能写成字符串就不要写成数字。
8)在@SpringBootTest注解中使用propertis参数可以设置测试环境的临时专用属性,另外使用args参数也可以设置测试环境的临时专用属性,另外可以使用@Import注解加载当前测试类的专用配置。
9)在web环境中发送虚拟请求,首先要设置模拟端口,@AutoConfigureMockMvc开启虚拟MVC调用,然后注入调用对象,通过调用对象调用创建的虚拟请求,定义匹配器,通过匹配器定义预期值,将实际值和预期值进行对比 。
10)在测试类上加@Transactional注解,可以对提交的事务进行回滚操作,防止脏数据写入。
目录
2.4、MongoDB的基本操作及springboot整合mongodb
一、数据层解决方案之关系型数据库
1.1、内置数据源
对于先有的数据方案的技术选型如下,主要包含三个方面:数据源,持久化技术、数据库。
我们看一下使用Druid的数据源的配置格式,主要有如下两种。
除了Druid方式配置数据源外,SpringBoot提供了三种内置的数据源配置方式,一般如果不指定配置方式,就默认为HilariCP方式,具体如下:
1.2、默认的持久化技术JdbcTemplate
Spring提供了一个内置的持久化技术,当然用的比较少了,首先需要导入坐标依赖,然后就可以使用了。
当然,可以进行默认的持久化的方式进行配置,具体如下。
1.3、SpringBoot内置数据库
本次讲的内置数据库主要是H2数据库,首先需要配置h2数据库的相关参数,具体如下:
然后创建数据库,即在H2中创建数据库。
在创建数据库之前需要设置访问的数据源,要不然无法登录h2数据库。
H2数据库仅用于开发阶段,对于上线阶段必须把控制台功能关闭,否则会带来安全隐患问题。
二、数据层解决方案之NoSQL
2.1、redis的下载与安装
redis是一款以键值对存储结构的内存级NoSQL数据库,支持多种数据存储格式,支持持久化,支持集群。
首先下载redis的windows环境下的安装包:Releases · tporadowski/redis · GitHub
如下.msi文件,然后双击直接安装即可。
安装完成之后,到安装的位置打开redis文件夹可以发现,主要包含.conf结尾的配置文件和.exe结尾的可执行文件,具体如下:
现在命令行执行如下指令,然后开启一个新的命令窗口。
在新的命令窗口输入以下命令完成redis启动,如下:
2.2、SpringBoot整合redis
主要就分为3个步骤,第一步,pom.xml文件导入redis的坐标依赖,如下:
第2步,配置redis,一般来说,不写配置,也会默认配置的。
第3步,使用RedisTemplate提供的模板进行操作,该接口只能生成相应操作的对象,使用对象的相应方法完成操作。
具体如下,就是将RedisTemplate自动装配过来,然后调用相应的API生成相应的操作对象,根据对应的相应方法完成redis的相应操作,如下是基本键值对的写和读。
上述的方法进行操作是以序列化方式作为键值对和redis客户端不等效,若想和客户端操作等效,需要使用StringRedisTemplate。
2.3、MongoDB简介及下载与安装
MongoDB是一个开源、高性能、无模式的文档型数据库,它是NOSQL数据库产品中的一种,是最像关系型数据库的非关系数据库。一般来说,对于数据修改的频次高,需要很多的临时存储的情况,一般可以考虑使用MongoDB数据库。
首先去官网下载软件,官网地址如下:https://www.mongodb.com/try/download/community
然后双击安装就可以, 选择custom的,设置好安装的位置,一直next就可以了。
安装完成后,首先在data目录下创建一个db目录,如果没有data目录就创建一个。
然后再bin目录下输入cmd,进入命令行, 输入如下命令,启动服务端,并将数据存入data的db目录中。
当我去启动客户端的时候,发现不存在mongo.exe客户端,这是因为我用的是新版的mongodb,需要下载一个mongsh,然后将mongsh作为客户端进行连接服务器就可以了,如下。
当然可以在上述的命令行客户端直接操作mongodb,但是比较麻烦,像navicat管理mysql一样,mongoDB也有可视化管理工具,本文所用的可视化管理工具为Robo 3T,可以去官网下载,具体的下载安装过程参考这篇博文:MongoDB可视化管理工具Robo3T的下载与安装
安装完成后建立本地连接即可,如下所示。
连接成功,如下所示:
注意:其实不同的版本安装实际情况大同小异,如果安装失败,需要结合自己的版本完成相应的安装。
2.4、MongoDB的基本操作及springboot整合mongodb
mongodb中增删改查操作有很多,这里是简单的介绍一下基本的crud操作,具体的操作后面会单独学习。如下:insert添加操作,find查询操作,remove移除操作,update修改操作。
对于springboot整合mongodb的方法如下:
首先在pom.xml中导入monggodb的坐标依赖,如下:
需要怼客户端进行配置,连接到mongodb数据库,如下:
测试的话,是使用MongoTmplate对客服端进行增删改查操作。
2.5、ES简介及下载安装
ElasticSearch是一个分布式全文搜索引擎, 核心工作原理其实就是倒排索引,就是根据数据查ID,即为倒排,最后再根据ID查数据即可。
我们可以去ES的官网下载安装包,大概300多MB,官网地址:Download Elasticsearch | Elastic
下载完成安装包后即可进行安装,具体安装过程如下:
先对压缩包进行解压缩,具体包含如下文件:
直接双击bin文件夹下的elasticsearch.bat,然后等待运行结果就行,当然可能存在服务器启动,但是IP地址访问不了的情况,按照这个配置链接进行配置修改后就可以访问了,输入如下IP地址,可以看到如下的Json字符串则说明访问成功了。即ES安装成功。
2.6、ES相关操作
1)ES索引操作
通过postman模拟发送web请求就可以,发送名称为books的添加索引请求(PUT),其中books为索引请求。索引名称不允许重复。
发送查询索引名称为books的请求(GET),即索引查询,如下:
发送DELETE删除索引请求,如下:
因为索引没有指定规则,若想指定索引规则需要先下载分词器,将分词器解压放到elasticsearch的plugin文件夹内,然后在创建索引的时候为索引指定规则。
注意:ik分词器的版本号必须要和elasticsearch的版本号一致,否则会报错。
2)ES文档操作
在postman模拟web请求添加文档,如下所示,使用_doc请求添加文档。
使用_create也可以请求创建文档,不过需要设置具体的id,_doc可以设置id,也可以不设置,则自动默认生成id。
用_search可以查询全部,按内容查询search?q=具体的json格式的条件,按id进行查询的方法是GET查询的_doc/具体的id
上面是简单说了一下,下面具体总结一下ES创建文档的具体操作。
创建文档有三种操作,具体如下:
对于查询和删除文档,具体的格式如下:
对于文档修改和文档部分属性修改的具体方法如下:
2.7、SpringBoot整合ES
1)首先导入ES的坐标索引,我们用的是高级别的客户端,不需要在配置文件里面写uri,而是在代码中写uri,坐标配置如下。
2)创建客户端,并发送索引请求,如下:
3)对于创建的索引,需要把相应的分词之类的加上去,就是设置索引格式。
4)对于ES添加单个文档,首先需要查询到相应的实体对象,根据对象的id创建索引请求,设置请求格式,并发送添加文档的索引请求。
4)对于批量添加文档,就是使用了一个bulk()方法进行批处理,发送所有的添加文档请求。
5)ES按id查询文档,创建查询请求,客户端请求响应,将响应结果打印即可。
6)按条件查询文档,首先查询索引请求,设置查询条件,客户端发送查询请求,得到查询结果对象,从对象中依次取出Json数据并转换成book对象输出。
以上是关于SpringBoot2开发实用篇-整合第三方技术(任务邮件)的主要内容,如果未能解决你的问题,请参考以下文章