spring boot实现异步批量发送邮件

yml文件配置
spring:
  mail:
    host: smtp.163.com
    username: xing_a810@163.com
    password: xingli810
    default-encoding: UTF-8
    protocol: smtp
    properties.mail.smtp.auth: true
    properties.mail.smtp.port: 994 #465或者994
    properties.mail.display.sendmail: Javen
    properties.mail.display.sendname: Spring Boot Guide Email
    properties.mail.smtp.starttls.enable: true
    properties.mail.smtp.starttls.required: true
    properties.mail.smtp.ssl.enable: true

本来想直接写一个工具类的,可是忽然发现JavaMailSender使用@Autowired引入的话会发生这个JavaMailSender为null的状况,按照http://www.javashuo.com/article/p-pyqagdir-dg.html改正后发现若是是一个工具类接口必须是静态的,而后就改为实现类的写法html

public interface xxxService {

    void sendEmail(String text);
}
@Component
@Service
public class OrderEmailServiceImpl implements OrderEmailService {

    @Autowired
    private JavaMailSender javaMailSender;

    @Async("taskExecutor")
    @Override
    public void sendEmail(String text) {
        try{
            // 异步执行
            Thread.sleep(1000);
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
            String msg = "<p style=\"font-weight: bolder;\">尊敬的xxx,您好!</p></n><p style='text-indent: 2em;font-weight: bolder;'>感谢信任xxxxxxxx!</p><p>您的xxxxxxx为:</p><p style=\"font-size: 13px;\">" + text + "</p></center>";
            try {
                messageHelper.setSubject("xxxxxxxx");
                messageHelper.setFrom("xing_a810@163.com");//发送者的邮箱
                messageHelper.setTo("xxxxx@163.com");//发送给谁   能够是各类邮箱
                messageHelper.setText(msg, true);//msg为发送的信息
                javaMailSender.send(messageHelper.getMimeMessage());
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}
写好发现这个邮件发送是很慢的,要等很久web页面才能收到成功的回调,而后就作成异步的,就弄了个线程池这样就算是批量发送邮件也不会有那样的卡顿  注意 加红的地方就是开启这个线程池的  还要在你的Application启动类上面加上开启异步的注解@EnableAsync
/**
 * 定义异步任务执行线程池
 */
@Configuration
public class TaskPoolConfig {
    @Bean("taskExecutor")
    public Executor taskExecutor () {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 核心线程数10:线程池建立时候初始化的线程数
        executor.setCorePoolSize(10);
        // 最大线程数20:线程池最大的线程数,只有在缓冲队列满了以后才会申请超过核心线程数的线程
        executor.setMaxPoolSize(15);
        // 缓冲队列200:用来缓冲执行任务的队列
        executor.setQueueCapacity(200);
        // 容许线程的空闲时间60秒:当超过了核心线程数以外的线程在空闲时间到达以后会被销毁
        executor.setKeepAliveSeconds(60);
        // 线程池名的前缀:设置好了以后能够方便定位处理任务所在的线程池
        executor.setThreadNamePrefix("taskExecutor-");
        /*
        线程池对拒绝任务的处理策略:这里采用了CallerRunsPolicy策略,
        当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;
        若是执行程序已关闭,则会丢弃该任务
         */
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 设置线程池关闭的时候等待全部任务都完成再继续销毁其余的Bean
        executor.setWaitForTasksToCompleteOnShutdown(true);
        // 设置线程池中任务的等待时间,若是超过这个时候尚未销毁就强制销毁,以确保应用最后可以被关闭,而不是阻塞住。
        executor.setAwaitTerminationSeconds(600);
        return executor;
    }
}

放两个参考连接   里面很详细,有发送附件的 发送文本的  发送  html 的    等等  我这个只是工做记录java

发送邮件的:http://www.javashuo.com/article/p-ewuthhjf-ds.htmlweb

异步的:https://www.cnblogs.com/cicada-smile/p/10970208.htmlspring

相关文章
相关标签/搜索