Как заставить аннотацию Aysnc работать в Spring Boot? - PullRequest
1 голос
/ 30 октября 2019

Я создал простое приложение для весенней загрузки с запланированным (@Scheduled) заданием. В этой запланированной задаче я хотел бы вызвать асинхронную функцию с @Async, но я вижу, что она все еще выполняется в потоке планирования без переключения на другой поток. Я также пытался настроить исполнителя, но не повезло. Вот несколько кодов. Я также уже включил асинхронность в основном классе

    public class scheduledService {
    @Scheduled(fixedRateString = "${config.scheduleInterval}")
    public void pollDataWithFixSchedule() {
        AsyncService service = new AsyncService();
        service.asyncCall();
        service.asyncCall();
        service.asyncCall();
 asyncCall();
    }
}
    public class AsyncService {
    @Async()
    public void asyncCall(){
       System.out.printly("Current thread -- {}",Thread.currentThread().getName()))
       Thread.sleep(10000);
    }
}
    @Bean(name = "MyThreadPoolExecutor")
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(7);
        executor.setMaxPoolSize(42);
        executor.setQueueCapacity(11);
        executor.setThreadNamePrefix("MyThreadPoolExecutor-");
        executor.initialize();
        return executor;
    }
@SpringBootApplication
@EnableScheduling
@EnableAsync
public class ScheduledApplication {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(ScheduledApplication.class);
        application.setBannerMode(Banner.Mode.OFF);
        application.run(args);
    }
}

Ответы [ 4 ]

1 голос
/ 30 октября 2019

в соответствии с Baeldung :

@ Async имеет два ограничения:

  • оно должно применяться только к публичным методам
  • Самовывоз - вызов асинхронного метода из одного и того же класса - не будет работать

Причины просты - метод должен быть открытым, чтобы его можно было проксировать. И самовывоз не работает, потому что он обходит прокси и напрямую вызывает основной метод. так что вы можете поместить свой асинхронный метод в службу и использовать его оттуда

0 голосов
/ 30 октября 2019

вам нужно автоматически подключить AsyncService , не создавайте новый объект, такой как

AsyncService service = new AsyncService ();

Кроме того, аннотируйтеваш класс scheduleService с @Service или @ Component

@Service
public class scheduledService {
    @Autowired
    private AsyncService service ;

    @Scheduled(fixedRateString = "${config.scheduleInterval}")
    public void pollDataWithFixSchedule() {
        service.asyncCall();
        service.asyncCall();
        service.asyncCall();

    }
}
0 голосов
/ 30 октября 2019

Используйте @EnableAsync в верхней части класса, где вы создаете асинхронный компонент, а не в ScheduledApplication.

0 голосов
/ 30 октября 2019

Не вызывайте асинхронные методы в одном и том же классе. @Component Поместите асинхронные задачи в один класс и добавьте @ компонент к этому классу

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