Подтвердить что ты не робот

Spring загрузка. Как создать TaskExecutor с аннотацией?

Я сделал класс @Service в Spring приложении для загрузки с одним из методов, которые должны выполняться асинхронно. Поскольку я читаю метод, должен быть @Async аннотирован, а также я должен запустить TaskExecutor bean. Но в Spring manual http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html Я не нахожу никакой информации или примера, как запускать TaskExecutor с аннотацией без XML-конфигурации. Возможно ли создать TaskExecutor bean в Spring Загрузка без XML с помощью только аннотаций? Здесь мой класс обслуживания:

@Service
public class CatalogPageServiceImpl implements CatalogPageService {

    @Override
    public void processPagesList(List<CatalogPage> catalogPageList) {
        for (CatalogPage catalogPage:catalogPageList){
            processPage(catalogPage);
        }
    }

    @Override
    @Async("locationPageExecutor")
    public void processPage(CatalogPage catalogPage) {
        System.out.println("print from Async method "+catalogPage.getUrl());
    }
}
4b9b3361

Ответ 1

Добавьте @Bean метод в ваш класс Spring Boot:

@SpringBootApplication
@EnableAsync
public class MySpringBootApp {

    @Bean
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(25);
        return executor;
    }

    public static void main(String[] args) {
        // ...
    }
}

См. Конфигурация контейнера на Java в справочной документации Spring Framework о том, как настроить Spring, используя конфигурацию Java вместо XML.

(Примечание: вам не нужно добавлять @Configuration в класс, потому что @SpringBootApplication уже включает @Configuration).

Ответ 2

Сначала - перейдите по правилам - @Async имеет два ограничения:

  • он должен применяться только к общедоступным методам.
  • self-invocation - вызов метода async из одного класса - не работает

Итак, ваш метод processPage() должен быть в отдельном классе