你有沒有想過使用代理對象?代理讓您以一種獨立於被調用方法的方式執行相同干預的方式來包裝一個接口。假設您已經創建了一個用於訪問SomeService接口的客戶端對象。然後,你可以創建一個代理類與內置的30秒重試:
public class ServiceProxy implements InvocationHandler {
private final SomeService realClient;
public ServiceProxy(SomeService realClientObject) {
this.realClient = realClientObject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(realClient, args);
if (result instanceof URL) {
JsonNode urlNode = objectMapper.readValue(url, JsonNode.class);
if (some condition on urlNode) {
// Wait and retry
Thread.sleep(30000);
result = method.invoke(realClient, args);
}
}
return result;
}
}
您可以通過將其原有的接口,如創建代理對象:
public class ProxyFactory {
public static SomeService get(SomeService originalClient) {
return (SomeService)Proxy.newProxyInstance(SomeService.class.getClassLoader(),
new Class[]{SomeService.class},
new ServiceProxy(originalClient));
}
}
你可以從http://stackoverflow.com/questions/7312794/retry-a-connection-on-timeout-in-java修改代碼嗎?我的建議是,您應該在應用程序端獲取流,然後使用它來處理JSON。因爲在例外的情況下,您可以根據您的邏輯適當地處理網絡,而不是依靠Jackson API來實現錯誤處理。 –