我正在使用Android应用程序,当我尝试访问网址时,由于连接不良导致我的应用程序失败,我经常会收到HTTP错误500。从URL返回的响应是JSON格式,所以为了解析这个json,我使用了jackson api
JsonNode monthlyUrlNode = objectMapper.readValue(url, JsonNode.class);
如果失败,我想以30秒的延迟重新连接到网址
我提到了这个Retry a connection on timeout in Java,但它对我没什么用处
2 个答案:
答案 0 :(得分:0)
你有没有想过使用Proxy对象?代理允许您以一种独立于被调用方法执行相同干预的方式包装接口。让我们假设您已经创建了一个用于访问SomeService接口的客户端对象。然后,您可以创建一个内置30秒重试的代理类:
公共类ServiceProxy实现InvocationHandler {
private final SomeService realClient;
public ServiceProxy(SomeService realClientObject){
this.realClient = realClientObject;
}
@覆盖
public Object invoke(Object proxy,Method method,Object [] args)抛出Throwable {
Object result = method.invoke(realClient,args);
if(result instanceof URL){
JsonNode urlNode = objectMapper.readValue(url,JsonNode.class);
if(urlNode上的某些条件){
//等等并重试
了Thread.sleep(30000);
result = method.invoke(realClient,args);
}
}
返回结果;
}
}
您通过将原始接口传递给代理对象来创建代理对象,如:
公共类ProxyFactory {
public static SomeService get(SomeService originalClient){
return(SomeService)Proxy.newProxyInstance(SomeService.class.getClassLoader(),
new Class [] {SomeService.class},
新的ServiceProxy(originalClient));
}
}
答案 1 :(得分:0)
如果您需要这种精细控制,请不要将URL传递给杰克逊。使用适当的HTTP库将URL中的内容读入内存,根据需要重试,然后将其提供给Jackson。