2016-10-13 8 views
2

Если у меня просто есть команда Hystrix, определенная как класс, у меня есть контроль над определением группового ключа и командного ключа, как показано ниже.Имя команды Fign Hystrix не работает

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

Я создаю экземпляр моего Притвориться клиента в классе фабрики.

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 
+0

почему есть ли понижение, которое я не понимаю. Я изо всех сил пытался понять эту проблему в течение 2 дней, и я разместил ее здесь после моих результатов, потому что это может быть полезно кому-то. Когда люди сбиты с толку, лучше, если они тоже дают причину. –

ответ

3

Я понял.

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

работает. Ошибку я сделал мое имя метода не имея каких-либо параметров, передаваемых в. Таким образом, для симулировать клиента Hystrix, имя команды

FeignClientInterfaceName#MethodNameWithSignatures 

В примере, приведенном в вопросе, то

TestInterface#invoke()