2015-11-05 27 views
5

Tworzę klienta REST za pomocą funkcji Feign. Mam działające telefony, ale chcę dodać trochę czasu na wsparcie i mam trochę czasu, zastanawiając się, jak to zrobić.Ustawianie limitu czasu żądania za pomocą narzędzia Netflix Feign i Hystrix

Dokumentacja Feign mówi: "aby użyć Hystrix z Feign, dodaj moduł Hystrix do swojej ścieżki klasy, a następnie użyj konstruktora HystrixFeign." Ok, więc teraz mam to:

service = HystrixFeign.builder() 
        .decoder(new GsonDecoder()) 
        .target(ProjectService.class, URL_TO_BE_MOVED_TO_PROPS); 

Teraz wszystkie moje metod wracają HystrixCommands, które można wykonać lub kolejki, ale nadal nie mogę zobaczyć, jak je skonfigurować.

Hystrix wiki (https://github.com/Netflix/Hystrix/wiki/Configuration) mówi, że konfiguracja powinna być dodana do konstruktora HystrixCommand jak ten:

Ale moje rozkazy są budowane/deklarację udawać, więc nie mam dostępu do konstruktorzy.

jeszcze jedno warto zwrócić uwagę jest to, że readme Feign-Hystrix (https://github.com/Netflix/feign/tree/master/hystrix) mówi: „Aby korzystać hystrix z udawać, dodać moduł hystrix na ścieżce klas. Następnie należy skonfigurować udawać używać HystrixInvocationHandler”, ale w wyszukiwarce Google HystrixInvocationHandler zwraca mi uwagę na repozytorium inne niż Netflix. Nawet jeśli użyłem tego, nie wiem, jak skonfigurować Feign, aby go użyć.

Proszę mi powiedzieć, że jestem głupi i że jest to bardzo proste, co sprawi, że poczuję radość z powodu tego problemu i wstyd, że nie jestem w stanie sam tego rozgryźć.

TL; DR: Chcę ustawić limity czasu na żądania wysłane przez mojego klienta Feign. Jak to zrobić?

Odpowiedz

11

Okazuje się, że możesz ustawić właściwości Hystrix za pomocą instancji com.netflix.config.ConfigurationManager (z com.netflix.archaius: archaius-core).

Feign używa nazwy metod jako HystrixCommandKeys, dzięki czemu można uzyskać dostęp do ich właściwości, stosując te nazwy:

ConfigurationManager.getConfigInstance().setProperty("hystrix.command." + methodName + ".execution.isolation.thread.timeoutInMilliseconds", 1500); 

to zakładając, że używałem HystrixFeign do skonstruowania swojego klienta, który otacza każdego połączenia w obiektach HystrixCommand.

Aby uprościć, stworzyłem pętlę moich metod, więc mogłem zastosować timeout usługi szeroki:

private void configureHystrix() { 
    Method[] methods = ProjectService.class.getMethods(); 

    String methodName; 
    for(int i = 0; i < methods.length; i++) { 
     methodName = methods[i].getName(); 
     ConfigurationManager.getConfigInstance().setProperty(String.format("hystrix.command.%s.execution.isolation.thread.timeoutInMilliseconds", methodName), config.getTimeoutInMillis()); 
    } 
} 
+0

pracował dla mnie. Ustawiam domyślną zamiast konkretnej metody. 'ConfigurationManager.getConfigInstance(). SetProperty (" hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds ", 5000);' – n0daft

+0

Gdzie dokładnie uruchomiłeś ten wiersz kodu? Bez względu na to, co ustawiłem, czas oczekiwania wynosi nadal 1000 ms na wszystkich moich udawanych klientach. – bitsofinfo

+0

Moja metoda 'configureHystrix()' jest uruchamiana zaraz po użyciu HystrixFeign do skonstruowania mojego proxy: serviceProxy = HystrixFeign.builder(). Client (nowy OkHttpClient()) .target (ProjectServiceProxy.class, config.getHostURL()); configureHystrix(); – Disgruntor