Обновите таймауты HTTP должным образом - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь получить 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 голосов
/ 17 декабря 2018

Вам необходимо синхронизировать вызовы с ResultSet.next() и заранее проверить, не исчерпаны ли они.

Теперь у вас есть два потока, вызывающих его одновременно, и первый получает последнюю строку, а следующий пытается получить строку, когда набор результатов уже исчерпан.

0 голосов
/ 17 декабря 2018

Я пытаюсь получить 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 между потоками.Лучший способ разделить работу состоит в том, чтобы один поток получал URL-адреса из базы данных, а 1 или более потоков выполняли HTTP-соединение (например, пул потоков, новый поток на URL и т. Д.).

...