servidor - chat multiusuario java
Java: los subprocesos de conexión en espera creados por conexión HTTP están vivos por una duración muy larga (1)
Implementación completa migrada para utilizar Apache HTTP Client ya que tiene API especiales para un mejor control. Pero no ayudó. Incluso con el cliente HTTP Apache, pude ver estos hilos de conexión en espera.
Finalmente, se encontró una pista en el sitio web de redhat para la configuración del conector HTTP de JBOSS . Grupo de subprocesos configurado para el conector HTTP y solucionó el problema:
<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"/>
....
....
Tengo un código del lado del servidor que comprueba si el servicio SOAP está activo. El código se ve así:
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
}
}
Ahora el problema es que, por cada comprobación, se crean entre 3 y 4 hilos de conexión. Y estos hilos están vivos incluso si se completa la verificación del servicio SOAP. Instantánea del volcado de subprocesos, para estos subprocesos se ve así:
"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
Ahora no estoy seguro de por qué estos hilos de conexión están esperando / estacionando y cómo cerrarlos. En mi código, las transmisiones abiertas se cierran y las conexiones se desconectan usando desconectar ().
También traté de establecer la siguiente propiedad HTTP:
httpConnection.addRequestProperty("Connection", "close");
Pero no ayudó. Dudo que en algún momento JAVA pueda estar cerrando estos hilos. Pero no sé, ¿cuándo y cómo? La versión de JDK es jdk1.7.0_51_x64. Por favor, avíseme, ¿cómo puedo evitar que estos números de hilos de conexión se acumulen?