2

アプリケーションの起動後にいくつかの初期スクリプトを実行するサービスがあります(ApplicationListener<ApplicationReadyEvent>で実装されています)。このスクリプトでは、RestTemplateという別のサービス(@LoadBalanced)を呼び出す必要があります。サービスへの呼び出しが呼び出されると、リモートサービスのインスタンスに関する情報はありません。なぜなら、ディスカバリサーバーはその時点では連絡が取られていないからです(私は推測します)。発見サービス(ユーレカ)に対するロードバランスリボンクライアントの初期化

java.lang.IllegalStateException: No instances available for api-service 
    at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:79) 

そうな方法は、私のinitスクリプトが実行される前に、アプリケーションの起動時に発見サーバから利用可能なサービスのリストを取得する方法がありますか?

おかげ

編集: 問題は、現在の環境(DEV)内のすべてのサービスを1つのサービス(APIサービス)で一緒に結ばれていることを、事実に複数の関連です。ですから、api-serviceの中から、自分自身について知りません@LoadBalancedクライアントapi-serviceを呼び出そうとしていますか? api-service(self)が利用可能になるときに知っているリスナーなどを登録できますか?

hereはサンプルアプリケーションです。

EurekaEventListener initializerListener = new InitializerListener(discoveryClient, restTemplate); 
discoveryClient.registerEventListener(initializerListener); 
:は

今すぐ

public static class InitializerListener implements EurekaEventListener { 

    private EurekaClient eurekaClient; 
    private RestOperations restTemplate; 

    public InitializerListener(EurekaClient eurekaClient, RestOperations restTemplate) { 
     this.eurekaClient = eurekaClient; 
     this.restTemplate = restTemplate; 
    } 

    @Override 
    public void onEvent(EurekaEvent event) { 
     if (event instanceof StatusChangeEvent) { 
      if (((StatusChangeEvent) event).getStatus().equals(InstanceInfo.InstanceStatus.UP)) { 
       ResponseEntity<String> helloResponse = restTemplate.getForEntity("http://api-service/hello-controller/{name}", String.class, "my friend"); 
       logger.debug("Response from controller is {}", helloResponse.getBody()); 
       eurekaClient.unregisterEventListener(this); 
      } 
     } 
    } 
} 

EurekaListener

を作成し、このようにそれを登録するための解決策があるかもしれません:私は働い this method

EDIT2を持ってどのように主に興味

これは、アプリケーションが最初にディスカバリサービスに登録された場合にのみ実行されます。次回は、apiサービスを停止して再度実行すると、イベントは公開されません。他のイベントがありますか?

答えて

4

現在、Camden以前では、他のアプリケーションを照会する前に、アプリケーションをEurekaに登録する必要があります。あなたのコールは、登録ライフサイクルで早すぎる可能性があります。役に立つかもしれないInstanceRegisteredEventがあります。 Dalstonリリースの列車でこれを処理する計画があります。

+0

イベントを 'InstanceRegisteredEvent'に変更した場合でも、私は同じ例外を受け取ります(インスタンスを利用できません - 私はgithubにプッシュしました)。何か他に何か助けてくれる?イベントの設定オブジェクトが 'EurekaInstanceConfigBean'にキャストされ、そこからターゲットサービスのIPアドレスとポートを取得できることがわかりますが、この場合は@LoadBalanced残りのテンプレートを使用できません。この問題を調査するために何とかお手伝いできれば、教えてください。私は現在のproectでこの機能を持つ必要があります。ありがとうございます – bilak

+0

私はリスナーを作成しました(編集された質問を参照)が、アプリケーションが再起動されるたびに実行されないという問題があります。 – bilak

+0

アプリケーションがレジストリサーバに登録するたびに呼び出されるイベントを聴くことは可能ですか? – bilak

関連する問題