私のアプリケーションのコマンドのいくつかが失敗することに気づきました
Caused by: ! com.netflix.hystrix.exception.HystrixRuntimeException: GetAPICommand timed-out and no fallback available.
out: ! at com.netflix.hystrix.HystrixCommand.getFallbackOrThrowException(HystrixCommand.Java:1631)
out: ! at com.netflix.hystrix.HystrixCommand.access$2000(HystrixCommand.Java:97)
out: ! at com.netflix.hystrix.HystrixCommand$TimeoutObservable$1$1.tick(HystrixCommand.Java:1025)
out: ! at com.netflix.hystrix.HystrixCommand$1.performBlockingGetWithTimeout(HystrixCommand.Java:621)
out: ! at com.netflix.hystrix.HystrixCommand$1.get(HystrixCommand.Java:516)
out: ! at com.netflix.hystrix.HystrixCommand.execute(HystrixCommand.Java:425)
out: Caused by: ! Java.util.concurrent.TimeoutException: null
out: !... 11 common frames omitted
これは私のHystrix設定のオーバーライドです:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=210000
hystrix.threadpool.default.coreSize=50
hystrix.threadpool.default.maxQueueSize=100
hystrix.threadpool.default.queueSizeRejectionThreshold=50
これはどのようなタイムアウトですか?外部アプリケーションへの読み取り/接続タイムアウトですか?これをデバッグするにはどうすればよいですか?
これはHystrixコマンドタイムアウトです。このタイムアウトはコマンドごとにデフォルトで有効になっており、プロパティを使用して値を定義します。
execution.isolation.thread.timeoutInMilliseconds:このプロパティは、呼び出し元がタイムアウトを監視してコマンド実行から離れるまでの時間をミリ秒単位で設定します。 Hystrixは、HystrixCommandをTIMEOUTとしてマークし、フォールバックロジックを実行します。
そのため、プロパティを使用して、コマンドのタイムアウト値を増やすか、デフォルトのタイムアウトを無効にすることができます(該当する場合)。
@HystrixProperty(name = "hystrix.command.default.execution.timeout.enabled", value = "false")
詳細については、こちらをご覧ください: https://github.com/Netflix/Hystrix/wiki/Configuration#CommandExecution
デバッグ中であるか、接続が遅すぎる可能性があります。デフォルトのスレッド実行タイムアウトは1秒に過ぎないため、コマンドにブレークポイントを設定すると、このメッセージを簡単に取得できます。
これはあなたの場合ではありませんが、他の誰かを助けるかもしれませんが
スタックトレースを見ると、これは上記で定義した210秒後にHystrixによってスローされる例外です。
TimeoutException
はチェック例外であるため、この例外をスローする可能性のある各メソッドで宣言する必要があります。これは、コードのrun()
メソッドで宣言されています。
これは他のプログラムと同様にデバッグできますが、run()
メソッドは呼び出し元とは別のスレッドで実行されることに注意してください。 210秒後、呼び出し元はデバッグセッションにもかかわらず続行します。