Feign Hystrix 命令名称不起作用
Feign Hystrix command name not working
如果我只有一个定义为 class 的 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。
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);
这没有用。
同样,我尝试了以下值 none,其中的值有效。
hystrix.command.TestInterface#invoke(String).execution.isolation.thread.timeoutInMilliseconds
hystrix.command.TestInterface#invoke.execution.isolation.thread.timeoutInMilliseconds
我想通了。
ConfigurationManager.getConfigInstance().setProperty("hystrix.command.TestInterface#invoke().execution.isolation.thread.timeoutInMilliseconds",500);
正在工作。我犯的错误是我的方法名没有传入任何参数。所以对于一个 feign hystrix 客户端,命令名是
FeignClientInterfaceName#MethodNameWithSignatures
例如问题中引用的例子是
TestInterface#invoke()
如果我只有一个定义为 class 的 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。
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);
这没有用。 同样,我尝试了以下值 none,其中的值有效。
hystrix.command.TestInterface#invoke(String).execution.isolation.thread.timeoutInMilliseconds
hystrix.command.TestInterface#invoke.execution.isolation.thread.timeoutInMilliseconds
我想通了。
ConfigurationManager.getConfigInstance().setProperty("hystrix.command.TestInterface#invoke().execution.isolation.thread.timeoutInMilliseconds",500);
正在工作。我犯的错误是我的方法名没有传入任何参数。所以对于一个 feign hystrix 客户端,命令名是
FeignClientInterfaceName#MethodNameWithSignatures
例如问题中引用的例子是
TestInterface#invoke()