Как записать причину, по которой вызван запасной метод Hystrix - PullRequest
0 голосов
/ 05 июня 2018

Я создаю 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);
    }
}

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

Как зарегистрировать исключение, которое вызывает вызванный метод отката back
Как и ConnectionTimeoutException.

1 Ответ

0 голосов
/ 05 июня 2018

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

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

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

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

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

или

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

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

РЕДАКТИРОВАТЬ:

Если вы используете 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);
    }
}
...