Async не работает над абстрактным методом суперкласса контроллера - PullRequest
0 голосов
/ 30 января 2019

У меня есть класс BaseRestController, который расширяют остальные контроллеры.У него есть метод, который я хочу запустить асинхронно.

public abstract class BaseRestController {
    ...

    @Async("someThreadPoolTaskExecutor")
    public void someAsyncTask() {
        ...
    }

}
@RestController
public class MyRestController extends BaseRestController {
    ...

    @GetMapping("/some/path")
    public SomeEntity getSomething() {
        ...
        this.someAsyncTask();
    }        
}

Я включил Async с помощью аннотации, реализовал метод, который получает someThreadPoolTaskExecutor TaskExecutor и все.Если я добавлю @Async("someThreadPoolTaskExecutor") в метод Service (класс, помеченный @Service), он будет работать, но если я сделаю это с someAsyncTask () в BaseRestController , код не будет работатьасинхронно.Украшение класса с помощью @ Component также не сработало.

Руководство по Spring для Async также не помогло.В демонстрационной версии он также демонстрирует Async с классом обслуживания.

Хотя в процессе я понял, что поведение, которое я хотел реализовать, лучше делегировать классу обслуживания, яЛюбопытно, чтобы понять, почему выше не будет работать.

Я использую 2.1.0.RELEASE Spring Boot.

1 Ответ

0 голосов
/ 30 января 2019

Есть пара правил для @Async, вы делаете самовывоз здесь

  • это должно применяться только к публичным методам
  • Самовывоз - вызов асинхронного метода из одного и того же класса - не будет работать

Причины просты - метод должен быть открытым, чтобы его можно было проксировать. И самопризыв не работает, потому что он обходит прокси и вызывает основной метод напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...