Как зарегистрировать причину вызова резервного метода hystrix

Я создаю клиент REST, используя Fiegn. У меня работают вызовы, но я хочу зарегистрировать исключение, которое вызывает вызванный резервный метод.
Код выглядит следующим образом:

public interface FooService {
    Foo queryFoo(Integer fooId);
}

public interface FooServiceFallback implements FooService {
    @Override
    Foo queryFoo(Integer fooId) {
        return new Foo();
    }
}

@Configuration
public class FooServiceConfiguration {
    @Bean
    public FooService() {
        return HystrixFeign.builder().[...].target(FooService.class, "http://xxx", FooServiceFallback.class);
    }
}

Резервный метод может быть вызван при возникновении исключения, но запись об этом заносится в журнал.

Как зарегистрировать исключение, которое запускает вызванный резервный метод?
Например, connectionTimeoutException.


person John    schedule 05.06.2018    source источник


Ответы (1)


Метод Fallback может принимать дополнительный аргумент типа Throwable, который укажет на причину.

Например, если ваш метод подобен этому

@HystrixCommand(fallbackMethod = "fallbackMethod")
public String mainMethod(String s) {
 .....
}

Ваш запасной метод может быть таким

public String fallbackMethod(String s) {
     ......
}

or

public String fallbackMethod(String s, Throwable throwable) {
     //log the cause using throwable instance
     ......
}

В вашем случае используйте второй.

ИЗМЕНИТЬ:

Если вы используете HystrixFeign, вы делаете это следующим образом. Вы должны использовать FallbackFactory

@Component
public class FooServiceFallbackFactory implements FallbackFactory<FooService> {

    @Override
    public FooService create(Throwable throwable) {
        return new FooServiceFallback(throwable);
    }

}

Ваш запасной класс будет выглядеть так

@Component
public class FooServiceFallback implements FooService {

   private final Throwable cause;

   public FooServiceFallback(Throwable cause) {
      this.cause = cause;
   }

   @Override
   Foo queryFoo(Integer fooId) {
       //You have access to cause now, which will have the real exception thrown
   }

}

Также вам нужно немного изменить свой класс конфигурации

@Configuration
public class FooServiceConfiguration {
    @Bean
    public FooService() {
        return HystrixFeign.builder().[...].target(FooService.class, "http://xxx", FooServiceFallbackFactory.class);
    }
}
person pvpkiran    schedule 05.06.2018
comment
Я отредактировал вопрос. Резервный класс реализует интерфейс FeignClient. Как получить бросаемый аргумент? - person John; 05.06.2018