2017-03-29 19 views
1

Spring Cloud Stream Dispatcherにサブスクライバがありません。エラーです。Spring Cloud Stream Dispatcherにサブスクライバがありません

バンプブートコンテナが正常に起動したら、カフカのトピックにいくつかの通知メッセージを入れる必要があり、いくつかのマイクロサービスは同じ機能を果たします。このため、出力チャンネル定義とディスパッチを含む共通のジャーユーティリティ。また、SpringApplication.runの呼び出しのあとにutilを呼び出す限り、機能は期待通りに機能します。

以下は、マイクロサービスアプリケーションクラスのサンプルの1つです。

@SpringBootApplication 
public class Application { 
    public static void main(String[] args) { 
     ConfigurableApplicationContext context =SpringApplication.run(Application.class, args); 
     context.getBean(SchedulerConsumerUtils.class).registerOrRestartConsumerJobs(); 
    } 
} 

予想通り上記の設定の作品は、しかし、これは、不必要な負担ごとmicroserviceのボイラーテンプレートコードを書くために、開発者を置きます。したがって、これを避けるために、同じ機能を実行するAspect実装を記述しましたが、アスペクトアプローチでは以下のエラーが発生しています。

org.springframework.context.ApplicationContextException:Bean 'outputBindingLifecycle'を開始できませんでした。ネストされた例外はorg.springframework.messaging.MessageDeliveryExceptionです:Dispatcherに 'schedulertestsvcs:dev:1180.scheduledJobExecutionResponseOutput'チャネルのサブスクライバがありません。ネストされた例外はorg.springframework.integration.MessageDispatchingExceptionです:ディスパッチャは、我々はすべてのカフカ出力/入力チャネル起動完了のハンドルを取得するために春SmartLifeCycleのようないくつかのアプローチを試みたが、それらのすべてがに実行しているサブスクライバー

を持っていません同じエラー。続き

が私たちのデバッグセッション中にorg.springframework.boot.SpringApplication.run(..)

@Aspect 
@Component 
public class SchedulerConsumerAspect { 

    @Autowired 
    protected ApplicationContext applicationContext; 
    @AfterReturning(value = "execution(* org.springframework.boot.SpringApplication.run(..))",returning = "result") 
    public void afterConsumerApplicationStartup(JoinPoint pjp, Object result) throws Throwable { 
     if(result!=null){ 
      ConfigurableApplicationContext context=(ConfigurableApplicationContext) result; 
      if(context.containsBean("schedulerConsumerUtils")){ 
       //For what ever reason the following call resulting in Dispatcher has no subscribers for channel error. 
       //TODO fix the above issue and enable the following call. 
       context.getBean(SchedulerConsumerUtils.class).registerOrRestartConsumerJobs(); 
      } 
     } 
    } 

} 

上の私たちのアスペクトの実装では、我々は(org.springframework.boot.SpringApplication.runを見つけました。.. )アスペクトは、ブートストラッププロセス中に数回呼び出されました。最初にアスペクトが呼び出されたときに結果の値がnullになりました。しばらくしてから、春のブートが同じアスペクトを呼び出すと、結果はnullになりません。 nullでない結果を取得した後でも、コンポーネントが完全に初期化されているため、受領者がいないため、context.containsBean( "schedulerConsumerUtils")のチェックが表示されます。しかし、Beanの初期化後、出力チャネルは完全に束縛されていません。

Spring Cloud Stream Kafkaの出力/入力チャンネルのバインディングの完了を処理する最も良い方法は何ですか?

なぜコンポーネント呼び出しはSpringBootアプリケーションでうまく動作しますが、Aspectでは動作しませんか?私はこの数日で苦労して、適切な解決策を見つけることができませんでした。どんな助けでも大歓迎です。

答えて

0

私はこのポストSpring cloud stream - send message after application initalizationからの提案に従い、3番目のオプションApplicationRunnerを使用しました。最初の2つのオプションは私のためには機能しませんでした。

@Component 
public class AppStartup implements ApplicationRunner { 
    @Autowired 
    protected ApplicationContext applicationContext; 

    @Override 
    public void run(ApplicationArguments args) throws Exception { 
     if(applicationContext!=null){ 
      applicationContext.getBean(SchedulerConsumerUtils.class).registerOrRestartConsumerJobs(); 
     } 
    } 
} 
関連する問題