2016-02-15 4 views
7

私たちはこのようになりますHystrix(1.4.xの)コマンド(春を使用して)を持っている:hystrixフォールバックの予想されるエラーを適切に処理するにはどうすればよいですか?

@HystrixCommand(groupKey = "GroupKey", commandKey = "CommandKey", fallbackMethod = "myFallback") 
public List<X> findXs(long xId) { 
    return externalService.findXsExternally(xId); 
} 

私たちが実際にフォールバック方式からList(空)を返すようにしたいのではなく、例外をスローしません。その結果、findXsの発信者は、externalServiceがダウンしていることを認識し、それに応じて対応することができます。しかし同時に、Hystrixが提供する機能を利用したいと考えています。私たちの場合、呼び出し側はリストを返す代わりにエラーメッセージを返すようにします。春にはフォールバックは次のように実装されています。

public List<X> myFallback(long xId) { 
    // What to do?? Throw exception!? 
} 

myFallbackから例外を投げる「作品」が、Hystrixは私たちにそれを警告します:

はコマンドキーが失敗し、失敗したフォールバック。

e.e.e.これをフォールバックの失敗と解釈します。我々のケースでは、例外はではなく、をフォールバックの失敗として解釈するのではなく、予期した動作として解釈する必要があります。 HystrixBadRequestExceptionでスローされた例外をラップしようとしましたが、フォールバックのためには機能していないようです(docsによると、これは "run"メソッドでは機能します)。

Hystrixで例外スローフォールバック方式を実装するにはどうすればよいですか?警告を無視しても、Hystrixはこのように設計されていないのですか?

答えて

9

フォールバックを使用したくない場合は、なぜそれを設定しますか? Hystrixでは設定する必要はありません。フォールバックは、例外をスローするのではなく、古いデータをキャッシュから返す場合に使用されます。どちらのケースもHystrixの失敗としてカウントされます。フォールバックメソッドから例外をスローする場合は、サービス自体に加えてフォールバックにエラーがあったと思うHystrixを混乱させるだけです。 Hystrixは、フォールバックを提供しない場合、findXsメソッドからスローされた例外をラップするHystrixBadRequestExceptionをスローする必要があります。

+0

しかし、@ HystrixCommandで注釈が付けられた複数のメソッドがある場合、HystrixRuntimeExceptionがどこから来ているのかを区別しますか?私は、どのクライアントが持っているかに応じて違った振る舞いをしたいという問題があります。タイムアウトですが、私が知っている唯一の事はHystrixRuntimeExceptionが発生したことだけです。 – woezelmann

+0

アノテーションに** commandKey **という属性があります。あなたはそれをオフにすることができます。私はちょうどそれを** ckey **と設定してテストしましたが、ここに例外のメッセージがあります。** ckeyは失敗し、フォールバックは失敗しました**。おそらく、例外自体の中にさらに多くのメソッドがあります。試してみてください – hyness