2017-03-04 37 views
-1

我正在android應用程序,我經常得到HTTP錯誤500,當我嘗試訪問由於連接不良導致我的應用程序失敗的URL。從URL返回的響應是JSON格式所以爲了解析此JSON我用傑克遜API自動連接的錯誤的情況下

JsonNode monthlyUrlNode = objectMapper.readValue(url, JsonNode.class); 

在出現故障的我想情況下重新連接以30秒的延遲

我稱爲URL這Retry a connection on timeout in Java,但它對我沒有多大用處

+0

你可以從http://stackoverflow.com/questions/7312794/retry-a-connection-on-timeout-in-java修改代碼嗎?我的建議是,您應該在應用程序端獲取流,然後使用它來處理JSON。因爲在例外的情況下,您可以根據您的邏輯適當地處理網絡,而不是依靠Jackson API來實現錯誤處理。 –

回答

0

你有沒有想過使用代理對象?代理讓您以一種獨立於被調用方法的方式執行相同干預的方式來包裝一個接口。假設您已經創建了一個用於訪問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)); 
    } 
} 
0

如果你需要這種良好的控制,不要傳遞給傑克遜的網址。使用適當的HTTP庫將URL中的內容讀入內存,根據需要重試,然後將其提供給Jackson。