【问题标题】:How to handle this error: java.io.IOException: Server returned HTTP response code: 503 for [closed]如何处理此错误:java.io.IOException:服务器返回 HTTP 响应代码:503 for [关闭]
【发布时间】:2018-09-27 23:11:38
【问题描述】:

如何处理这个错误:java.io.IOException: Server returned HTTP response code: 503 for

我希望当出现这个错误时,我的代码会重复 url 的请求。

没有这个错误:

1) 服务器可能正忙

2) 服务器可能因维护而停机

代码:

public Element trataDados(String address1) throws MalformedURLException, IOException, JDOMException {

    URL url;

    url = new URL(address1);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();

    conn.setRequestMethod("GET");
    InputStreamReader reader = new InputStreamReader(conn.getInputStream(), "UTF-8");
    BufferedReader bfreader = new BufferedReader(reader);


    StringBuilder stringBuilder = new StringBuilder();
    String line;
    while ((line = bfreader.readLine()) != null) {
        stringBuilder.append(line);
    }
    bfreader.close();
    conn.disconnect();

【问题讨论】:

    标签: java http-status-code-503


    【解决方案1】:

    在开始读取输入之前获取响应代码。如果是 503,不要读取输入,读取错误流,然后关闭它,然后重试,但不要太快。如果服务器因维护而停机,可能会持续五秒钟或五天。您可能应该像 TCP 那样使用呈指数增长的重试间隔,比如每次将其加倍,或者乘以 1.5,直到您放弃的某个限制。

    NB GET 已经是默认值了。

    【讨论】:

      【解决方案2】:
      Thanks @EJP, 
      based on your answer I solved my question thus:
      
      
      
          public Element trataDados(String address1) throws MalformedURLException, IOException, JDOMException {
      
              URL url;
              HttpURLConnection conn;
      
          do{
              url = new URL(address1);
              conn = (HttpURLConnection) url.openConnection();
      
              conn.setRequestMethod("GET");
      
      //test out
              System.out.println("REQUEST: "+conn.getResponseCode());
              System.out.println("REQUEST: "+conn.getResponseMessage());
      
          }while(conn.getResponseCode()!= HttpURLConnection.HTTP_OK);
      
              InputStreamReader reader = new InputStreamReader(conn.getInputStream(), "UTF-8"); 
              BufferedReader bfreader = new BufferedReader(reader);
      
      
              StringBuilder stringBuilder = new StringBuilder();
              String line;
              while ((line = bfreader.readLine()) != null) {
                  stringBuilder.append(line);
              }
              bfreader.close();
              conn.disconnect();
      

      【讨论】:

      • 这是一个糟糕的解决方案。您将除 200 之外的每个响应代码都视为可以重试;你没有增加请求间隔(事实上你甚至没有);而且您没有限制重试次数。我根本不会说这是“基于 [我的] 答案”..
      • 嗨@EJP,实际上我正在增加请求的范围,但是在另一个调用它的方法中,我正在为该范围使用睡眠线程;已经限制重试次数不是我的本意,我想强制总是有一个有效的请求。
      猜你喜欢
      • 2014-02-22
      • 2023-03-17
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2013-08-12
      • 1970-01-01
      • 2013-09-12
      相关资源
      最近更新 更多