2015-09-03 2 views
0

У меня есть многопоточный Java-клиент, который отправляет данные на сервер и считывает ответ с помощью HttpURLConnection. Каждый экземпляр клиента - это поток, и они ничего не делят, даже HttpURLConnection не используется. (Каждый поток имеет свой собственный HttpURLConnection), и он, кажется, все еще не потокобезопасен. Может ли кто-нибудь подтвердить это поведение и что вы предлагаете в качестве решения? Кстати, я видел подобный вопрос, но вот что спрашивал HttpURLConnection делился среди разных тем. Обратите внимание, что в моем случае его не разделяют.Различные экземпляры java.net.HttpURLConnection в многопоточном java-приложении

public class ESIHttpCaller{ 

private final String ESIHTTPURL = "http://localhost:7033/FBWS/eigBagHttpDispatcher" 
private HttpURLConnection connection = null; 
protected StringBuilder response = new StringBuilder(); 

public CBBag executePost(byte[] input) throws CBException { 
    InputStream is = null; 
    DataOutputStream wr =null; 
    int STATE = 0; 
    try{ 
     // Create connection 
     URL url = new URL(getConnectionUrl()); 
     connection = (HttpURLConnection) url.openConnection(); 
     connection.setRequestMethod("POST"); 
     connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded;charset="+encoding); 
     connection.setRequestProperty("Content-Length", "" + Integer.toString(length)); 
     connection.setRequestProperty("encoding", encoding); 
     connection.setRequestProperty("Accept-Encoding", encoding); 
     connection.setConnectTimeout(getConnectTimeout()); 
     connection.setReadTimeout(getReadTimeout()); 
     connection.setUseCaches(false); 
     connection.setDoInput(true); 
     connection.setDoOutput(true); 

     // Send request 
     wr = new DataOutputStream(connection.getOutputStream()); 
     wr.write(input); 
     wr.flush(); 
     //Get response 
     STATE = 1; 
     is = connection.getInputStream(); 
     BufferedReader rd = new BufferedReader(new InputStreamReader(is,encoding)); 
     String line = rd.readLine() ; 
     while (line != null) { 
      response.append(line); 
      line = rd.readLine(); 
     } 
     rd.close(); 
     return handleResponse(response); 
    } 
    catch (Exception e) { 
     closeQuietly(is,wr); 
     throw handleException(STATE, e); 
    } 
    finally { 
     if (connection != null) { 
      connection.disconnect(); 
     } 
    } 
} 

}

код вызывающего абонента в потоке, как показано ниже:

 ESIHttpCaller caller = new ESIHttpCaller(); 
     caller.setTcid(tcid); 
     return caller.executePost(outStr.getBytes()); 
+0

Можете ли вы разместить код? В первую очередь, когда вы открываете HttpURLConnection и где он назначен для каждого потока? –

+0

Написал мой код, каждый поток инициализирует новый экземпляр ESIHttpCaller и вызывает его метод executePost(). – cacert

+0

Почему ответ «StringBuilder» является членом класса? Это не потокобезопасный. Если вы используете один и тот же экземпляр 'ESIHttpCaller' для нескольких потоков, у вас есть проблема прямо там. –

ответ

0

Потому что вы называете разъединение() вместо закрытия() на HttpURLConnection.

С JavaDoc из HttpURLConnection (курсив):

Каждый экземпляр HttpURLConnection используется, чтобы сделать один запрос, но базовая сеть связи с сервером HTTP может быть прозрачно совместно с другими экземплярами , Вызов методов close() на InputStream или OutputStream соединения HttpURLC после запроса может освобождать сетевые ресурсы, связанные с этим экземпляром, но не влияет на какое-либо совместное постоянное соединение. Вызов метода disconnect() может закрыть базовый сокет, если в то же время постоянное соединение не работает.

+0

Я пробовал то, что вы предлагаете, но никакой разницы. по-прежнему возникают ошибки при выполнении некоторых запросов. – cacert

Смежные вопросы