我的@Service类中有一个用@HystrixCommand标记的函数。
此方法充当客户端,将请求发送到另一个服务URL并获取响应。
我想要做的是在响应状态代码不是200时触发回退功能。它还会触发任何其他异常(RuntimeExceptions等)的回退。
我想通过使用@HystrixProperty或@HystrixCommandProperty来做到这一点。
我希望客户端ping该URL并侦听200响应状态,如果它在某个时间范围内没有恢复到200状态,我希望它能够回退。
如果它在一定时间内正常恢复200状态,则不应触发回退。
@HystrixCommand(fallbackMethod="fallbackPerformOperation")
public Future<Object> performOperation(String requestString) throws InterruptedException
return new AsyncResult<Object>() {
@Override
public Object invoke() {
Client client = null;
WebResource webResource = null;
ClientResponse response =null;
String results = null;
try{
client = Client.create();
webResource = client.resource(URL);
client.setConnectTimeout(10000);
client.setReadTimeout(10000);
response = webResource.type("application/xml")
.post(ClientResponse.class, requestString);
} finally {
client.destroy();
webResource = null;
}
return results;
}
};
}
我特别想使用 @HystrixProperty 或 @HystrixCommandProperty ,因此在方法内部执行检查,以便响应状态代码不是200,然后抛出异常是不能接受。
而不是使用Annotations将通过扩展HystrixCommand Interface工作来创建我自己的Command吗?
我可以从中获得任何想法或资源。
答案 0 :(得分:0)
我不明白为什么你不想检查响应http状态代码并在不是200时抛出异常?这样做会给你你想要的行为。即它会触发异常或非200响应的后退。
您可以在客户端设置超时,但我会选择使用hystrix超时值。这样,如果需要,您可以使用Archaius在运行时动态更改值。
您可以使用Hystrix命令注释或扩展HystrixCommand类。这两个选项都将为您提供所需的行为
以下是使用注释的示例。
@HystrixCommand(fallbackMethod = "getRequestFallback")
public String performGetRequest(String uri) {
Client client = Client.create();
WebResource webResource = client.resource(uri);
ClientResponse response = webResource.get(ClientResponse.class);
if (response.getStatus() != 200) {
throw new RuntimeException("Invalid response status");
}
return response.getEntity(String.class);
}
public String getRequestFallback(String uri) {
return "Fallback Value";
}