springboot异步多线程发邮件
二、实现异步发送邮件
在SpringBoot项目中开启异步多线程非常简单,只需要下面几个步骤即可。
在主类上面开启@EnableAsync
注解
……
@EnableAsync
public class EmosWxApiApplication {
……
@Configuration public class ThreadPoolConfig { @Bean("AsyncTaskExecutor") public AsyncTaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); // 设置核心线程数 executor.setCorePoolSize(8); // 设置最大线程数 executor.setMaxPoolSize(16); // 设置队列容量 executor.setQueueCapacity(32); // 设置线程活跃时间(秒) executor.setKeepAliveSeconds(60); // 设置默认线程名称 executor.setThreadNamePrefix("task-"); // 设置拒绝策略 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } }
在com.example.emos.wx.task
中创建EmailTask
类,定义线程任务
@Component @Scope("prototype") public class EmailTask implements Serializable { @Autowired private JavaMailSender javaMailSender; @Value("${emos.email.system}") private String mailbox; @Async("AsyncTaskExecutor") public void sendAsync(SimpleMailMessage message){ message.setFrom(mailbox); javaMailSender.send(message); } }
@Value("${emos.email.hr}") private String hrEmail; @Autowired private EmailTask emailTask;
HashMap<String, String> map = userDao.searchNameAndDept(userId); String name = map.get("name"); String deptName = map.get("dept_name"); deptName = deptName != null ? deptName : ""; SimpleMailMessage message = new SimpleMailMessage(); message.setTo(hrEmail); message.setSubject("员工" + name + "身处高风险疫情地区警告"); message.setText(deptName + "员工" + name + "," + DateUtil.format(new Date(), "yyyy年MM月dd日") + "处于" + address + ",属于新冠疫情高风险地区,请及时与该员工联系,核实情况!"); emailTask.sendAsync(message);