Spring @Async метод в методе @Async - PullRequest
0 голосов
/ 30 мая 2018

Привет, я опробовал асинхронные исполнители Springs и обнаружил, что вы можете использовать @Async.Я хотел бы знать, есть ли возможность использовать @Async в пределах @Async, требованием является необходимость делегировать задачу методу @Async, вызываемому в первом методе @Async.

Например: тамв каталоге 100 файлов, и необходимо создать задания, обрабатывающие 20 файлов в 5 потоках.

1 Ответ

0 голосов
/ 30 мая 2018

Если два асинхронных метода определены в двух разных классах, вы сможете вызывать второй асинхронный метод из первого.Но если они оба находятся в одном классе, выполнение второго метода будет происходить в потоке, обрабатывающем сам первый метод.Проверьте этот ответ для получения дополнительной информации и некоторых обходных путей для того же.

Для вашего конкретного случая вы можете определить двух исполнителей пула потоков, один для первого асинхронного метода и другой дляВторой асинхронный метод.В аннотации @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
...