gpt4 book ai didi

java - HystrixFeign 客户端回退中获取原因的问题

转载 作者:太空宇宙 更新时间:2023-11-04 12:16:23 25 4
gpt4 key购买 nike

我有 HystrixFeign 客户端,我正在尝试获取回退实现中的原因/异常,因为我真的很想知道回退的原因,以便我可以解决服务调用失败的问题。但下面的实现并没有让我找到原因。这工作得很好,并且后备一直被调用。但我不知道为什么。我是 Feign 和 Hystrix 的新手。我的应用程序是 1.6 年前用 java 编写的,这是一种增强调用。所以我不能使用任何 lambda 表达式。

我的客户端接口(interface)定义如下

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;
}

}

}

最佳答案

从开放的 feign git hub 中获取 RetroApi 示例测试用例代码并开始一一修改,帮助我解决了问题。下面是工作代码。

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;
}
}

确保在调用 HystrixFeign 目标方法时对 Fallback 工厂进行类型转换,因为 Fallback 类正在实现您的客户端接口(interface)和 FallbackFactory。

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]

关于java - HystrixFeign 客户端回退中获取原因的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39378073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com