setrequestproperty metodos example ejemplo java caching httpurlconnection java-web-start urlconnection

java - metodos - httpurlconnection timeout



API Java Webstart y URLConnection caching (3)

La única información que he encontrado hasta ahora es en Java Rich Internet Applications Enhancements en JDK 7

Almacenamiento en caché habilitado de manera predeterminada: el almacenamiento en caché del contenido de red para el código de la aplicación que se ejecuta en el modo de inicio web ahora está habilitado de forma predeterminada. Esto permite que la aplicación mejore el rendimiento y la coherencia con el modo de ejecución de applet. Para garantizar que se utiliza la última copia del contenido, la aplicación puede usar URLConnection.setUseCaches(false) o solicitar valores de Cache-Control del encabezado no-cache / no-store.

[...]

Mejoras para manejar el contenido con la codificación gzip: la memoria caché de implementación mantendrá el contenido de la aplicación comprimido y lo devolverá a la aplicación tal como está con la codificación de contenido gzip en el encabezado HTTP. Esto hace que el comportamiento sea más uniforme en los diferentes modos de ejecución (primer lanzamiento versus lanzamiento posterior, caché habilitada versus caché desactivada). Ver 6575586 para más detalles.

La descripción de la API de almacenamiento en caché de URLConnection indica como la última frase:

No hay una implementación predeterminada de caché de URLConnection en Java 2 Standard Edition. Sin embargo, Java Plugin y Java WebStart proporcionan uno de fábrica.

¿Dónde puedo encontrar más información sobre Webstart ResponseCache?

  • ¿Qué versiones de Webstart en qué plataformas se activa el almacenamiento en caché?
  • ¿En qué casos está activo? ¿Solo HTTP Get?
  • ¿Se puede configurar?
  • ¿Está el código fuente disponible?

Fondo:

Caso 1

Con el siguiente código (maravilloso)

def url = new URL(''http://repo1.maven.org/maven2/'') def connection = url.openConnection() def result = connection.inputStream.text

Esperaría que cada vez que se ejecuta el código, se contacte al servidor. Pero cuando se ejecuta en

Java Web Start 10.9.2.05 JRE-Version verwenden 1.7.0_09-b05 Java HotSpot(TM) Client VM

el comportamiento es diferente. La primera vez que se ejecuta el código, se contacta al servidor. Todas las ejecuciones posteriores del código no implican ninguna comunicación con el servidor (se rastrea utilizando wireshark).

Pero se vuelve aún más extraño. Después de reiniciar la aplicación webstart, la primera vez que se ejecuta el código, se solicita la URL http://repo1.maven.org/maven2/.pack.gz da como resultado un 404 . Solo se solicita la URL original, lo que da como resultado un 304 NOT MODIFIED . Todas las ejecuciones posteriores no implican ninguna comunicación con el servidor.

Creo que el enfoque de mejorar de forma transparente la conexión de la red con las capacidades de almacenamiento en caché es bueno y fino y ayuda a mejorar el rendimiento de las aplicaciones cliente. Pero dado que el servidor en este caso no definió un encabezado Expires ni un encabezado de control de caché, creo que el código anterior siempre debe preguntar al servidor y no ignorar silenciosamente mi solicitud.

Caso 2

El siguiente código no funciona cuando se ejecuta con webstart 10.1.1.255 (esto fue instalado por alguna versión beta temprana de java 7, pero no sé cuál era)

URL url = new URL("http://repo1.maven.org/maven2/"); URLConnection connection = url.openConnection(); connection.setRequestProperty("Accept-Encoding", "gzip"); connection.connect(); InputStream is = connection.getInputStream(); if ("gzip".equalsIgnoreCase(connection.getContentEncoding())) { is = new GZIPInputStream(is); } is.close();

Con Java Web Start 10.1.1.255 comenzando con la segunda ejecución obtuve un

java.io.IOException: Not in GZIP format at java.util.zip.GZIPInputStream.readHeader(Unknown Source) at java.util.zip.GZIPInputStream.<init>(Unknown Source) at java.util.zip.GZIPInputStream.<init>(Unknown Source)

Con Java Web Start 1.6.0_24 y ahora Java Web Start 10.2.1.255 no puedo reproducir el problema.

Con Wireshark vi que en el caso en que recibí el error, el encabezado http contenía una entrada If-Modified-Since, y el código de retorno por lo tanto era 304. En los otros casos, no había If-Modified-Since. Por lo tanto, creo que el almacenamiento en caché no está activo en las versiones estables de webstart, a pesar de la última oración del enlace anterior.

Parece que el caché de la versión beta realiza un ajuste agresivo a las solicitudes de obtención de http: utiliza If-Modified-Since y automáticamente intenta usar la codificación gzip, incluso si el código del cliente no establece este encabezado. Pero cuando se golpea la memoria caché, la secuencia devuelta no recibe gzip, aunque getContentEncoding devuelve "gzip".

Dado que el almacenamiento en caché parece no estar activo en la versión estable de webstart en mi máquina, no puedo verificar si el error está en el código y, por lo tanto, dudo en presentar un informe de error.


La caché parece ser implementada por com.sun.deploy.cache.DeployCacheHandler , que vive en deploy.jar. No puedo encontrar la fuente en ningún repositorio oficial; ese enlace es a algún tipo de copia del mercado gris.

No puedo, a simple vista, encontrar indicios de que esté deshabilitado (¡o habilitado!) En cualquier plataforma en particular. Este manejador de caché ha estado presente desde al menos Java 6.

Solo almacena solicitudes GET. Un comentario en el método isResourceCacheable explica:

// do not cache resource if: // 1. cache disabled // 2. useCaches is set to false and resource is non jar/zip file // 3. connection is not a GET request // 4. cache-control header is set to no-store // 5. lastModified and expiration not set // 6. resource is a partial body resource

No veo ninguna forma de configurar directamente la caché.


Modifiqué tu código. Espero que funcione para ti.

URL url = new URL("http://repo1.maven.org/maven2/"); URLConnection connection = url.openConnection(); connection.setRequestProperty("Accept-Encoding", "ISO-8859-1"); connection.connect(); InputStream is = connection.getInputStream(); if ("gzip".equalsIgnoreCase(connection.getContentEncoding())) { is = new GZIPInputStream(is); } is.close();