4

クラスとして定義された Hystrix コマンドがある場合、以下のようにグループ キーとコマンド キーの定義を制御できます。

     private static class MyHystrixCommand extends HystrixCommand<MyResponseDto> {
               public MyHystrixCommand() {
        super(HystrixCommandGroupKey.Factory.asKey("MyHystrixGroup"));
     }

したがって、上記のコード グループ キーは MyHystrixGroup であり、コマンド キーは MyHystrixCommand です。

この hystrix コマンドの構成を設定したい場合は、次のようにできます

      ConfigurationManager.getConfigInstance().setProperty(
                                "hystrix.command.MyHystrixCommand.execution.timeout.enabled", false); 

デフォルトのものはどこにあるのか、

       ConfigurationManager.getConfigInstance().setProperty(
                "hystrix.command.default.execution.timeout.enabled", false);

現在、Feign Hystrix を使用しているとき、コマンド名/グループ名を定義していません。ドキュメントhereに従って、グループ キーはターゲット名と一致し、コマンド キーはログ キーと同じです。

したがって、このような FeignClient がある場合、

     interface TestInterface {
        @RequestLine("POST /")
        String invoke() throws Exception;
     }

ファクトリ クラスで Feign クライアントのインスタンスを作成します。

   class TestFactory {

    public TestInterface newInstance() {

        ConfigurationManager.getConfigInstance()
            .setProperty("hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds", 500);

        return HystrixFeign.builder()
            .target(TestInterface.class, "http://localhost:" + server.getPort(), (FallbackFactory) new FallbackApiRetro());
    }

 }

クライアントを返す前にわかるように、hystrix コマンドのタイムアウト構成を設定したいと考えています。

MockWebServer でテストしています。

  @Test
public void fallbackFactory_example_timeout_fail() throws Exception {

    server.start();
    server.enqueue(new MockResponse().setResponseCode(200)
        .setBody("ABCD")
        .setBodyDelay(1000, TimeUnit.MILLISECONDS));

    TestFactory factory = new TestFactory();
    TestInterface api = factory.newInstance();
    // as the timeout is set to 500 ms, this case should fail since i added 1second delay in mock service response.
    assertThat(api.invoke()).isEqualTo("Fallback called : foo");

}

これは、デフォルトの hystrix パラメータ hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds にタイムアウトを設定した場合にのみ機能します

    ConfigurationManager.getConfigInstance()
        .setProperty("hystrix.command.invoke.execution.isolation.thread.timeoutInMilliseconds", 500); 

これはうまくいきませんでした。同様に、以下の値を試しましたが、どれも機能しませんでした。

  hystrix.command.TestInterface#invoke(String).execution.isolation.thread.timeoutInMilliseconds
hystrix.command.TestInterface#invoke.execution.isolation.thread.timeoutInMilliseconds
4

1 に答える 1

5

私はそれを考え出した。

  ConfigurationManager.getConfigInstance().setProperty("hystrix.command.TestInterface#invoke().execution.isolation.thread.timeoutInMilliseconds",500);

は働いている。私が犯した間違いは、メソッド名にパラメーターが渡されていなかったことです。したがって、偽の hystrix クライアントの場合、コマンド名は次のようになります。

 FeignClientInterfaceName#MethodNameWithSignatures

たとえば、質問で引用されているのは、

 TestInterface#invoke()
于 2016-10-13T16:15:45.010 に答える