1

HystrixFeign クライアントがあり、サービス呼び出しが失敗した問題を修正できるように、フォールバックの理由を知りたいので、フォールバックの実装で原因/例外を取得しようとしています。しかし、以下の実装では原因がわかりません。これは問題なく機能し、フォールバックは常に呼び出されています。しかし、私には理由がわかりません。Feign と Hystrix は初めてです。私のアプリケーションは 1.6 年前に Java で書かれており、これは拡張呼び出しの一種です。だから私はラムダ式に行くことができません。

以下のように定義されたクライアントインターフェイスがあります

public interface MyServiceFeignClient {
      @RequestLine("POST /myService/order")
      @Headers("Content-Type:application/vnd.org.company.domain.order+json;version=1.0")
      ServiceResponse sendOrder(String content);
}

私の FeignClientFacory は以下のようなものです

public class FeignClientFactory {

    private static final Logger LOG = LoggerFactory.getLogger(FeignClientFactory.class);

    private String serviceUrl;

    public FeignClientFactory(final String serviceUrl) {
        this.serviceUrl = serviceUrl;
    }

    public MyServiceFeignClient newInstance() {
        return HystrixFeign.builder()
            .decoder(new GsonDecoder())
            .target(MyServiceFeignClient.class, serviceUrl);

    }

    class ClientFallbackFactory implements MyServiceFeignClient, FallbackFactory<ClientFallbackFactory> {

        final Throwable cause;

        public ClientFallbackFactory() {
            this(null);
        }

        ClientFallbackFactory(Throwable cause) {
            this.cause = cause;
        }
        // note that this method is not getting called at all
        @Override
        public ClientFallbackFactory create(Throwable cause) {
            if (cause != null) {
                String errMessage = StringUtils.isNotBlank(cause.getMessage()) ? cause.getMessage() : "unknown error occured";
                LOG.debug("Client fallback called for the cause : {}", errMessage);
            }
            return new ClientFallbackFactory(cause);

        }
        // everytime this method is called as fallback and the cause is just null
        @Override
        public ServiceResponse sendOrder(String content) {
            LOG.debug("service client api fallback called");
            ServiceResponse response = new ServiceResponse();
            String errMessage = (cause == null ? "service client api fallback called" : cause.getMessage());
            response.setErrorMessage(errMessage);
            response.setResultStatus("WARN");
            return response;
        }

    }

}
4

1 に答える 1

0

開いている偽の git ハブから retroApi のサンプル テスト ケース コードを取得し、1 つずつ変更を開始すると、問題を解決するのに役立ちました。以下は作業コードです。

public static class ClientFallbackFactory implements MyServiceFeignClient, FallbackFactory<ClientFallbackFactory> {

    @Override
    public ClientFallbackFactory create(Throwable cause) {
        return new PRSClientFallback(cause);
    }

    final Throwable cause; // nullable

    public ClientFallbackFactory() {
        this(null);
    }

    ClientFallbackFactory(Throwable cause) {
        this.cause = cause;
    }

    @Override
    public PaymentRiskServiceResponse sendOrder(String content) {
        String errorMessage = (cause == null) ? "No cause returned" : cause.getMessage();
        LOG.debug("Client fallback called : {} ", errorMessage);
        MyServiceResponse response = new MyServiceResponse();
        response.setResultStatus("WARN");
        response.setErrorMessage("Client fallback called");
        return response;
    }
}

フォールバック クラスはクライアント インターフェイスと FallbackFactory の両方を実装しているため、HystrixFeign ターゲット メソッドを呼び出すときに、必ずフォールバック ファクトリを型キャストしてください。

return HystrixFeign.builder()
        .encoder(new JacksonEncoder(mapper))
        .decoder(new GsonDecoder())
        .target(MyServiceFeignClient.class, prsUrl, (FallbackFactory<ClientFallbackFactory>) new ClientFallbackFactory());

この問題の会話を追跡できます [ https://github.com/OpenFeign/feign/issues/458 ]

于 2016-09-19T20:00:38.230 に答える