SpringBoot integra tareas asincrónicas, de sincronización y de correo

Tarea asincrónica

1. Cree 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á correos electrónicos. En este momento, la recepción hará que la respuesta esté inactiva. La respuesta no se realizará correctamente hasta que se envíe el correo electrónico. por lo que generalmente usamos métodos de subprocesos múltiples. Lidia con estas tareas.

Escriba un método, pretenda estar procesando datos, use hilos para establecer algunos retrasos y simule la situación de espera sincrónica;

@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. Escribe la clase AsyncController

Escribamos un controlador para probar

@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 aparece después de 3 segundos, que es una 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 cada vez que necesitamos escribir manualmente la implementación de subprocesos múltiples, es demasiado problemático, solo necesitamos usar un simple La forma es agregar 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 hará llamadas. Pero para que esta anotación surta efecto, también necesitamos agregar una anotación @EnableAsync al programa principal para habilitar la función de anotación asincrónica;

@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, a menudo necesitamos realizar algunas tareas cronometradas. Por ejemplo, necesitamos analizar la información de registro del día anterior temprano en la mañana de cada día. Spring nos proporciona una forma de realizar la programación de tareas de forma asincrónica y proporciona dos interfaces .

TaskExecutor接口

TaskScheduler接口

Dos notas:

@EnableScheduling

@Scheduled

expresión cron:

Inserte la descripción de la imagen aquí

Pasos de prueba:

1. Cree un servicio programado

Hay un método de saludo en nosotros, debe ejecutarse regularmente, ¿cómo lidiar con él?

@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 de cronometraje aquí, debemos agregar @EnableScheduling al programa principal para habilitar la función de tarea de cronometraje

@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;

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

4. Expresiones de uso común

10/2 * * * * ?   表示每2秒 执行任务
(10 0/2 * * * ?   表示每2分钟 执行任务
(10 0 2 1 * ?   表示在每月的1日的凌晨2点调整任务
(20 15 10 ? * MON-FRI   表示周一到周五每天上午10:15执行作业
(30 15 10 ? 6L 2002-2006   表示2002-2006年的每个月的最后一个星期五上午10:15执行作
(40 0 10,14,16 * * ?   每天上午10点,下午2点,4点
(50 0/30 9-17 * * ?   朝九晚五工作时间内每半小时
(60 0 12 ? * WED   表示每个星期三中午12点
(70 0 12 * * ?   每天中午12点触发
(80 15 10 ? * *   每天上午10:15触发
(90 15 10 * * ?     每天上午10:15触发
(100 15 10 * * ?   每天上午10:15触发
(110 15 10 * * ? 2005   2005年的每天上午10:15触发
(120 * 14 * * ?     在每天下午2点到下午2:59期间的每1分钟触发
(130 0/5 14 * * ?   在每天下午2点到下午2:55期间的每5分钟触发
(140 0/5 14,18 * * ?     在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
(150 0-5 14 * * ?   在每天下午2点到下午2:05期间的每1分钟触发
(160 10,44 14 ? 3 WED   每年三月的星期三的下午2:102:44触发
(170 15 10 ? * MON-FRI   周一至周五的上午10:15触发
(180 15 10 15 * ?   每月15日上午10:15触发
(190 15 10 L * ?   每月最后一日的上午10:15触发
(200 15 10 ? * 6L   每月的最后一个星期五上午10:15触发
(210 15 10 ? * 6L 2002-2005   2002年至2005年的每月的最后一个星期五上午10:15触发
(220 15 10 ? * 6#3   每月的第三个星期五上午10:15触发

Tarea de correo

Se envían muchos correos electrónicos en nuestro desarrollo diario, y Springboot también nos ayudó a respaldar

El envío de correo electrónico debe introducir spring-boot-start-mail

SpringBoot configura automáticamente MailSenderAutoConfiguration

Defina el contenido de MailProperties y configúrelo en application.yml

Montaje automático de JavaMailSender

Envío de correo de prueba

prueba:

1. Introducir la dependencia de pom

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

Mire 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

Hay un bean en esta clase, JavaMailSenderImpl

Luego vamos a mirar 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;
}

3. Archivo de configuración:

[email protected]
spring.mail.password=你的qq授权码
spring.mail.host=smtp.qq.com

QQ necesita configurar ssl

spring.mail.properties.mail.smtp.ssl.enable = true para
obtener el código de autorización: Configuración en el buzón de QQ -> cuenta -> abrir servicios pop3 y smtp

4. Prueba de la unidad de resorte

@Autowired
JavaMailSenderImpl mailSender;

@Test
public void contextLoads() {
    
    
   //邮件设置1:一个简单的邮件
   SimpleMailMessage message = new SimpleMailMessage();
   message.setSubject("通知-明天来狂神这听课");
   message.setText("今晚7:30开会");

   message.setTo("[email protected]");
   message.setFrom("[email protected]");
   mailSender.send(message);
}

@Test
public void contextLoads2() throws MessagingException {
    
    
   //邮件设置2:一个复杂的邮件
   MimeMessage mimeMessage = mailSender.createMimeMessage();
   MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);

   helper.setSubject("通知-明天来狂神这听课");
   helper.setText("<b style='color:red'>今天 7:30来开会</b>",true);

   //发送附件
   helper.addAttachment("1.jpg",new File(""));
   helper.addAttachment("2.jpg",new File(""));

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

   mailSender.send(mimeMessage);
}

Verifique el buzón, ¡el correo se recibió correctamente!

¡Solo necesitamos usar Thymeleaf para la integración de front-end y back-end para desarrollar nuestras propias funciones de envío y recepción de correo en el sitio web!

Supongo que te gusta

Origin blog.csdn.net/david2000999/article/details/115253339
Recomendado
Clasificación