天天看點

springBoot異步線程操作

        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 調用異步的方法與異步方法不能在同一個類中。