アプリケーションの起動後にいくつかの初期スクリプトを実行するサービスがあります(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 methodEDIT2を持ってどのように主に興味
これは、アプリケーションが最初にディスカバリサービスに登録された場合にのみ実行されます。次回は、apiサービスを停止して再度実行すると、イベントは公開されません。他のイベントがありますか?
イベントを 'InstanceRegisteredEvent'に変更した場合でも、私は同じ例外を受け取ります(インスタンスを利用できません - 私はgithubにプッシュしました)。何か他に何か助けてくれる?イベントの設定オブジェクトが 'EurekaInstanceConfigBean'にキャストされ、そこからターゲットサービスのIPアドレスとポートを取得できることがわかりますが、この場合は@LoadBalanced残りのテンプレートを使用できません。この問題を調査するために何とかお手伝いできれば、教えてください。私は現在のproectでこの機能を持つ必要があります。ありがとうございます – bilak
私はリスナーを作成しました(編集された質問を参照)が、アプリケーションが再起動されるたびに実行されないという問題があります。 – bilak
アプリケーションがレジストリサーバに登録するたびに呼び出されるイベントを聴くことは可能ですか? – bilak