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表达式的规则,各位小伙伴可以去参看相关课程学习,略微复杂,而且格式不能乱设置,不是写个格式就能用的,写不好就会出现冲突问题。

总结

  1. springboot整合Quartz就是将Quartz对应的核心对象交给spring容器管理,包含两个对象,JobDetail和Trigger对象
  2. JobDetail对象描述的是工作的执行信息,需要绑定一个QuartzJobBean类型的对象
  3. 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	# 调度线程关闭前最大等待时间,确保最后一定关闭

总结

  1. spring task需要使用注解@EnableScheduling开启定时任务功能

  2. 为定时执行的的任务设置执行周期,描述方式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();
        
    

总结

  1. 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注解,可以对提交的事务进行回滚操作,防止脏数据写入。

目录

一、数据层解决方案之关系型数据库

1.1、内置数据源

1.2、默认的持久化技术JdbcTemplate

1.3、SpringBoot内置数据库 

二、数据层解决方案之NoSQL

 2.1、redis的下载与安装

2.2、SpringBoot整合redis

2.3、MongoDB简介及下载与安装

2.4、MongoDB的基本操作及springboot整合mongodb

2.5、ES简介及下载安装

2.6、ES相关操作 

2.7、SpringBoot整合ES


一、数据层解决方案之关系型数据库

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开发实用篇-整合第三方技术(任务邮件)的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot实用开发篇复习2

SpringBoot实用开发篇复习4(实用开发篇完)

SpringBoot实用开发篇复习4(实用开发篇完)

SpringBoot开发实用篇复习1

SpringBoot-实用开发篇

SpringBoot2:开发实用篇(黑马程序员P67~P142)