如果我须要使得一个办法采取异步执行
如果我须要使得一个办法采取异步执行,并且执行的时候须要指定线程池,那么我须要做三步操作。
1、配置线程池
@Configuration@EnableAsyncpublic class ExecutorConfig implements AsyncConfigurer { @Bean("asyncServiceExecutor") @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //配置外围线程数 executor.setCorePoolSize(10); //配置最大线程数 executor.setMaxPoolSize(20); //配置队列大小 executor.setQueueCapacity(99999); //配置线程池中的线程的名称前缀 executor.setThreadNamePrefix("async-service-"); // rejection-policy:当pool曾经达到max size的时候,如何解决新工作 // CALLER_RUNS:不在新线程中执行工作,而是由调用者所在的线程来执行 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //执行初始化 executor.initialize(); return executor; }}
2、启用异步办法注解
@EnableAsync
3、在办法上开启注解,并配置线程池
@Async("asyncServiceExecutor")
springboot系统启动时初始化数据
@Component@Slf4jpublic class ApplicationRunnerImpl implements ApplicationRunner { @Override public void run(ApplicationArguments args) { }}
配置拦截器
1、增加拦截器配置文件
@Configurationpublic class MyWebConfig implements WebMvcConfigurer { @Value("${api.contextPath}") private String apiContextPath; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { } public String getLocalFileServerDir() { return System.getProperty("user.dir") + "/data/"; } @Resource private SessionInterceptor sessionInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(sessionInterceptor) .addPathPatterns(apiContextPath + "/**") .excludePathPatterns(apiContextPath + "/user/test") .excludePathPatterns(apiContextPath + "/***") .excludePathPatterns(apiContextPath + "/log/**"); } @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowCredentials(true) .allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH") .maxAge(3600 * 24) .allowedHeaders("*")// 容许头部设置 .allowCredentials(true); // 是否发送cookie }}