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:
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
(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触发
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!