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());
}
}
Ответы
Ответ 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() должен быть в отдельном классе