У меня есть код на стороне сервера, который проверяет, работает ли служба SOAP. Код выглядит так:Java: Ожидание потоков соединений, созданных HTTP-подключением, очень длительное время.
String response = "";
while (response.length() == 0) {
try {
final URL url = new URL("DummySoapServiceURL");
final HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = null;
try {
httpConnection.setRequestMethod("GET");
inputStream = httpConnection.getInputStream();
final byte[] buffer = new byte[BUFFER_SIZE];
while (inputStream.read(buffer, 0, BUFFER_SIZE) != -1) {
response = new String(buffer);
}
} finally {
IOUtils.closeQuietly(inputStream);
httpConnection.disconnect();
}
} catch (MalformedURLException e) {
// error handling
} catch (IOException e) {
// error handling
}
}
Теперь проблема в том, что при каждой проверке около 3-4 потоков соединений создаются. И эти потоки оживают, даже если проверка обслуживания SOAP завершена. Снимок нить дампа, для этих потоков выглядит следующим образом:
"http-host/ip:port-11" prio=10 tid=0x00000000064f0000 nid=0x32cc waiting on condition [0x00002b54bc604000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000d5093c78> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.net.NioEndpoint$DefaultThreadFactory$1$1.run(NioEndpoint.java:1249)
at java.lang.Thread.run(Thread.java:744)
Locked ownable synchronizers:
- None
Теперь я не знаю, почему эти соединения потоков ожидают/парковки и как закрыть их. В моем коде открытые потоки закрыты, а соединения отключены с помощью функции disconnect().
Я также попытался установить следующее свойство: HTTP
httpConnection.addRequestProperty("Connection", "close");
Но это не помогло. Я сомневаюсь, что в какой-то момент JAVA может закрыть эти потоки. Но я не знаю, когда и как? Версия JDK - jdk1.7.0_51_x64. Пожалуйста, дайте мне знать, как я могу остановить эти номера строк подключения?
Вы не описали свою среду должным образом, просто сказав: «В моем коде есть ...». Этот код работает на стороне сервера? Потому что, если, то, вероятно, те потоки, которые называются «http-host/ip: port-11», не имеют никакого отношения к «вашему коду», являющемуся клиентом, но это стандартные потоки вашего веб-сервера, ожидающие входящих запросов. – realsim
Я только что редактировал мой вопрос. Да, его код на стороне сервера. Я отлаживал и обнаружил, что эти потоки создаются сразу после ввода потока ввода из HTTP-соединения, ответ считывается из потока ввода. Поэтому я уверен, что эти ожидающие потоки создаются с помощью кода выше. – user613114
Когда я запускаю этот код в основном методе, у меня нет других потоков, кроме основного (и стандартных потоков jvm). По имени потока, элементов стека и вашей описанной среды я на 99,9% уверен, что эти потоки управляются только хост-архитектурой на стороне сервера. – realsim