【问题标题】:Lost messages with Spring Reactor使用 Spring Reactor 丢失消息
【发布时间】:2015-03-28 22:21:53
【问题描述】:

我的 Spring 应用程序中似乎丢失了发送到反应器的消息。我怀疑这是由于在 Spring 容器的生命周期中我开始产生消息的时间。

在我的特定用例中,有一个 Spring Bean 在启动时执行一些初始化。此初始化的一部分涉及生成发送到 Reactor 的消息。

我怀疑 Spring 注册消费者的顺序存在问题,并且初始化代码在消费者注册之前已经运行。如果我在启动后手动运行代码,例如向调用相同代码的控制器发出请求,然后将消息发送给消费者。

我尝试了各种方法来更改初始化代码运行的生命周期中的时间,例如ApplicationListener<ContextRefreshedEvent>ApplicationListener<ContextStartedEvent>@PostConstruct方法,实现InitializingBean等等。这些方法似乎都不起作用。

我的消费者使用 @reactor.spring.annotation.Consumer 注释,方法使用 @reactor.spring.annotation.Selector 注释。如果相关,我使用 Spring Boot 和自动配置的 Reactor (@EnableReactor )。

【问题讨论】:

    标签: spring reactor project-reactor


    【解决方案1】:

    ConsumerBeanAutoConfigurationApplicationContext 被刷新之前不会运行,这意味着它不会在所有内容都被初始化之前寻找Consumer bean(包括,听起来像是发出初始事件的bean)。

    如果您将 Reactor 配置放在单独的 @Configuration bean 和 @Import 上,将其放入主配置中,则应确保在主配置开始配置 bean 和发出事件之前完成 Reactor 配置。

    【讨论】:

    • 感谢您的回复!不幸的是,这似乎也不能解决问题。只是为了确认我的理解;我不再依赖 AutoConfig 提供的 Reactor。我现在提供我自己的,如下所示:@Bean public Reactor rootReactor(Environment environment) {return Environment.getRootReactor(); }@Configuration 类中。然后我确保我的主应用程序类被注释:@EnableReactor @SpringBootApplication @Import(ReactorConfiguration.class) 还有一个问题;如果没有在 RingBuffer 上一次将这些消息传递给消费者,这些消息究竟会去哪里?
    猜你喜欢
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 2016-12-21
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多