2016-10-13 1 views
2

Si je n'ai qu'une commande Hystrix définie comme classe, j'ai le contrôle sur la définition de la clé de groupe et de la commande comme ci-dessous.Le nom de la commande Feign Hystrix ne fonctionne pas

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

Donc, pour la clé de groupe de code ci-dessus est MyHystrixGroup et Command Key est MyHystrixCommand.

Si je veux mettre toutes les configurations de cette commande hystrix je peux faire comme

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

Où que ceux par défaut seront,

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

Maintenant, quand je me sers Feindre Hystrix, je Je ne définis pas le nom de la commande/le nom du groupe. Selon la documentation here, la clé de groupe correspond au nom de la cible et la clé de commande est la même que celle des clés de journalisation.

Donc, si j'ai un FeignClient comme celui-ci,

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

je crée l'instance de mon client Feindre dans une classe d'usine. Comme vous le voyez avant de retourner le client, je veux définir la configuration du délai d'attente de ma commande hystrix.

Je le teste avec un 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"); 

} 

Cela fonctionne seulement quand je régler l'heure sur défaut hystrix paramater hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds

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

Cela ne fonctionne pas. De même j'ai essayé ci-dessous des valeurs aucun d'entre eux a travaillé.

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

pourquoi Y a-t-il une downvote que je ne comprends pas? Je luttais pour comprendre ce problème pendant 2 jours et je l'ai posté ici après mes conclusions, parce que cela pourrait être utile à quelqu'un. Quand les gens réagissent, c'est mieux s'ils donnent une raison aussi. –

Répondre

3

Je l'ai compris.

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

fonctionne. L'erreur je l'ai fait était mon nom de la méthode est de ne pas avoir de paramètres transmis. Donc, pour un client feindre hystrix, le nom de la commande est

FeignClientInterfaceName#MethodNameWithSignatures 

Par exemple cité dans la question, il est

TestInterface#invoke()