SpringBoot-asincrónico, sincronización, tareas de correo

prefacio

  En nuestro trabajo, a menudo se utilizan tareas de procesamiento asíncrono. Por ejemplo, cuando enviamos correos electrónicos en el sitio web, el fondo enviará correos electrónicos. En este momento, la recepción hará que la respuesta permanezca estática. La respuesta no será exitosa hasta que se envía el correo electrónico, por lo que generalmente estas tareas se manejan de manera multiproceso. También hay algunas tareas programadas, como la necesidad de analizar la información de registro del día anterior cada mañana. También está el envío de correos electrónicos.¿El antecesor de WeChat es también un servicio de correo electrónico? ¿Cómo se logran estas cosas? De hecho, SpringBoot nos brinda el soporte correspondiente. Para nosotros es muy sencillo usarlo. ¡Solo necesitamos habilitar algunos soportes de anotación y configurar algunos archivos de configuración! Entonces echemos un vistazo ~

tarea asincrónica

1. Crea un paquete de servicios

2. Crea una clase AsyncService

  El procesamiento asincrónico sigue siendo muy común. Por ejemplo, cuando enviamos correos electrónicos en el sitio web, el fondo enviará los correos electrónicos. En este momento, la recepción hará que la respuesta no se mueva. La respuesta no tendrá éxito hasta que se envíe el correo electrónico. , por lo que generalmente usamos métodos de subprocesos múltiples para manejar estas tareas.

  Escriba un método que finja estar procesando datos, use subprocesos para establecer algunos retrasos y simule esperas sincrónicas;

@Service
public class AsyncService {
    
    

   public void hello(){
    
    
       try {
    
    
           Thread.sleep(3000);
      } catch (InterruptedException e) {
    
    
           e.printStackTrace();
      }
       System.out.println("业务进行中....");
  }
}

3. Escriba el paquete del controlador

4. Escriba la clase AsyncController

Escribamos un controlador para probarlo

@RestController
public class AsyncController {
    
    

   @Autowired
   AsyncService asyncService;

   @GetMapping("/hello")
   public String hello(){
    
    
       asyncService.hello();
       return "success";
  }

}

5. Visite http://localhost:8080/hello para probar, y el éxito ocurre después de 3 segundos, que es la situación de espera sincrónica.

Pregunta : si queremos que el usuario reciba el mensaje directamente, podemos usar el procesamiento de subprocesos múltiples en segundo plano, pero es demasiado problemático escribir manualmente la implementación de subprocesos múltiples cada vez. Solo necesitamos usar un simple Para hacer esto , agregue una anotación simple a nuestro método, de la siguiente manera:

6. Agregue la anotación @Async al método hello;

//告诉Spring这是一个异步方法
@Async
public void hello(){
    
    
   try {
    
    
       Thread.sleep(3000);
  } catch (InterruptedException e) {
    
    
       e.printStackTrace();
  }
   System.out.println("业务进行中....");
}

  ¡SpringBoot abrirá un grupo de subprocesos por sí mismo y lo llamará! Pero para que esta anotación surta efecto, también debemos agregar una anotación @EnableAsync al programa principal para habilitar la función de anotación asíncrona;

@EnableAsync //开启异步注解功能
@SpringBootApplication
public class SpringbootTaskApplication {
    
    

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

}

7. Reinicie la prueba, la página web responde instantáneamente y el código de fondo aún se ejecuta.

tarea cronometrada

  En el desarrollo de proyectos, muchas veces es necesario realizar algunas tareas programadas, por ejemplo, es necesario analizar la información de registro del día anterior en la madrugada de cada día, Spring nos proporciona una forma de ejecutar la programación de tareas de forma asincrónica y proporciona dos interfaces.

  • interfaz TaskExecutor
  • Interfaz del programador de tareas

Dos anotaciones:

  • @EnableScheduling
  • @Programado

expresión cron:

imagen

imagen

Pasos de prueba:

1. Crear un servicio programado

Hay un método hola en nosotros, debe ejecutarse regularmente, ¿cómo lidiar con eso?

@Service
public class ScheduledService {
    
    
   
   //秒   分   时     日   月   周几
   //0 * * * * MON-FRI
   //注意cron表达式的用法;
   @Scheduled(cron = "0 * * * * 0-7")
   public void hello(){
    
    
       System.out.println("hello.....");
  }
}

2. Después de escribir la tarea programada aquí, debemos agregar @EnableScheduling al programa principal para habilitar la función de tarea programada

@EnableAsync //开启异步注解功能
@EnableScheduling //开启基于注解的定时任务
@SpringBootApplication
public class SpringbootTaskApplication {
    
    

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

}

3. Aprendamos más sobre las expresiones cron;

https://www.bejson.com/othertools/cron/

4. Expresiones de uso común

