SpringBoot--中间件技术-1:任务管理,异步任务,任务调度,发邮件Mail的实现,含代码

SpringBoot中的事务管理

关键注解:

  1. 设置事务(声明事务管理),写在业务层的方法上:

    @Transactional(isolation = Isolation.DEFAULT)

    @Transactional(propagation = Propagation.REQUIRED)

  2. 开启事务,设置在启动类上:

    @EnableTransactionManagement

SpringBoot中的异步任务

在项目开发中,绝大多数情况下都是通过同步方式处理业务逻辑的,但是比如批量处理数据,批量发送邮件,批量发送短信等操作 容易造成阻塞的情况,之前大部分都是使用多线程来完成此类任务而在Spring 3+之后,就已经内置了**@Async**注解来完美解决这个问题,从而提高效率。

异步完成的业务尽量选用结果不影响主业务的

关键注解:

  1. @Async:标识的方法会异步执行
  2. @EnableAsync:启动类上开启基于注解的异步任务

演示:

控制器:

java 复制代码
@RestController
public class UserController {

    @Autowired
    IService service;

    @RequestMapping("/show")
    public String show(){
        service.add();
        return "success";
    }
}

业务Service:

java 复制代码
@Service
public class ServiceImp implements IService {

    @Override
    @Async
    public void add() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("==》批量新增");
    }

}

业务的add方法被@Async声明为异步任务,访问localhost:8080/show之后三秒钟,控制台会打印内容==》批量新增

SpringBoot中的任务调度

在项目开发中,经常需要执行一些定时任务,比如 每月1号凌晨需要汇总上个月的数据分析报表; 每天凌晨分析前一天的日志信息等定时操作。Spring 为我们提供了异步执行定时任务调度的方式

关键注解:

  1. @Scheduled标识的方法会进行定时处理

    需要通过 cron 属性来指定 cron 表达式:秒 分 时 日 月 星期 年

    在线生成cron表达式 http://cron.qqe2.com/

  2. @EnableScheduling启动类上开启基于注解的定时任务

实现演示:

调度的任务:

java 复制代码
@Component
public class Myjob {
    //秒 分 时 日 月 星期 年
    @Scheduled(cron = "* 39 16 * * *")
    public void show(){
        System.out.println("詹姆斯高斯林是厉害,但他进不了谷歌");
    }
}

在下午cron表达式含义:16:39分的每一秒调度一次

启动类:

添加注释@EnableScheduling

java 复制代码
@SpringBootApplication
@EnableScheduling
public class Springboot03CenterJobApplication {

    public static void main(String[] args) {
        SpringApplication.run(Springboot03CenterJobApplication.class, args);
    }

}

SpringBoot整合Mail

实现步骤:

  1. pom文件导入坐标

    xml 复制代码
    <!--mail坐标-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>

    如果下载不下来选择SpringBoot版本2.7.2

  2. yaml文件配置

    yaml 复制代码
    # 配置发送邮箱
    spring:
      mail:
        username: 13050377215
        password: BVIPJEIUPEKLSPFZ   # 这里的密码是邮箱的串码
        host: smtp.163.com

    properties的配置如下

    properties 复制代码
    #配置邮箱信息
    spring.mail.username=
    spring.mail.password=
    #发送邮件服务器
    spring.mail.host=smtp.qq.com
    #ssl连接
    spring.mail.properties.smtp.ssl.enable=true
  3. 编写代码(演示在juint单元测试编写)

    java 复制代码
    @SpringBootTest
    class Springboot04CenterMailApplicationTests {
    
        @Autowired(required = false)
        private JavaMailSenderImpl javaMailSender;
    
        // 简单邮件
        @Test
        void show1() {
            //1.创建邮件对象
            SimpleMailMessage simpleMailMessage =   new SimpleMailMessage();
            //2.设置信息
            simpleMailMessage.setSubject("坚持自己,你就是下一个詹姆斯高斯林");
            simpleMailMessage.setText("但是,高斯林再牛逼,他也进不了谷歌");
            simpleMailMessage.setFrom("xxx@163.com");    //填写发送的邮箱
            simpleMailMessage.setTo("xxx@qq.com");		// 填写接受的邮箱
            //3.发送邮件
            javaMailSender.send(simpleMailMessage);
            System.out.println("发送成功~~~");
        }
    
        // 复杂邮件(发送的邮件带有样式,还能附加文件)
        @Test
        void show2() throws Exception{
            //1.创建邮件对象
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            //2.创建MimeMessageHelper
            MimeMessageHelper mimeMessageHelper =  new MimeMessageHelper(mimeMessage,true);
            //3.设置信息
            mimeMessageHelper.setSubject("坚持自己,你就是下一个高斯林");
            mimeMessageHelper.setText("但是,<span style='color:red'>高斯林再牛逼,他也进不了谷歌</span>",true);
            mimeMessageHelper.addAttachment("表情包.jpg",new File("C:\\Users\\ASUS\\Pictures\\表情包.jpg"));
            mimeMessageHelper.setFrom("xxx@163.com");		//填写发送的邮箱
            mimeMessageHelper.setTo("xxx@qq.com");	// 填写接受的邮箱
            //4.发送邮件
            javaMailSender.send(mimeMessage);
        }
    }
相关推荐
IT_陈寒15 分钟前
Vue 3.4性能优化实战:5个鲜为人知的Composition API技巧让打包体积减少40%
前端·人工智能·后端
大厂码农老A28 分钟前
我带的外包兄弟放弃大厂转正,薪资翻倍入职字节
java·后端·面试
摇滚侠37 分钟前
Spring Boot3零基础教程,生命周期监听,自定义监听器,笔记59
java·开发语言·spring boot·笔记
武子康1 小时前
大数据-136 - ClickHouse 集群 表引擎详解 选型实战:TinyLog/Log/StripeLog/Memory/Merge
大数据·分布式·后端
Somehow0071 小时前
从Binlog到消息队列:构建可靠的本地数据同步管道(macOS本地部署Canal & RocketMQ并打通全流程)
后端·架构
ai安歌1 小时前
【Rust编程:从新手到大师】Rust概述
开发语言·后端·rust
用户6120414922131 小时前
C语言做的智能家居控制模拟系统
c语言·后端·敏捷开发
豆苗学前端1 小时前
10分钟带你入门websocket,并实现一个在线多人聊天室
前端·javascript·后端
风霜不见闲沉月1 小时前
rust更新后编译的exe文件执行报错
开发语言·后端·rust
稚辉君.MCA_P8_Java1 小时前
Bash 括号:()、{}、[]、$()、$(() )、${}、[[]] 到底有什么区别?
开发语言·jvm·后端·容器·bash