1.
import com.alibaba.dubbo.common.logger.Logger;
import com.alibaba.dubbo.common.logger.LoggerFactory;
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.lang.reflect.Method;
import java.util.concurrent.Executor;
/**
* 开启异步任务支持
*/
@EnableAsync //开启异步任务支持
@Configuration
//@ComponentScan("当前包路径") 如果spring 已经配置扫描改目录了,该配置可以忽略
public class TaskExecutorConfig implements AsyncConfigurer {
private static final Logger logger = LoggerFactory.getLogger(TaskExecutorConfig.class);
// 异步调用线程池大小 可灵活配置,默认获取服务器cpu个数
public static Integer smsAsynSize = Runtime.getRuntime().availableProcessors();
@Override
public Executor getAsyncExecutor() {
logger.info(">>>>>>>>>>>>>>>初始化异步任务支持开始<<<<<<<<<<<<<<<<<");
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(smsAsynSize);
taskExecutor.setMaxPoolSize(smsAsynSize*2);
taskExecutor.setQueueCapacity(smsAsynSize*5);
taskExecutor.setThreadNamePrefix("SpringAsyncThread-");
taskExecutor.initialize();
logger.info(">>>>>>>>>>>>>>>初始化异步任务支持结束<<<<<<<<<<<<<<<<<");
return taskExecutor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new SimpleAsyncUncaughtExceptionHandler();
}
class SimpleAsyncUncaughtExceptionHandler implements AsyncUncaughtExceptionHandler{
@Override
public void handleUncaughtException(Throwable throwable, Method method, Object... objects) {
logger.error("异步回调失败了, exception message : " + throwable.getMessage());
}
}
}
2. 只需在对应的方法上加上 @Async 注解 即可
import org.junit.Test;
import org.springframework.scheduling.annotation.Async;
/**
* 开启spring 异步
*/
public class TaskExecutorTest extends TestService {
@Test
public void test() {
TaskExecutorTest taskExecutorTest = new TaskExecutorTest();
for (int i = 0 ;i< 10;i++){
taskExecutorTest.executeAsyncTask(i);
taskExecutorTest.executeAsyncTaskPlus(i);
}
}
@Async
public void executeAsyncTask(Integer i){
System.out.println("执行异步任务"+i);
}
@Async
public void executeAsyncTaskPlus(Integer i){
System.out.println("执行异步任务+1:"+(i+1));
}
}