2015-09-28 6 views
8

HystrixCommandがSpringブートアプリケーション内で@HystrixCommandアノテーションを使用しているときに理由を取得する方法がありますか?あなた自身のHystrixCommandを実装すると、getFailedExecutionExceptionにアクセスできるようですが、注釈を使用するときにどのようにこれにアクセスできますか?発生した例外のタイプに基づいてフォールバックメソッドでさまざまなことを実行できるようにしたいと思います。これは可能ですか?@HystrixCommandフォールバックメソッドで障害例外を取得する

私はnoteHystrixRequestContext.initializeContext()を見ましたが、HystrixRequestContextには何もアクセスできません。例外にアクセスするには、そのコンテキストを使用する別の方法がありますか?

HystrixPlugins.getInstance().registerCommandExecutionHook(new HystrixCommandExecutionHook() { 
      @Override 
      public <T> void onFallbackStart(final HystrixInvokable<T> commandInstance) { 

      } 
     }); 

答えて

7

私はどちらかの注釈を持つ例外を取得する方法を見つけましたが、私自身のコマンドを作成するので、のように私のために働いていない:

public static class DemoCommand extends HystrixCommand<String> { 

    protected DemoCommand() { 
     super(HystrixCommandGroupKey.Factory.asKey("Demo")); 
    } 

    @Override 
    protected String run() throws Exception { 
     throw new RuntimeException("failed!"); 
    } 

    @Override 
    protected String getFallback() { 
     System.out.println("Events (so far) in Fallback: " + getExecutionEvents()); 
     return getFailedExecutionException().getMessage(); 
    } 

} 

がうまくいけば、これは、同様に他の誰かを助けます。

2

ことで、あなたはHystrixCommandExecutionHookを登録することができますし、このようにその正確な例外を取得することができ、私は注釈付きの例外を取得する方法を見つけることができませんでしたが、私はHystrixPluginsを見つけましたコマンドインスタンスはGenericCommandです。

+0

しかし、それは一般的にコマンドの実行ごとにそれらを捕らえ、特定のコマンドの実行には拘束されません。私が後にしたものではありませんが、失敗について知る必要がある場合にはまだ役立つことがあります。 –

24

フォールバックメソッドにThrowableパラメータを追加するだけで、元のコマンドで生成された例外が受信されます。 https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-javanica

@HystrixCommand(fallbackMethod = "fallback1") 
    User getUserById(String id) { 
     throw new RuntimeException("getUserById command failed"); 
    } 

    @HystrixCommand(fallbackMethod = "fallback2") 
    User fallback1(String id, Throwable e) { 
     assert "getUserById command failed".equals(e.getMessage()); 
     throw new RuntimeException("fallback1 failed"); 
    } 
1

から

(ちょうどgetFailedExecutionExceptionを使用してほとんどの時間)。のgetMessage()は私にnull値を与えました。

Exception errorFromThrowable = getExceptionFromThrowable(getExecutionException()); 
    String errMessage = (errorFromThrowable != null) ? errorFromThrowable.getMessage() 

これは常に良い結果をもたらします。