19

Spring Boot アプリケーション内でアノテーションHystrixCommandを使用するときに失敗した理由を取得する方法はありますか? 独自の を実装すると にアクセスできる@HystrixCommandように見えますが、アノテーションを使用する場合、どうすればこれにアクセスできますか? 発生した例外の種類に基づいて、フォールバック メソッドでさまざまなことを実行できるようにしたいと考えています。これは可能ですか?HystrixCommandgetFailedExecutionException

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

4

5 に答える 5

52

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");
    }
于 2016-03-07T02:04:39.870 に答える
19

注釈で例外を取得する方法も見つかりませんでしたが、独自のコマンドを作成すると、次のように機能しました。

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();
    }

}

うまくいけば、これは他の誰かにも役立ちます。

于 2015-09-29T16:15:10.143 に答える
3

ほとんどの場合、 getFailedExecutionException().getMessage() を使用するだけで null 値が返されました。

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

これにより、常により良い結果が得られます。

于 2016-12-01T14:51:49.947 に答える
3

注釈を使用して例外を取得する方法が見つかりませんでしたが、HystrixPluginsそれを使用して登録HystrixCommandExecutionHookでき、次のように正確な例外を取得できます。

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

            }
        });

コマンド インスタンスはGenericCommand.

于 2015-09-29T12:29:08.483 に答える