springBoot項目中我們常常會有比較耗時的操作,而前端不關心你的處理結果時。比如給使用者發送郵件,此時,我們就可以在使用者操作時使用異步來完成發送郵件,不需要等郵件發送完成後再給到前端相應。下面詳細介紹一下具體步驟:
- 首先可以再項目中添加線程池相關配置
@Configuration
@EnableAsync
public class AsyncConfig {
private int corePoolSize = 10;
private int maxPoolSize = 200;
private int queueCapacity = 10;
private String ThreadNamePrefix = "asyncExecutor-";
@Bean
public Executor asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setThreadNamePrefix(ThreadNamePrefix);
// rejection-policy:當pool已經達到max size的時候,如何處理新任務
// CALLER_RUNS:不在新線程中執行任務,而是有調用者所在的線程來執行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
}
- 建立一個類,類加上@Component 注解,方法上加@Async 注解,代表異步調用方法,以下為發送郵件demo
@Async
public void sendHtmlMail(String to, String subject, String content){
MimeMessage message=javaMailSender.createMimeMessage();
try {
//true表示需要建立一個multipart message
MimeMessageHelper helper=new MimeMessageHelper(message,true);
helper.setFrom(form);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content,true);
javaMailSender.send(message);
System.out.println("html格式郵件發送成功");
}catch (Exception e){
System.out.println("html格式郵件發送失敗");
}
}
- 最後在springBoot啟動類上加@EnableAsync注解。然後再需要調用異步方法的地方,注入調用即可
- ps 調用異步的方法與異步方法不能在同一個類中。