SpringBoot integra tarefas assíncronas, temporizadas e de e-mail

Tarefa assíncrona

1. Crie um pacote de serviço

2. Crie uma classe AsyncService

O processamento assíncrono ainda é muito comum. Por exemplo, quando enviamos e-mails no site, o plano de fundo enviará e-mails. Nesse momento, a recepção fará com que a resposta seja inativa. A resposta não terá êxito até que o e-mail seja enviado, portanto, geralmente usamos métodos multithread. Lide com essas tarefas.

Escreva um método, finja estar processando dados, use threads para definir alguns atrasos e simule a situação de espera síncrona;

@Service
public class AsyncService {
    
    

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

3. Escreva o pacote do controlador

4. Escreva a classe AsyncController

Vamos escrever um controlador para testar

@RestController
public class AsyncController {
    
    

   @Autowired
   AsyncService asyncService;

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

}

5. Visite http: // localhost: 8080 / hello para testar e o sucesso aparecerá após 3 segundos, o que é uma situação de espera síncrona.

Pergunta: Se quisermos que o usuário receba a mensagem diretamente, podemos usar o processamento multi-threaded em segundo plano, mas cada vez que precisamos escrever manualmente a implementação multi-threaded, é muito problemático, só precisamos usar um simples O jeito é adicionar uma anotação simples ao nosso método, da seguinte maneira:

6. Adicione a anotação @Async ao método hello;

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

SpringBoot irá abrir um pool de threads por si só e fazer chamadas! Mas para que essa anotação tenha efeito, também precisamos adicionar uma anotação @EnableAsync ao programa principal para habilitar a função de anotação assíncrona;

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

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

}

7. Reinicie o teste, a página da web responde instantaneamente e o código de fundo ainda é executado!

Tarefa cronometrada

No desenvolvimento de projetos, muitas vezes precisamos realizar algumas tarefas cronometradas. Por exemplo, precisamos analisar as informações de registro do dia anterior no início da manhã de cada dia. O Spring nos fornece uma maneira de realizar o agendamento de tarefas de forma assíncrona e fornece duas interfaces .

TaskExecutor接口

TaskScheduler接口

Duas notas:

@EnableScheduling

@Scheduled

expressão cron:

Insira a descrição da imagem aqui

Etapas do teste:

1. Crie um ScheduledService

Existe um método hello em nós, ele precisa ser executado regularmente, como lidar com isso?

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

2. Depois de escrever a tarefa de temporização aqui, precisamos adicionar @EnableScheduling ao programa principal para habilitar a função de tarefa de temporização

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

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

}

3. Vamos aprender mais sobre expressões cron;

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

4. Expressões comumente usadas

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点,450 0/30 9-17 * * ?   朝九晚五工作时间内每半小时60 0 12 ? * WED   表示每个星期三中午1270 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触发

Tarefa de correio

Há muitos e-mails enviados em nosso desenvolvimento diário, e o Springboot também nos ajudou a dar suporte

O envio de e-mail precisa apresentar spring-boot-start-mail

SpringBoot configura automaticamente MailSenderAutoConfiguration

Defina o conteúdo de MailProperties e configure-o em application.yml

Montagem automática de JavaMailSender

Teste de envio de e-mail

teste:

1. Apresente a dependência de pom

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

Veja as dependências que ele apresenta, você pode ver jakarta.mail

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

2. Visualize a classe de configuração automática: MailSenderAutoConfiguration

Há um bean nesta classe, JavaMailSenderImpl

Então vamos dar uma olhada no arquivo de configuração

@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. Arquivo de configuração:

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

QQ precisa configurar SSL

spring.mail.properties.mail.smtp.ssl.enable = true para
obter o código de autorização: Configurações na caixa de correio QQ -> conta -> abrir serviços pop3 e smtp

4. Teste de unidade de mola

@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 a caixa de correio, o e-mail foi recebido com sucesso!

Precisamos apenas usar o Thymeleaf para integração front-end e back-end para desenvolver nossas próprias funções de envio e recebimento de e-mail no site!

Acho que você gosta

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