(1)0/2 * * * * ?   表示每2秒 执行任务
(1)0 0/2 * * * ?   表示每2分钟 执行任务
(1)0 0 2 1 * ?   表示在每月的1日的凌晨2点调整任务
(2)0 15 10 ? * MON-FRI   表示周一到周五每天上午10:15执行作业
(3)0 15 10 ? 6L 2002-2006   表示2002-2006年的每个月的最后一个星期五上午10:15执行作
(4)0 0 10,14,16 * * ?   每天上午10点,下午2点,4点
(5)0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时
(6)0 0 12 ? * WED   表示每个星期三中午12点
(7)0 0 12 * * ?   每天中午12点触发
(8)0 15 10 ? * *   每天上午10:15触发
(9)0 15 10 * * ?     每天上午10:15触发
(10)0 15 10 * * ?   每天上午10:15触发
(11)0 15 10 * * ? 2005   2005年的每天上午10:15触发
(12)0 * 14 * * ?     在每天下午2点到下午2:59期间的每1分钟触发
(13)0 0/5 14 * * ?   在每天下午2点到下午2:55期间的每5分钟触发
(14)0 0/5 14,18 * * ?     在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
(15)0 0-5 14 * * ?   在每天下午2点到下午2:05期间的每1分钟触发
(16)0 10,44 14 ? 3 WED   每年三月的星期三的下午2:10和2:44触发
(17)0 15 10 ? * MON-FRI   周一至周五的上午10:15触发
(18)0 15 10 15 * ?   每月15日上午10:15触发
(19)0 15 10 L * ?   每月最后一日的上午10:15触发
(20)0 15 10 ? * 6L   每月的最后一个星期五上午10:15触发
(21)0 15 10 ? * 6L 2002-2005   2002年至2005年的每月的最后一个星期五上午10:15触发
(22)0 15 10 ? * 6#3   每月的第三个星期五上午10:15触发

tarea de correo

  También hay muchos envíos de correo electrónico en nuestro desarrollo diario, y Springboot también nos apoya.

  • El envío de correo debe introducir spring-boot-start-mail

  • SpringBoot configura automáticamente MailSenderAutoConfiguration

  • Defina el contenido de MailProperties, configurado en application.yml

  • Autowire JavaMailSender

  • Prueba de envío de correo electrónico

prueba:

1. Introducir dependencias pom

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

Haga clic en el código fuente para ver las dependencias que presenta, puede ver jakarta.mail

<dependency>
   <groupId>com.sun.mail</groupId>
   <artifactId>jakarta.mail</artifactId>
   <version>1.6.4</version>
   <scope>compile</scope>
</dependency>

2. Ver la clase de configuración automática: MailSenderAutoConfiguration

imagen

Hay un bean en esta clase, JavaMailSenderImpl

imagen

Luego miramos el archivo de configuración.

@ConfigurationProperties(
   prefix = "spring.mail"
)
public class MailProperties {
    
    
   private static final Charset DEFAULT_CHARSET;
   private String host;
   private Integer port;
   private String username;
   private String password;
   private String protocol = "smtp";
   private Charset defaultEncoding;
   private Map<String, String> properties;
   private String jndiName;
}

Obtenga el código de autorización: Configuración en el buzón QQ -> Cuenta -> Habilitar servicios pop3 y smtp

imagen

imagen

3. Archivo de configuración:

[email protected]
spring.mail.password=iarkclztxfanbdjc
spring.mail.host=smtp.qq.com
# 开启加密验证
spring.mail.properties.mail.smtp.ssl.enable=true

4. Prueba de unidad de resorte

package com.kwok;

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;
import org.springframework.mail.javamail.MimeMessageHelper;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;

@SpringBootTest
class Springboot09TasktestApplicationTests {
    
    

    @Autowired
    JavaMailSenderImpl mailSender;

    @Test
    void contextLoads() {
    
    

        // 一个简单的邮件~
        SimpleMailMessage mailMessage = new SimpleMailMessage();

        mailMessage.setSubject("HelloEmail~");
        mailMessage.setText("springboot测试邮件发送");
        mailMessage.setTo("[email protected]");
        mailMessage.setFrom("[email protected]");

        mailSender.send(mailMessage);

    }

    @Test
    void contextLoads2() throws MessagingException {
    
    

        // 一个复杂的邮件~
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        // 组装~
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
        helper.setSubject("HelloEmail2~");
        helper.setText("<h1 style='color:blue'>springboot测试复杂邮件发送</h1>",true);

        // 附件
        helper.addAttachment("1.jpg",new File("E:\\a-IdeaProjects\\SpringBootStudy\\springboot-09-tasktest\\src\\main\\resources\\static\\head.jpg"));
        helper.addAttachment("2.jpg",new File("E:\\a-IdeaProjects\\SpringBootStudy\\springboot-09-tasktest\\src\\main\\resources\\static\\head.jpg"));

        helper.setTo("[email protected]");
        helper.setFrom("[email protected]");

        mailSender.send(mimeMessage);

    }

    /**
     *
     * @param html
     * @param subject
     * @param text
     * @throws MessagingException
     * @Author hokwok
     */
    // 封装成方法
    public void sendMail(Boolean html,String subject,String text) throws MessagingException {
    
    
        // 一个复杂的邮件~
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        // 组装~
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,html);
        helper.setSubject(subject);
        helper.setText(text,true);

        // 附件
        helper.addAttachment("1.jpg",new File("E:\\a-IdeaProjects\\SpringBootStudy\\springboot-09-tasktest\\src\\main\\resources\\static\\head.jpg"));
        helper.addAttachment("2.jpg",new File("E:\\a-IdeaProjects\\SpringBootStudy\\springboot-09-tasktest\\src\\main\\resources\\static\\head.jpg"));

        helper.setTo("[email protected]");
        helper.setFrom("[email protected]");

        mailSender.send(mimeMessage);
    }

}

imagen

imagen

imagen

¡Revise el buzón, el correo se recibió con éxito!

¡Solo necesitamos usar Thymeleaf para combinar los extremos delantero y trasero para desarrollar las funciones de envío y recepción de correo electrónico de nuestro propio sitio web!

Supongo que te gusta

Origin blog.csdn.net/qq_41355222/article/details/123967576
Recomendado
Clasificación