使用情景:
当处理某项较为耗时的操作时,一般需要新启动一个线程来完成。这样不影响主线程的工作。
简要步骤
1 先配置线程池
2 在异步方法上@Async
注解,该方法就变成异步方法。会另起线程执行该方法
注意
异步方法要交给spring容器托管,比如写在service里。否则不起作用
- 配置线程池
package com.vegetables.common.config;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Slf4j
@Configuration
@EnableAsync
public class ThreadAsyncConfigurer implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();
//设置核心线程数
threadPool.setCorePoolSize(10);
//设置最大线程数
threadPool.setMaxPoolSize(100);
//线程池所使用的缓冲队列
threadPool.setQueueCapacity(10);
//等待任务在关机时完成--表明等待所有线程执行完
threadPool.setWaitForTasksToCompleteOnShutdown(true);
// 等待时间 (默认为0,此时立即停止),并没等待xx秒后强制停止
threadPool.setAwaitTerminationSeconds(60);
// 线程名称前缀
threadPool.setThreadNamePrefix("QQ-MAIL-");
// 初始化线程
threadPool.initialize();
return threadPool;
}
//配置异步线程出现异常的处理
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (exception, method, params) -> {
log.error("async method has uncaught exception, params : {}", Arrays.toString(params));
log.error("method : {}", method);
log.error("exception : {}", ExceptionUtils.getStackTrace(exception));
};
}
}
- 异步方法,另起线程执行
//异步方法,另起线程
@Async
public void senEmail(String emailAddress, String emailMessage) throws Exception {
log.info("Thread - {}", Thread.currentThread().getName());
Properties props = new Properties();
props.setProperty("mail.transport.protocol", PROTOCOL);
props.setProperty("mail.smtp.host", HOST);
props.setProperty("mail.smtp.auth", AUTH);
props.setProperty("mail.smtp.port", PORT);
props.setProperty("mail.smtp.socketFactory.class", CLASS);
props.setProperty("mail.smtp.socketFactory.fallback", FALLBACK);
props.setProperty("mail.smtp.socketFactory.port", PORT);
log.info("prop - {}", props);
Session session = Session.getInstance(props);
session.setDebug(true);
MimeMessage message = createMimeMessage(session, ACCOUNT, emailAddress, emailMessage);
Transport transport = session.getTransport();
transport.connect(ACCOUNT, PASSWORD);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}
网友评论