springboot集成多线程功能

参考文章
https://segmentfault.com/a/1190000015766938
https://blog.csdn.net/qq_34545192/article/details/80484780

在平时我们写多线程可能更多是使用new Thread() 或者创建线程池来实现的,但是在阿里的java开发规范中要求不要自己直接创建新线程,而是通过线程池来实现的,恰好spring boot支持多线程的开发,所以我尝试通过多线程的方式来暂时解决原来同步发送邮件是的请求时间过长的问题。当然多线程并不能彻底解决实现异步,还是需要通过消息中间件来实现功能的解耦,实现真正的异步

1.在springboot的启动类添加@EnableAsync注解

@SpringBootApplication
@EnableAsync
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

2.添加ThreadConfig的配置类

@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.下面我们编写多线程部分的业务实现

@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无效的问题

异步方法和调用方法一定要 写在不同的类中 ,如果写在一个类中,是没有效果的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值