2015-01-29 3 views
2

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

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

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

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

Мои потребители аннотируются с помощью @ reactor.spring.annotation.Конкурс и методы с @ reactor.spring.annotation.Selector.Просто в случае, если это имеет значение, я использую Spring Boot и автоконфигурированный реактор (@ EnableReactor).

ответ

2

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

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

+0

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