@Async не работает для метода с возвращаемым типом void - PullRequest
4 голосов
/ 30 мая 2019

Я хотел сделать метод записи в БД как асинхронный, используя аннотацию @Async.

Я пометил класс аннотацией @EnableAsync:

@EnableAsync
public class FacialRecognitionAsyncImpl {

    @Async
    public void populateDataInPushQueue(int mediaId, int studentId) {
        //myCode
    }
}

при вызове метода populateDataInPushQueue операция записи должна выполняться в другом потоке, и поток должен продолжаться из класса, который я вызываю этим методом. Но этого не происходит, и выполнение программы ожидает завершения этого метода.

Ответы [ 2 ]

5 голосов
/ 30 мая 2019

Аннотация @Async имеет несколько ограничений - проверьте, соблюдаются ли они:

  • оно должно применяться только к public методам
  • он не может быть вызван из того же класса, как определено
  • тип возврата должен быть void или Future

Следующее можно найти в документации @EnableAsync:

Обратите внимание, что режим прокси позволяет перехватывать звонки только через прокси; локальные вызовы внутри одного класса не могут быть перехвачены таким образом.

Другим фактом является то, что класс, отмеченный @EnableAsync, также должен быть @Configuration. Поэтому начните с пустого класса:

@EnableAsync
@Configuration
public class AsyncConfiguration { }
5 голосов
/ 30 мая 2019

На мой взгляд, вам не хватает аннотации @Configuration, и ваша асинхронная служба не сканируется компонентом.Вот пример фрагмента кода, который должен помочь:

@Configuration
@EnableAsync  //should be placed together.
public class FacialRecognitionAsyncService {

     @Async
     public void populateDataInPushQueue(int mediaId, int studentId) {
         //myCode
     }
} 

@Configuration
@EnableAsync
public class FacialServiceConfig {

    // this will make your service to be scanned.
    @Bean
    public FacialRecognitionAsyncService createFacialRecognitionService() {
        return new FacialRecognitionAsyncService();
    }

}

Теперь служебный компонент, который вызывает асинхронный метод.Обратите внимание, что это было введено зависимость.Таким образом, пружинные прокси AOP будут вызываться при каждом вызове facialService.Spring использует AOP в фоновом режиме для реализации @Async.

@Service
public class MyBusinessService {

@Autowire
FacialRecognitionAsyncService  facialService;

public myBusinessMethod() {
   facialService.populateDataInPushQueue()
}

Обратите внимание, что FacialService вводится в MyService посредством внедрения зависимости.

...