Асинхронный метод не работает параллельно - PullRequest
1 голос
/ 02 апреля 2020

У меня есть 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);
    }

Все, что находится внутри al oop, не работает параллельно, но запускается второй l oop после того, как первый закончил. Это почему? Как сделать это параллельно?

1 Ответ

0 голосов
/ 02 апреля 2020

Вкратце: вам не следует явно вызывать методы с аннотациями Spring.

Более подробно: Spring создает специальные прокси, которые на заднем этапе выполняют для вас 'magi c'. Поэтому, если у вас есть асинхронная аннотация c, это означает, что (в зависимости от конфигурации Spring во время компиляции и во время выполнения) была некоторая скрытая часть кода, которая не выполняется при вызове this.asynchronousMethod.

Как чтобы исправить:

Прежде всего метод должен соответствовать public CompletableFuture<Void> - таким образом, вы знаете, когда поток завершен.

Второй вместо this вам нужно разрешить собственный экземпляр как Spring прокси. Простейший способ про @Autowired:

@Autowired
MyClass zhis;

.... //in for loop:
future = zhis.asychronousMethod(companiesList, i, company);

Ps, пожалуйста, посмотрите хороший пример на https://spring.io/guides/gs/async-method/

...