2016-02-08 4 views
0

У меня есть код на стороне сервера, который проверяет, работает ли служба 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. Пожалуйста, дайте мне знать, как я могу остановить эти номера строк подключения?

+0

Вы не описали свою среду должным образом, просто сказав: «В моем коде есть ...». Этот код работает на стороне сервера? Потому что, если, то, вероятно, те потоки, которые называются «http-host/ip: port-11», не имеют никакого отношения к «вашему коду», являющемуся клиентом, но это стандартные потоки вашего веб-сервера, ожидающие входящих запросов. – realsim

+0

Я только что редактировал мой вопрос. Да, его код на стороне сервера. Я отлаживал и обнаружил, что эти потоки создаются сразу после ввода потока ввода из HTTP-соединения, ответ считывается из потока ввода. Поэтому я уверен, что эти ожидающие потоки создаются с помощью кода выше. – user613114

+0

Когда я запускаю этот код в основном методе, у меня нет других потоков, кроме основного (и стандартных потоков jvm). По имени потока, элементов стека и вашей описанной среды я на 99,9% уверен, что эти потоки управляются только хост-архитектурой на стороне сервера. – realsim

ответ

1

Перенос всей реализации для использования клиента apache HTTP, поскольку он имеет специальные API для лучшего управления. Но это не помогло. Даже с HTTP-клиентом apache я мог видеть эти ожидающие потоки подключения.

Окончательно найдено намека на redhat website for JBOSS HTTP connector configuration. Настроенный пул потоков для HTTP-коннектора, и он решил проблему:

<subsystem xmlns="urn:jboss:domain:threads:1.1"> 
    <thread-factory name="http-connector-factory" group-name="uq-thread-pool" thread-name-pattern="HTTP-%t" priority="9"/> 
    <unbounded-queue-thread-pool name="uq-thread-pool"> 
     <max-threads count="5"/> 
     <keepalive-time time="5" unit="seconds"/> 
     <thread-factory name="http-connector-factory"/> 
    </unbounded-queue-thread-pool> 
</subsystem> 

<subsystem xmlns="urn:jboss:domain:web:2.2" default-virtual-server="default-host" native="false"> 

    <connector name="http" protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="http" socket-binding="http" executor="uq-thread-pool"/> 
    .... 
    ....