Feign Hystrix命令名称无效

时间:2016-10-13 16:12:44

标签: java web-services hystrix feign

如果我只是将Hystrix Command定义为类,我可以控制定义组键和命令键,如下所示。

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

因此对于上面的代码组密钥是MyHystrixGroup,而Command Key是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

1 个答案:

答案 0 :(得分:4)

我明白了。

 FeignClientInterfaceName#MethodNameWithSignatures

正在运作。我做的错误是我的方法名称没有传入任何参数。所以对于一个假的hystrix客户端,命令名称是

 TestInterface#invoke()

例如,在问题中引用,它是

chrome.exe --app=http://mywebsite.com