Ошибка сброса соединения httpurlconnection при отправке второго сообщения

В основном это все, первое отправленное сообщение правильно получено сервером, но все последующие не работают. Это основной цикл, который перебирает сообщения и обрабатывает некоторые ошибки для отладки и логики кода. Переменная udc - это мое соединение с базой данных, но она работает нормально, поэтому не обращайте на нее внимания.

for (MessageOutModel message : messageOutModels) {
    HttpURLConnection connection = MakeConnection();
    Date currentMoment = new Date(Calendar.getInstance().getTimeInMillis());
    System.out.println("Sent message id: " + message.id);
    OutputStreamWriter out = new OutputStreamWriter(
            connection.getOutputStream());
    out.write(message.contenido);
    out.close();
    //os.write(message.contenido);
    System.out.println("Message sent");
    int responseCode = connection.getResponseCode();
    System.out.println("Connection message: " + responseCode);
    message.f_ultimo_intento = currentMoment;
    if (responseCode != 200) {
        message.intentos++;
        message.desc_error = "Connection error: " + responseCode
                + " Connection error message: " + connection.getResponseMessage() + "Response error:" +
                connection.getResponseMessage();
       udc.UpdateMessageOut(message);
       if (message.intentos == configModel.n_reintentos) {
           udc.InsertError("MAX_INTENTOS", "Se ha alcanzado el máximo número de " +                         "intentos para el id-ticket: " + message.id + "-" + message.ticket_number);
       }
    } else {
        message.desc_error = "";
        udc.UpdateMessageOut(message);
    }
    connection.disconnect();
}

Идет метод MakeConnection ()

protected HttpURLConnection MakeConnection() throws IOException {
    QName q = new QName(SERVER_URL, "");
    URL url = new URL(q.getNamespaceURI() + q.getLocalPart());
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setDoOutput(true);
    connection.setInstanceFollowRedirects(false);
    connection.setRequestProperty("UserName", Username);
    connection.setRequestProperty("PassWord", Password);
    connection.setRequestMethod("POST");
    connection.setRequestProperty("Content-Type", MediaType.TEXT_PLAIN);
    return connection;
}

Ошибка сброса подключения

Возможно, вам стоит попытаться вывести ваше соединение за пределы цикла. Установление соединения с внешними службами может быть самой медленной частью выполнения кода.

Rostyslav Barmakov 31.10.2018 13:43
0
1
186
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте это как быстрое решение.

HttpURLConnection connection = MakeConnection();

for (MessageOutModel message : messageOutModels) {
  // logic from your sample
}
connection.disconnect();

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

Спасибо за попытку с ресурсами, буду. Что касается цикла forloop, нам нужно было устанавливать соединение для каждого запроса, поэтому структура и так верна,

m5m7n5 31.10.2018 14:18

Хм .. Понятно. Может быть, вам нужно создать такую ​​службу, как ConnectionManager, чтобы предотвратить «рукопожатие-DDOS»? Я не уверен, но так ли важно использовать новое соединение на каждой итерации? @ m5m7n5

Rostyslav Barmakov 31.10.2018 14:29
Ответ принят как подходящий

В конце концов, возникла проблема с брандмауэром на клиенте и сервере. Он блокировал соединение каждый раз после первого.

Другие вопросы по теме