异步方法未并行运行

时间:2020-04-02 19:19:15

标签: java spring-boot asynchronous

我有Service.classstart()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);
    }

循环中的所有内容都不是并行运行的,但是在第一次完成后它会开始第二个循环。这是为什么?如何并行执行?

1 个答案:

答案 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);

P.s,请参见https://spring.io/guides/gs/async-method/