我有Service.class
和start()
和asychronous()
方法:
public ResponseEntity<Object> start() throws APICommandConstructionException, APICommunicationException, APIReplyParseException,
APIErrorResponse, IOException {
List<Company> companiesList = dbHandler.retrieveCompaniesList();
Company company = null;
for (int i = 0; i < companiesList.size(); i++) {
asychronousMethod(companiesList, i, company);
}
return new ResponseEntity<Object>("Start method has Finished", HttpStatus.OK);
}
@Async("threadPoolTaskExecutor")
public void asychronousMethod(List<Company> companiesList, int i, Company company) throws APICommandConstructionException, APIReplyParseException, APICommunicationException, APIErrorResponse, IOException {
company = companiesList.get(i);
company = utils.websiteScrap(company);
companiesRepository.save(company);
}
循环中的所有内容都不是并行运行的,但是在第一次完成后它会开始第二个循环。这是为什么?如何并行执行?
答案 0 :(得分:0)
简而言之:您不应使用Spring注释显式调用方法。
更详细:
Spring会创建特殊的代理,这些代理在后台为您做“魔术”。因此,如果您具有异步注释,这意味着(取决于Spring的编译和运行时配置),有一些隐藏的代码部分在您调用this.asynchronousMethod
时不会执行。
如何修复:
首先,方法应与public CompletableFuture<Void>
相匹配-这样您就知道线程何时完成。
第二个,而不是this
,您需要将自身实例解析为Spring代理。
通过@Autowired
的最简单方法:
@Autowired
MyClass zhis;
.... //in for loop:
future = zhis.asychronousMethod(companiesList, i, company);