当前位置: 首页 > article >正文

进阶SpringBoot之异步任务、邮件任务和定时执行任务

SpringBooot 创建 Web 项目

异步任务:

service 包下创建 AsyncService 类

@Async 异步方法

Thread.sleep(3000)  停止三秒,捕获异常

package com.demo.task.service;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

//异步
@Service
public class AsyncService {

    //异步方法
    @Async
    public void hello(){
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            //throw new RuntimeException(e);
            e.printStackTrace();
        }
        System.out.println("数据正在处理");
    }
}

controller 包下创建 AsyncController 类

自动装配 AsyncService

方法里调用 AsyncService 类里的 hello 方法,停止三秒

package com.demo.task.controller;

import com.demo.task.service.AsyncService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AsyncController {

    @Autowired
    AsyncService asyncService;

    @RequestMapping("/hello")
    public String hello(){
        asyncService.hello();
        return "OK";
    }
}

主程序添加 @EnableAsync 开启异步注解功能

package com.demo.task;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

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

启动即可,记得地址加后缀

(加了注解后,实际上响应很快,页面很快出现,但程序执行过了三秒,就是输出的那句“数据正在处理”过了三秒出现)

邮件任务:

pom.xml 导入 spring-boot-starter-mail 的 jar 包

        <!-- 导入javax.mail -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

拿 qq 邮箱举例,点击设置 -> 账号,下滑找到 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 服务

点击管理服务,获取到授权码

application.properties 配置邮箱信息:

#邮箱账号
spring.mail.username=xx@qq.com
#邮箱密码:授权码
spring.mail.password=xx
spring.mail.host=smtp.qq.com
#开启加密验证
spring.mail.properties.mail.smtp.ssl.enable=true

测试类:

自动装配 JavaMailSenderImpl

new 一个 SimpleMailMessage,调用邮件相关信息

最后发送即可

package com.demo.task;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;

@SpringBootTest
class TaskApplicationTests {

    @Autowired
    JavaMailSenderImpl mailSender;

    @Test
    void contextLoads() {

        SimpleMailMessage message = new SimpleMailMessage();

        message.setSubject("邮件主题");
        message.setText("文本内容");

        message.setTo("xx@qq.com");
        message.setFrom("xx@qq.com");

        mailSender.send(message);
    }

}

上述只是简单的邮件,复杂邮件如下:

createMimeMessage -> new MimeMessageHelper -> ... -> send

package com.demo.task;

import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

import java.io.File;

@SpringBootTest
class TaskApplicationTests {

    @Autowired
    JavaMailSenderImpl mailSender;

    @Test
    void contextLoads2() throws MessagingException {

        MimeMessage mimeMessage = mailSender.createMimeMessage();

        //组装
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true,"utf-8");

        helper.setSubject("邮件主题");
        helper.setText("<p style='color:red'>文本内容</p>",true);

        //附件
        helper.addAttachment("1.jpg",new File("E:\\1.jpg"));

        helper.setTo("xx@qq.com");
        helper.setFrom("xx@qq.com");

        mailSender.send(mimeMessage);
    }

}

定时任务:

主程序类上添加一行 @EnableScheduling 开启定时功能

package com.demo.task;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableAsync //开启异步注解功能
@EnableScheduling //开启定时功能的注解
@SpringBootApplication
public class TaskApplication {
    public static void main(String[] args) {
        SpringApplication.run(TaskApplication.class, args);
    }
}

service 包下创建 ScheduledService 类:

方法上添加 @Scheduled 注解

package com.demo.task.service;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

@Service
public class ScheduledService {

    //定时:在一个特定的时间执行程序
    //core表达式:      秒 分 时 日 月 周几
    //                0/2 14 13 ? * 1-5   每个月周一到周五13点14分,每隔两秒执行一次
    @Scheduled(cron = "0 20 5 * * ?")  //每天5点20分0秒执行方法
    public void hello(){
        System.out.println("hello");
    }
}

查看 Scheduled 源码,提供了多种配置调度任务的方式

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
@Reflective
public @interface Scheduled {
    String CRON_DISABLED = "-";

    String cron() default "";

    String zone() default "";

    long fixedDelay() default -1L;

    String fixedDelayString() default "";

    long fixedRate() default -1L;

    String fixedRateString() default "";

    long initialDelay() default -1L;

    String initialDelayString() default "";

    TimeUnit timeUnit() default TimeUnit.MILLISECONDS;

    String scheduler() default "";
}

Cron 在线表达式生成器

可以实现在线生成表达式


http://www.kler.cn/a/308028.html

相关文章:

  • 相机光学(四十二)——sony的HDR技术
  • 【云计算解决方案面试整理】1-2云计算基础概念及云计算技术原理
  • 如何用C#和Aspose.PDF实现PDF转Word工具
  • 第74期 | GPTSecurity周报
  • 定时器(QTimer)与随机数生成器(QRandomGenerator)的应用实践——Qt(C++)
  • Linux探秘坊-------1.系统核心的低语:基础指令的奥秘解析(1)
  • 2024最新版MySQL详细学习教程
  • 算法两道题
  • PyCharm 安装
  • 【重学 MySQL】二十八、SQL99语法新特性之自然连接和 using 连接
  • 无人机在战争方面的应用!!!
  • 计算机毕业设计 基于协同过滤算法的个性化音乐推荐系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • unity3d入门教程七
  • 如何编写智能合约——基于长安链的Go语言的合约开发
  • 我想要抓取新加坡当地电商平台数据,使用什么地区的IP最合适
  • C++数据排序( 附源码 )
  • linux-硬件与设备管理-硬件信息查看
  • 计算机网络 第3章 数据链路层
  • JS - 获取剪切板内容 Clipboard API
  • 数据结构——栈和队列(队列的定义、顺序队列以及链式队列的基本操作)
  • opencv学习:图像直方图均衡化与对比度受限的自适应直方图均衡化及实验代码
  • 针对特定接口记录审核日志类的写入数据库的方法
  • raksmart的G口大流量服务器怎么样?
  • C++学习, 数据抽象
  • 物联网架构
  • 单片机带隙电压基准电路