参考文章
https://segmentfault.com/a/1190000015766938
https://blog.csdn.net/qq_34545192/article/details/80484780
在平时我们写多线程可能更多是使用new Thread() 或者创建线程池来实现的,但是在阿里的java开发规范中要求不要自己直接创建新线程,而是通过线程池来实现的,恰好spring boot支持多线程的开发,所以我尝试通过多线程的方式来暂时解决原来同步发送邮件是的请求时间过长的问题。当然多线程并不能彻底解决实现异步,还是需要通过消息中间件来实现功能的解耦,实现真正的异步
1.在springboot的启动类添加@EnableAsync注解
1 2 3 4 5 6 7 8 9
| @SpringBootApplication @EnableAsync public class Application {
public static void main(String[] args) { SpringApplication.run(Application.class, args); }
}
|
2.添加ThreadConfig的配置类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @Configuration @EnableAsync public class ThreadConfig implements AsyncConfigurer {
@Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); executor.setMaxPoolSize(15); executor.setQueueCapacity(25); executor.initialize(); return executor; }
@Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return null; } }
|
3.下面我们编写多线程部分的业务实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| @Component public class EmailTool { @Autowired JavaMailSender javaMailSender;
@Value("${spring.mail.username}") private String sendFrom;
@Async public void sendEmailAsync(EmailEntity emailEntity, CountDownLatch latch) { sendEmail(emailEntity); latch.countDown(); }
public void sendEmail(EmailEntity emailEntity) { MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper; try { helper = new MimeMessageHelper(message, true); helper.setFrom(sendFrom); helper.setTo(emailEntity.getSendTo()); helper.setSubject(emailEntity.getSubject()); helper.setText(emailEntity.getMessage(), true); } catch (MessagingException e) { e.printStackTrace(); } javaMailSender.send(message); } }
|
通过上述步骤就可以实现sendEmailAsync函数的异步功能了,但是在使用这个方法的时候我们要注意的问题就是
@Async无效的问题
异步方法和调用方法一定要 写在不同的类中 ,如果写在一个类中,是没有效果的