2015-01-29 8 views
2

Spring 어플리케이션에서 반응기로 보낸 메시지가 손실 된 것 같습니다. 나는 이것이 메시지를 생성하기 시작한 Spring 컨테이너의 라이프 사이클 시간 때문이라고 생각한다.Spring Reactor로 메시지를 잃었습니다.

나의 특별한 경우에는 시작할 때 약간의 초기화를 수행하는 스프링 빈 (Spring Bean)이있다. 이 초기화의 일부는 원자로로 보내지는 메시지를 생성하는 것과 관련이 있습니다.

스프링이 소비자를 등록하는 순서에 문제가 있으며 소비자가 등록되기 전에 초기화 코드가 실행되었다고 생각됩니다. 시작할 때 코드를 수동으로 실행하면 (예 : 동일한 코드를 호출하는 컨트롤러에 요청을 보내면 메시지가 소비자에게 전달됩니다.

초기화 코드가 실행되는 라이프 사이클의 시간을 변경하는 다양한 방법을 시도했습니다. ApplicationListener<ContextRefreshedEvent>, ApplicationListener<ContextStartedEvent>, @PostConstruct 메서드이며, InitializingBean을 구현하는 등의 방법이 있습니다. 이러한 접근 방식 중 어느 것도 작동하지 않는 것으로 보입니다.

소비자는 @ reactor.spring.annotation.Consumer와 @ reactor.spring.annotation.Selector.Just로 주석을 달았습니다. 관련성이있는 경우 스프링 부트와 자동 구성 된 Reactor (@ EnableReactor). ApplicationContext를 새로 고칠 때까지 ConsumerBeanAutoConfiguration

답변

2

모든 것이 (초기 이벤트를 방출 콩, 그것은 같은 소리 포함) 초기화 될 때까지이 Consumer 콩에 대한 보이지 않는 것 즉, 실행되지 않습니다.

Reactor 구성을 별도의 @Configuration 빈에두고 @Import을 기본 구성에두면 주 구성이 콩 구성 및 이벤트 발생을 시작하기 전에 Reactor 구성이 완료되었는지 확인해야합니다.

+0

답장을 보내 주셔서 감사합니다. 불행히도이 문제를 해결하지 못하는 것 같습니다. 내 이해를 확인하기 위해서. 나는 더 이상 AutoConfig에 의해 제공된 Reactor에 의지하지 않습니다. 다음과 같이 내 자신을 제공합니다 : '@Bean public Reactor rootReactor (환경 ​​환경) {return Environment.getRootReactor(); }'를'@Configuration' 클래스에 추가합니다. 그런 다음 주 응용 프로그램 클래스에 다음과 같이 주석을 달았 음을 확인합니다 :'@EnableReactor @SpringBootApplication @Import (ReactorConfiguration.class)'질문 하나 더. RingBuffer에서 소비자에게 한 번 배달되지 않는 경우이 메시지는 정확히 어디로 이동합니까? –