4

If I just have a Hystrix Command defined as class, i have control over defining the group key and command key like below.

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

So for the above code group key is MyHystrixGroup and Command Key is MyHystrixCommand.

If i want to set any configurations of this hystrix command i can do like

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

Where as the default ones will be,

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

Now when I am using Feign Hystrix, I am not defining the command name/ group name. As per the documentation here, the group key matches the target name and command key are same as logging keys.

So if I have a FeignClient like this,

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

I create the instance of my Feign client in a factory 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());
    }

 }

As you see before returning the client, i want to set the timeout configuration of my hystrix command.

I am testing it with a 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");

}

This is working only when i set the time out on default hystrix paramater hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds

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

This didn't work. Similarly i tried below values none of them worked.

  hystrix.command.TestInterface#invoke(String).execution.isolation.thread.timeoutInMilliseconds
hystrix.command.TestInterface#invoke.execution.isolation.thread.timeoutInMilliseconds
Seetha
  • 980
  • 1
  • 8
  • 27
  • why is there a downvote i don't understand. I was struggling to figure this issue for 2 days and i posted it here after my findings, because it might be useful to someone. When people downvote, its better if they give a reason too. – Seetha Nov 21 '16 at 19:48

1 Answers1

6

I figured it out.

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

is working. The mistake i did was my method name was not having any parameters passed in. So for a feign hystrix client, the command name is

 FeignClientInterfaceName#MethodNameWithSignatures

For example quoted in the question, it is

 TestInterface#invoke()
Seetha
  • 980
  • 1
  • 8
  • 27