Estoy desarrollando un cralwer web con htmlunit y he agregado todo el tiempo de espera requerido, pero noté que la aplicación se bloquea cuando el servidor de algún sitio web rastreado no responde cuando uso Java VisualVM para hacer un volcado de hilo:Java socketRead0 Issue
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.net.SocksSocketImpl.readSocksReply(SocksSocketImpl.java:88)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:429)
at java.net.Socket.connect(Socket.java:525)
at com.gargoylesoftware.htmlunit.SocksSocketFactory.connectSocket(SocksSocketFactory.java:89)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:573)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:776)
at com.gargoylesoftware.htmlunit.HttpWebConnection.getResponse(HttpWebConnection.java:152)
at app.plugin.core.net.QHttpWebConnection.getResponse(QHttpWebConnection.java:30)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseFromWebConnection(WebClient.java:1439)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponse(WebClient.java:1358)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:307)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:373)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:358)
Esto es realmente frustrante ya que no tengo control de esos servidores. Este problema está afectando seriamente el rendimiento de mi aplicación.
Pregunta:
- ¿Cómo puedo solucionar este problema?
- ¿Hay alguna manera de obtener una lista de conexión de socket abierta por una aplicación Java y usarla para terminar el socket, como simular que el servidor cerró la conexión?
¿Cómo hace usted que el hilo esté bloqueado? su estado es runable. Si estaba bloqueado, habría estado "En espera" o "Bloqueado". –
Obviamente, no ha agregado todos los tiempos de espera requeridos ;-) ¿Puede mostrar qué tiempos de espera tiene? –
@Ravi Bhatt, no dije que el hilo fuera bloque. @ Roger Lindsjö, agregué todo el tiempo de espera requerido, lo que soy particular es el bloqueo en java.net.SocketInputStream.socketRead0 – John