クラスとして定義された 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