Можно ли использовать обратные вызовы с Spring
чтобы они управлялись контекстом приложения?
Моя проблема заключается в том, что service
используется из внешнего через @Autowired
, но внутри этой службы есть обратный вызов, определенный с помощью new
оператора.
В следующем примере выполняется метод, который стоит повторить. Spring предлагает RetryCallback
для этого случая (я знаю, что это может быть выполнено по-другому, но просто для иллюстрации моей проблемы обратного вызова).
@Service
class MyService {
//main method invoked
void run(DataVO dataVO) {
//new operator not usable in spring context
RetryCallback<Object> retryCallback = new RetryCallback<Object>() {
@Override
public Object doWithRetry(RetryContext context) throws Exception {
return createBooking(dataVO);
}
};
}
private Object createBooking(DataVO dataVO) {
//creates the booking, worth retry on specific failures
//uses further injected/autowired services here
}
}
Можно ли реорганизовать этот фрагмент, чтобы управление обратным вызовом осуществлялось с помощью функции spring/injected/autowired?
Внесите свой сервис в интерфейс обратного вызова:
@Service
class MyService implements RetryCallback<Object> {
//main method invoked
void run(DataVO dataVO) {
}
@Override
public Object doWithRetry(RetryContext context) throws Exception {
return createBooking(dataVO);
}
private Object createBooking(DataVO dataVO) {
//creates the booking, worth retry on specific failures
//uses further injected/autowired services here
}
}
@Service
- это одиночный@Service
без сохранения состояния. Поэтому мне пришлось бы передатьDataVO
в конструктор и сохранить его в локальном поле, иначе метод повторнойRetryCallback
изRetryCallback
не сможет его использовать. Это снова возможно только в сервисах с отслеживанием состояния.