1. 开启异步@Async
创建线程池配置
@Configuration
@EnableAsync
@Slf4j
public class AsyncConfig{
@Bean("asyncExecutor")
public Executor asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//最大线程数5:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
//缓冲队列500:用来缓冲执行任务的队列
executor.setQueueCapacity(500);
//允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
executor.setKeepAliveSeconds(60);
executor.setThreadNamePrefix("AsyncThread-");
executor.initialize();
return executor;
}
}
避免内部调用
1. 通用异步执行类
/**
* 通用异步执行类
* @Date 2022/9/20 上午11:29
*/
public interface CommonAsyncService<T> {
/**
* 通用异步执行
* @param data
* @param consumer
*/
void commonAsync(T data, Consumer<T> consumer);
}
//实现类
/**
* @Date 2022/9/20 上午11:31
*/
@Component
public class CommonAsyncServiceImpl<T> implements CommonAsyncService<T>, AsyncConfigurer {
/**
* 通用异步执行
*
* @param data
* @param consumer
*/
@Async("asyncExecutor")
@Override
public void commonAsync(T data, Consumer<T> consumer) {
consumer.accept(data);
}
}
内部调用使用
@service
public class ServiceImpl extends service {
@Autowired
private CommonAsyncService<ServiceImpl> async;
@ServiceExceptionCatch
@Override
public Result<String> test1(String name) {
//异步调用
async.commonAsync(this, t -> t.test2(name));
return Result.success("新增成功");
}
public void test2(String name) {
//todo 逻辑
}
}