我有一个Spring Boot应用程序
CommandLineRunner
还有春天
@Async
注释以异步运行方法。这一切都很好,但当我的所有线程完成时,应用程序只是挂起而不是退出。
下面是我的应用程序中的一个最小示例:
应用Java语言
@SpringBootApplication
@EnableAsync
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
应用程序启动。Java语言
:
@Component
public class ApplicationStartup implements CommandLineRunner {
private final AsyncService asyncService;
@Inject
public ApplicationStartup(final AsyncService asyncService) {
this.asyncService = asyncService;
}
@Override
public void run(final String... strings) throws Exception {
//my logic is more complicated than this, but this illustrates my point
for (int i = 0; i < 1000; i++) {
asyncService.runAsyncMethod();
}
}
}
异步服务。Java语言
:
@Service
@Transactional
public class AsyncService {
@Async
public void runAsyncMethod() {
//perform call to an API and process results
}
}
ExecutorConfig。Java语言
:
@Configuration
public class ExecutorConfig() {
@Bean
public ThreadPoolTaskExecutor asyncExecutor() {
final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(64);
executor.setMaxPoolSize(64);
executor.setQueueCapacity(500);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setThreadNamePrefix("Scrub-");
executor.setKeepAliveSeconds(60);
executor.initialize();
return executor;
}
}
我的所有线程都调用
runAsyncMethod()
每个方法调用都成功完成,但应用程序只是挂起。
我试着改变一些执行器的设置。我没有
keepAliveSeconds
起初,我认为添加它可以修复它,但在所有线程完成后,它仍然挂起。我变了
corePoolSize
到
0
,这使得应用程序在完成时退出,但整个过程只使用了1个线程。