当前位置: 首页 > 知识库问答 >
问题:

重写的RabbitSourceConfiguration(应用程序启动程序)不适用于Spring Cloud Edgware

常经赋
2023-03-14

我正在测试我的Spring Cloud DataFlow服务从Spring Cloud Dalston.sr4/Spring Boot 1.5.9升级到Spring Cloud Edgware/Spring Boot 1.5.9。我的一些服务扩展了应用程序初学者的源(或接收器)组件。我发现这不适用于Spring Cloud Edgware。

例如,我已经重写了org.springframework.cloud.stream.app.rabbit.source.rabbitSourceConfiguration并将我的应用程序绑定到重写的版本。这在一年前的Spring Cloud版本中就已经起到了作用。

使用Edgware,我得到以下结果(无论应用程序是独立运行还是在数据流中运行):

***************************
APPLICATION FAILED TO START
***************************

Description:

Field channels in org.springframework.cloud.stream.app.rabbit.source.RabbitSourceConfiguration required a bean of type 'org.springframework.cloud.stream.messaging.Source' that could not be found.


Action:

Consider defining a bean of type 'org.springframework.cloud.stream.messaging.Source' in your configuration.

spring-cloud-starter-stream-rabbit的1.3.0.release和1.2.0.release的行为与此相同。

我的子类通过@enableBinding(HeaderMapperRabbitSourceConfiguration.class)绑定到Spring Boot应用程序。我的子类的一个精简版本是:

public class HeaderMapperRabbitSourceConfiguration extends RabbitSourceConfiguration {

    public HeaderMapperRabbitSourceConfiguration(final MyHealthCheck healthCheck,
                                                 final MyAppConfig config) {
        // ...
    }

    @Bean
    @Override
    public AmqpInboundChannelAdapter adapter() {
        final AmqpInboundChannelAdapter adapter = super.adapter();
        adapter.setHeaderMapper(new NotificationHeaderMapper(config));

        return adapter;
    }

    @Bean
    @Override
    public SimpleMessageListenerContainer container() {
        if (config.performConnectivityCheckOnStartup()) {

            if (LOGGER.isInfoEnabled()) {
                LOGGER.info("Attempting connectivity with ...");
            }
            final Health health = healthCheck.health();
            if (health.getStatus() == Status.DOWN) {
                LOGGER.error("Unable to connect .....");
                throw new UnableToLoginException("Unable to connect ...");
            } else if (LOGGER.isInfoEnabled()) {
                LOGGER.info("Connectivity established with ...");
            }
        }

        return super.container();
    }
}

共有1个答案

商同化
2023-03-14

您确实不应该在@bean定义中执行healthcheck.health();之类的操作。应用程序上下文尚未完全烘焙或启动;它可能工作,也可能不工作,这取决于bean创建的顺序。

如果您想阻止应用程序启动,请添加一个实现SmartLifecycle的bean,将该bean置于后期阶段(高值),以便它在其他所有操作之后启动。然后将代码放在start()中。AutStartup必须为true。

在本例中,它是在流基础结构创建通道之前运行的。

我刚刚注意到您的@enablebinding是错误的;应该是source.class。我看不出这是如何工作的--这就是为source类型的channels字段创建bean的原因。

在将stream和绑定器更新到1.3.0后,这对我来说很好。发布...

@Configuration
public class MySource extends RabbitSourceConfiguration {

    @Bean
    @Override
    public AmqpInboundChannelAdapter adapter() {
        AmqpInboundChannelAdapter adapter = super.adapter();
        adapter.setHeaderMapper(new MyMapper());
        return adapter;
    }


}

@SpringBootApplication
@EnableBinding(Source.class)
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}
 类似资料:
  • 问题内容: 我愿意在应用程序中添加一个按钮,单击该按钮将重新启动该应用程序。我搜索谷歌,但没有发现任何有用的,除了这一个。但是,此处遵循的过程违反了Java的WORA概念。 是否有其他以Java为中心的方法来实现此功能?是否可以只派生另一个副本然后退出? 提前致谢。我感谢您的帮助。 @deporter我已经尝试过您的解决方案,但是它不起作用:( @mKorbel我写的,采取的概念下面的代码,你曾在

  • 我已将WatchKit应用程序配置为在iPhone 6上运行,WatchKit应用程序方案可执行文件指向WatchKit应用程序。app,Watch界面指向Main,但IOS应用程序并不仅仅启动WatchKit应用程序。 当我选择WatchKit应用程序在苹果6上运行时,苹果6模拟器正在启动,在模拟器返回到IOS级别后,我看到一秒钟的黑屏,但主应用程序没有启动,只有苹果手表模拟器上的WatchKi

  • 我正在遵循斯普林特启动的15分钟指南(gs-关系-数据-访问) 因此,该指南使用H2数据库。现在我通过在运行时提供JAR来改变这一点,以使用DB2。 改良build.gradle 现在应用程序失败了,抱怨没有找到JDBCTemplateBean定义或类似的东西。 所以现在我进一步修改了build.gradle注释掉sping-jdbc,并使用sping-boo-starter-jdbc 现在,应用

  • 当我在Android手机上调试应用程序时,我绝对没有遇到任何错误,但在AVD上,我一开始就得到了一个NullPointerException()。我的Android设备在22 API的Lollipop(5.1.1)上运行,我的AVD在28 API的Pie(9.0)上运行。我在gradle中将最小SDK设置为21,编译SDK设置为28。 这是错误: E/AndroidRuntime:致命异常:主进程

  • 我是appium的新手,目前正在尝试创建一些简单的测试。我的问题是我根本无法启动正在测试的应用程序,它唯一有效的时间是使用appium-dotnet-驱动程序解决方案中包含的演示应用程序通过github提供 https://github.com/appium/appium-dotnet-driver 我已经在我的Nexus 5和几个模拟器上尝试了2个不同的应用程序,但没有任何效果(请参阅下面的附加

  • 我在intellij上启动spring boot应用程序时遇到问题,它失败了,并显示以下消息:与目标VM断开连接,地址:'127.0.0.1:49784',传输:'socket' 过程结束,退出代码为255。以前有人遇到过这种情况吗?