У меня есть многопоточный 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());
Можете ли вы разместить код? В первую очередь, когда вы открываете HttpURLConnection и где он назначен для каждого потока? –
Написал мой код, каждый поток инициализирует новый экземпляр ESIHttpCaller и вызывает его метод executePost(). – cacert
Почему ответ «StringBuilder» является членом класса? Это не потокобезопасный. Если вы используете один и тот же экземпляр 'ESIHttpCaller' для нескольких потоков, у вас есть проблема прямо там. –