У меня есть эта служба bean с методом синхронизации, вызывающим внутренний метод асинхронного вызова:
@Service
public class MyService {
public worker(){
asyncJob();
}
@Async
asyncJob(){
...
}
}
Проблема в том, что asyncJob на самом деле не вызывает асинхронный путь. Я обнаружил, что это не работает, потому что внутренний вызов пропускает прокси AOP.
Итак, я пытаюсь самостоятельно присваивать bean:
@Service
public class MyService {
MyService mySelf;
@Autowired
ApplicationContext cnt;
@PostConstruct
public init(){
mySelf=(MyService)cnt.getBean("myService");
}
public worker(){
mySelf.asyncJob();
}
@Async
asyncJob(){
...
}
}
Не удалось. Снова не будет асинхронный вызов.
Итак, я попытался разделить его на два beans:
@Service
public class MyService {
@Autowired
MyAsyncService myAsyncService;
public worker(){
myAsyncService.asyncJob();
}
}
@Service
public class MyAsyncService {
@Async
asyncJob(){
...
}
}
Сбой снова.
Единственный рабочий способ - вызвать его из контроллера Bean:
@Controller
public class MyController {
@Autowired
MyAsyncService myAsyncService;
@RequestMapping("/test")
public worker(){
myAsyncService.asyncJob();
}
}
@Service
public class MyAsyncService {
@Async
public asyncJob(){
...
}
}
Но в этом случае это служебное задание... почему я не могу назвать его из Сервиса?