0

Spring Cloud Dalston.SR4/Spring Boot 1.5.9からSpring Cloud Edgware/Spring Boot 1.5.9へのSpring Cloud DataFlowサービスのアップグレードをテストしています。私のサービスの中には、アプリスターターのソース(またはシンク)コンポーネントを拡張するものがあります。私はこれがSpring Cloud Edgwareでは動作しないことを発見しました。オーバーライドされたRabbitSourceConfiguration(app starters)はSpring Cloud Edgwareで動作しません

たとえば、私はorg.springframework.cloud.stream.app.rabbit.source.RabbitSourceConfigurationをオーバーライドし、私のアプリケーションをオーバーライドしたバージョンにバインドしました。以前はSpring Cloudのバージョンがほぼ一年前に戻ってきました。エッジウェアで

、私は(アプリはスタンドアロンで実行したり、データフロー内にあるかどうか)は、次の取得:

*************************** 
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. 

私は春の1.3.0.RELEASEと1.2.0.RELEASEと同じ動作を得ます-cloud-starter-stream-rabbitです。

私はRabbitSourceConfigurationをオーバーライドするので、AmqpInboundChannelAdapterにヘッダーマッパーを設定し、コンテナを起動する前に接続テストを実行することができます。

私のサブクラスは、@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(); 
    } 
} 
+0

あなたの 'RabbitSourceConfiguration'を表示してください。 –

+0

元の質問にconfigクラスを追加しました。 – bikerlad

答えて

0

あなたは本当に@Bean定義内healthCheck.health();のようなものを行うべきではありません。アプリケーションコンテキストはまだ完全にベークされていないか、起動されていません。 Beanが作成される順序に応じて、動作しても動作しなくてもかまいません。

アプリが起動しないようにするには、SmartLifecycleを実装するBeanを追加し、Beanを後期(値が大きい)に配置して、他のすべての後に開始するようにします。次にコードをstart()に入れてください。 autStartupがtrueである必要があります。

この場合、ストリームインフラストラクチャがチャネルを作成する前に実行されています。

一部の注文は以前のリリースから変更されている可能性がありますが、いずれの場合でも@Bean定義のこのような活動を行うことは危険です。

あなたはたまたま前に幸運だった。私はちょうどあなたの@EnableBindingが間違って気づい

EDIT

Source.classである必要があります。私はそれが今までにどのように働いているのかわかりません。つまり、というフィールドのchannelsフィールドのBeanが作成されます。

これは、ストリームと1.3.0.RELEASEにバインダーを更新した後、私のために正常に動作します...

@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); 
    } 

} 

問題が解決しない場合は、質問を編集してくださいPOMを表示する

+0

[OK]をクリックして健康診断を受けても、私の元の質問には答えられません。私はRabbitSourceConfigurationの空のオーバーライドを持つことができ、まだEdgwareはSourceを見つけられないと不平を言う。確かに、私はEdgwareですべて失敗するアプリケーションスターターのソースとシンク(ヘルスチェックなし)のオーバーライドされた類似のケースがあります。ヘルスチェックは赤ちゃんです。 – bikerlad

+0

あなたの '@ EnableBinding'は間違っています - 自分の編集を見てください。 –

+0

それは動作します!メインアプリケーションクラスをSource.classにバインドしようとしましたが、それ自体は機能しませんでした。あなたの例は何がうまくいったのですか? appクラスをSource.class *にバインドし、*サブクラスの設定を@Configurationとしてマークします。ご協力いただきありがとうございます。 – bikerlad

関連する問題