@ Asyn c выдает ошибку в весенней загрузке приложения - PullRequest
1 голос
/ 10 апреля 2020

Это основной класс приложения:

@EnableAsync(proxyTargetClass = true)
@EnableDiscoveryClient
@SpringBootApplication
public class ProductApplication {

    public static void main(final String[] args) {
        SpringApplication.run(ProductApplication.class, args);
    }

    @Bean("threadPoolTaskExecutor")
    public TaskExecutor getAsyncExecutor() {
        final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(20);
        executor.setMaxPoolSize(1000);
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.setThreadNamePrefix("Async-");
        return executor;
    }

}

Это класс обслуживания:

@Component
public class ProductServiceImpl implements ProductService {

    @Autowired
    ProductRepository productRepository;

    @Autowired
    private ProductHandler productHandler;

    @Async
    @Override
    public List<String> getAllCategories() {
        final List<String> finalList = new ArrayList<>();
        return finalList;
    }

}

Это класс контроллера:

@RestController
public class ProductResource {

    @Autowired
    private ProductServiceImpl productServiceImpl;

    @GetMapping("/categories")
    public ResponseEntity<List<String>> getAllCategories() {
        return new ResponseEntity<>(this.productServiceImpl.getAllCategories(), HttpStatus.OK);
    }
}

Я аннотировал метод реализации сервиса с @Async, но я получаю эту ошибку:

Действие:

Рассмотрите возможность внедрения компонента в качестве одного из его интерфейсов или принудительного использования прокси на основе CGLib с помощью установка proxyTargetClass = true для @ EnableAsyn c и / или @ EnableCaching.

Если я пытаюсь комментировать контроллер, я получаю пустой ответ на мой запрос get. Я пробовал все, включая установку proxyTargetClass в true.

1 Ответ

2 голосов
/ 10 апреля 2020

Пока вы используете аннотацию @Async, вы должны ознакомиться с правилами, которые необходимо соблюдать при ее использовании:

  • Метод должен быть public только
  • Он не может быть вызван из метода в том же классе (самовывоз)
  • Если используется тип возврата, он должен быть заключен в Future<T> , отл. CompletableFuture<T>

Итак, вы получите:

CompletableFuture<List<String>> categories = this.productServiceImpl.getAllCategories();

Дальнейшая обработка обусловлена ​​реализацией Future, где вы можете либо заблокировать выполнение или join больше их в одном ответе ...

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