正确更新HTTP超时

时间:2018-12-17 13:10:22

标签: java multithreading http connection-timeout

我正在尝试从网站获取HTTP代码。 当我无线程解析站点时,一切都很好。 但是,如果我使用线程,有时会收到

java.sql.SQLException: After end of result set

URL url = new URL(rset.getString("url"));

我认为问题出在超时上,如果超时>我想要的话,我试图打破周期。

if (connection.getConnectTimeout()>10)
{
    System.out.println("timeout");
    break;
}

但是似乎永远都行不通。我究竟做错了什么?谢谢。问题代码的完整部分如下。

static class JThread extends Thread {

    JThread(String name){
        super(name);
    }

    public void run() {
        try {
            while (rset.next()) {
                System.out.println("hello");
                URL url = new URL(rset.getString("url"));
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");

                connection.connect();
                if (connection.getConnectTimeout()>10)
                {
                    System.out.println("timeout");
                    break;
                }
                //Thread.sleep(1000);

                int code = connection.getResponseCode();
                System.out.println(code);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("Thread stopped");
    }
}

2 个答案:

答案 0 :(得分:0)

  

我正在尝试从网站获取HTTP代码。当我无线程解析站点时,一切都很好。但是如果我使用线程,有时会收到
  java.sql.SQLException: After end of result set
  在
  URL url = new URL(rset.getString("url"));

这与HTTP超时无关。您得到的例外是,因为您已经在读取所有结果(并且没有其他要读取的结果)之后尝试从数据库行中获取“ url”列。

您说这仅在使用多个线程时发生。好像线程进入了while循环(rset.next()是真的)。然后另一个线程调用rset.next()(移至结果集的末尾),结果为false,并且不进入循环。然后,第一个线程尝试获取URL,但是您已经超过了最后一个结果。

如果在多个线程之间共享ResultSet(或任何对象),则应该同步对ResultSet的访问,但是最好不要在线程之间共享ResultSet。更好的分割工作的方法是让一个线程从数据库中获取URL,然后由1个或多个线程进行HTTP连接(例如,线程池,每个URL有新线程等)。

答案 1 :(得分:0)

您需要将呼叫同步到ResultSet.next()并事先检查是否已用尽。

现在您有两个线程同时调用它,第一个线程获取最后一行,而下一个在结果集已用尽时尝试获取一行。