Как внедрить классы обратного вызова в контексте Spring?

1

Можно ли использовать обратные вызовы с 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?

Теги:
callback
spring
dependency-injection

1 ответ

1

Внесите свой сервис в интерфейс обратного вызова:

@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
    }
}
  • 0
    К сожалению, это невозможно: @Service - это одиночный @Service без сохранения состояния. Поэтому мне пришлось бы передать DataVO в конструктор и сохранить его в локальном поле, иначе метод повторной RetryCallback из RetryCallback не сможет его использовать. Это снова возможно только в сервисах с отслеживанием состояния.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню