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


    SpringBoot中的事务管理

    关键注解:

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

      @Transactional(isolation = Isolation.DEFAULT)

      @Transactional(propagation = Propagation.REQUIRED)

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

      @EnableTransactionManagement

    SpringBoot中的异步任务

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

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

    关键注解:

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

    演示:

    控制器:

    @RestController
    public class UserController {
    
        @Autowired
        IService service;
    
        @RequestMapping("/show")
        public String show(){
            service.add();
            return "success";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    业务Service:

    @Service
    public class ServiceImp implements IService {
    
        @Override
        @Async
        public void add() {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("==》批量新增");
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

    SpringBoot中的任务调度

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

    关键注解:

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

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

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

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

    实现演示:

    调度的任务:

    @Component
    public class Myjob {
        //秒 分 时 日 月 星期 年
        @Scheduled(cron = "* 39 16 * * *")
        public void show(){
            System.out.println("詹姆斯高斯林是厉害,但他进不了谷歌");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    启动类:

    添加注释@EnableScheduling

    @SpringBootApplication
    @EnableScheduling
    public class Springboot03CenterJobApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(Springboot03CenterJobApplication.class, args);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    SpringBoot整合Mail

    实现步骤:

    1. pom文件导入坐标

      
      <dependency>
          <groupId>org.springframework.bootgroupId>
          <artifactId>spring-boot-starter-mailartifactId>
      dependency>
      
      • 1
      • 2
      • 3
      • 4
      • 5

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

    2. yaml文件配置

      # 配置发送邮箱
      spring:
        mail:
          username: 130**********		# (邮箱账号,假如邮箱号是111@163.com,这里仅写111)
          password: B**************Z   # 这里的密码是邮箱的串码
          host: smtp.163.com
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      properties的配置如下

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

      @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("但是,高斯林再牛逼,他也进不了谷歌",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);
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
  • 相关阅读:
    Python数据攻略-SQL和Mongodb的CRUD方法汇总
    ThreadLocal线程变量
    【AI自媒体制作】【AI工具】Midjourney中文站
    【软件开发面经】大厂面试经验
    Flink的Checkpoint
    计算机论文从撰写到选刊,letpub看几区,论文开源和不开源,论文检索网站有哪些
    如何做好商品的库存管理?哪些指标是衡量库存的指标
    flinksql读oracle写入mysql
    Vue的render函数&修改默认配置
    python 的 import 机制
  • 原文地址:https://blog.csdn.net/HakerDONG/article/details/134301272