Если два асинхронных метода определены в двух разных классах, вы сможете вызывать второй асинхронный метод из первого.Но если они оба находятся в одном классе, выполнение второго метода будет происходить в потоке, обрабатывающем сам первый метод.Проверьте этот ответ для получения дополнительной информации и некоторых обходных путей для того же.
Для вашего конкретного случая вы можете определить двух исполнителей пула потоков, один для первого асинхронного метода и другой дляВторой асинхронный метод.В аннотации @Async
есть параметр value
, в который можно передать исполнителя пула потоков, который следует использовать.
Ниже приведен пример использования двух исполнителей.
@SpringBootApplication
@EnableAspectJAutoProxy
@EnableAsync
public class MultipleExecutorsExample {
@Bean
public ThreadPoolTaskExecutor executor1() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(10);
threadPoolTaskExecutor.setMaxPoolSize(10);
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
@Bean
public ThreadPoolTaskExecutor executor2() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(5);
threadPoolTaskExecutor.setMaxPoolSize(5);
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
public static void main(String[] args) throws BeansException, InterruptedException {
ConfigurableApplicationContext context = new SpringApplicationBuilder(MultipleExecutorsExample.class)
.web(WebApplicationType.NONE).build().run(args);
context.getBean(Service1.class).execute();
}
}
Service1с первым асинхронным методом
@Component
@Slf4j
public class Service1 {
@Autowired
private Service2 service2;
@Async("executor1")
public void execute() throws InterruptedException {
log.info("Sleeping for 5 seconds");
for (int i = 1; i <= 10; i++) {
service2.execute();
}
}
}
Service2 со вторым асинхронным методом
@Component
@Slf4j
public class Service2 {
@Async("executor2")
public void execute() throws InterruptedException {
log.info("Sleeping for 1 seconds");
Thread.sleep(1000);
}
}
Выходные данные программы показывают, что для выполнения двух асинхронных задач используются разные исполнители.
018-05-30 18:44:27.557 INFO 19839 --- [ restartedMain] c.e.demo.tp.MultipleExecutorsExample : Started MultipleExecutorsExample in 1.926 seconds (JVM running for 2.407)
2018-05-30 18:44:27.567 INFO 19839 --- [ executor1-1] com.example.demo.tp.Service1 : Sleeping for 5 seconds
2018-05-30 18:44:27.570 INFO 19839 --- [ executor2-1] com.example.demo.tp.Service2 : Sleeping for 1 seconds
2018-05-30 18:44:27.570 INFO 19839 --- [ executor2-2] com.example.demo.tp.Service2 : Sleeping for 1 seconds
2018-05-30 18:44:27.570 INFO 19839 --- [ executor2-5] com.example.demo.tp.Service2 : Sleeping for 1 seconds