Потерянные сообщения с Spring Reactor

Кажется, я теряю сообщения, отправленные в реактор в моем приложении Spring. Я подозреваю, что это связано с тем временем в жизненном цикле контейнера Spring, когда я начинаю создавать сообщения.

В моем конкретном случае использования есть Spring Bean, который выполняет некоторую инициализацию при запуске. Часть этой инициализации включает создание сообщения, которое отправляется в Reactor.

Я подозреваю, что существует проблема с порядком, в котором Spring регистрирует потребителей, и что код инициализации был запущен до того, как потребители были зарегистрированы. Если я запустил код вручную после запуска, например сделать запрос к контроллеру, который вызывает тот же код, что и сообщения, поступающие к потребителю.

Я пробовал различные способы изменения времени в жизненном цикле, в котором запускается код инициализации, например ApplicationListener<ContextRefreshedEvent>, ApplicationListener<ContextStartedEvent>, @PostConstruct, реализация InitializingBean и так далее. Ни один из этих подходов не работает.

Мои потребители помечаются @ response.spring.annotation.Consumer, а методы - @ response.spring.annotation.Selector. Просто в случае необходимости я использую Spring Boot и автоматически настраиваемый Reactor (@EnableReactor).


person David    schedule 29.01.2015    source источник


Ответы (1)


ConsumerBeanAutoConfiguration не запускается, пока не обновится ApplicationContext, что означает, что он не будет искать Consumer beans, пока все не будет инициализировано (включая, похоже, bean-компоненты, которые генерируют начальные события).

Если вы поместите свою конфигурацию Reactor в отдельный @Configuration bean и @Import в свою основную конфигурацию, это должно убедиться, что конфигурация Reactor завершена, прежде чем ваша основная конфигурация начнет настраивать bean-компоненты и генерировать события.

person Jon Brisbin    schedule 29.01.2015
comment
Спасибо за ответ! К сожалению, это тоже не решает проблему. Просто чтобы подтвердить мое понимание; Я больше не полагаюсь на Reactor, предоставляемый AutoConfig. Теперь я предлагаю свои собственные, а именно: @Bean public Reactor rootReactor(Environment environment) {return Environment.getRootReactor(); } в @Configuration классе. Затем я гарантирую, что мой основной класс приложения помечен: @EnableReactor @SpringBootApplication @Import(ReactorConfiguration.class) Еще один вопрос; Куда именно отправляются эти сообщения, если они не доставляются потребителям один раз в RingBuffer? - person David; 29.01.2015