【发布时间】:2022-01-21 00:50:53
【问题描述】:
我正在我的代码中尝试异步进程。我写了如下代码。但是异步进程不起作用。线程名称“”本身未显示在日志中。看起来服务类不是在寻找 bean 'asyncExecutor'。我在这里缺少什么。
@SpringBootApplication
@EnableAsync
public class MyMainApplication {
@Bean(name = "asyncExecutor")
public Executor asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(3);
executor.setMaxPoolSize(3);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("AsynchThread-");
executor.initialize();
return executor;
}
public static void main(String[] args) {
SpringApplication.run(MyMainApplication.class, args);
}
}
服务类
public void getSampleDetails(String param1, String param2) {
log.info("Inside - getSampleDetails");
CompletableFuture<Map<String, String>> sampleMap1 = null;
CompletableFuture<Map<String, String>> sampleMap2 = null;
CompletableFuture<Map<String, String>> sampleMap3 = null;
sampleMap1 = getSampleMap1(param1, param2);
sampleMap2 = getSampleMap2(param1, param2);
sampleMap3 = getSampleMap3(param1, param2);
// Wait until they are all done
CompletableFuture.allOf(sampleMap1, sampleMap2, sampleMap3).join();
}
@Async("asyncExecutor")
public CompletableFuture<Map<String, String>> getSampleMap1(String param1, String param2) throws InterruptedException {
System.out.println("Inside Method1");
..
..
}
@Async("asyncExecutor")
public CompletableFuture<Map<String, String>> getSampleMap2(String param1, String param2) throws InterruptedException {
System.out.println("Inside Method2");
..
..
}
@Async("asyncExecutor")
public CompletableFuture<Map<String, String>> getSampleMap3(String param1, String param2) throws InterruptedException {
System.out.println("Inside Method3");
..
..
}
线程名称未显示且异步进程未发生 日志:
[ main]o.s.s.concurrent.ThreadPoolTaskExecutor Initializing ExecutorService
[ main]o.s.s.concurrent.ThreadPoolTaskExecutor Initializing ExecutorService 'asyncExecutor1'
[ main]o.s.s.c.ThreadPoolTaskScheduler Initializing ExecutorService 'taskScheduler'
[ main]o.s.b.w.embedded.tomcat.TomcatWebServer Tomcat started on port(s): 32182 (http) with context path '/myapplication'
[ main]MyMainApplication Started MyMainApplication in 46.662 seconds (JVM running for 48.024)
[exec-1]e-myapplication] Initializing Spring DispatcherServlet 'dispatcherServlet'
[exec-1]o.s.web.servlet.DispatcherServlet Initializing Servlet 'dispatcherServlet'
[exec-1]o.s.web.servlet.DispatcherServlet Completed initialization in 8 ms
[exec-1]Inside - getSampleDetails
[exec-1]Inside Method1
[exec-1]Inside Method2
[exec-1]Inside Method3
【问题讨论】:
-
你是从同一个类的另一个方法中调用
@Async-annotated 方法吗?如果是这样,请参阅stackoverflow.com/questions/29284008/… -
是的。我正在调用 3 个必须异步执行的方法,结果应该在调用方法中返回。我没有从上面的链接中理解这个答案>
标签: java multithreading spring-boot asynchronous