Java Webstart и API кэширования URLConnection

В описании URLConnection caching API в последнем предложении говорится:

В Java 2 Standard Edition нет реализации кэширования URLConnection по умолчанию. Однако Java Plugin и Java WebStart предоставляют его из коробки.

Где я могу найти больше информации о Webstart ResponseCache?

  • Какие версии Webstart на каких платформах активируют кэширование?
  • В каких случаях оно активно? Только HTTP Get?
  • Можно ли его настроить?
  • Доступен ли исходный код?

Предыстория:

Случай 1

Со следующим (groovy) кодом

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

Я бы ожидал, что каждый раз, когда код выполняется, происходит обращение к серверу. Но при выполнении кода

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

поведение отличается. При первом выполнении кода происходит обращение к серверу. Все последующие выполнения кода не включают никакого взаимодействия с сервером (отслежено с помощью wireshark).

Но все становится еще более странным. После повторного запуска приложения webstart при первом выполнении кода запрашивается url http://repo1.maven.org/maven2/.pack.gz, что приводит к 404. Только после этого запрашивается исходный url, что приводит к 304 NOT MODIFIED. Все последующие выполнения не предполагают никакого взаимодействия с сервером.

Я думаю, что подход прозрачного расширения url-соединения с возможностями кэширования хорош и помогает улучшить производительность клиентских приложений. Но поскольку в данном случае сервер не определил ни заголовок Expires, ни заголовок cache-control, я думаю, что приведенный выше код должен всегда спрашивать сервер, а не молча игнорировать мой запрос.

Случай 2

Следующий код не работает при выполнении с webstart 10.1.1.255 (он был установлен какой-то ранней бета-версией java 7, но я не знаю, какой именно)

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();

С Java Web Start 10. 1.1.1.255 начиная со второго выполнения я получил

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

И с Java Web Start 1.6.0_24 и теперь Java Web Start 10.2.1.255 я не могу воспроизвести проблему.

С помощью Wireshark я увидел, что в случае, когда я получил ошибку, http-заголовок содержал запись If-Modified-Since, и поэтому код возврата был 304. В других случаях If-Modified-Since не было. Поэтому я думаю, что кэширование не активно в стабильных версиях webstart - несмотря на последнее предложение в приведенной выше ссылке.

Похоже, что кэш бета-версии делает агрессивную настройку на http get запросы: Он использует If-Modified-Since и автоматически пытается использовать gzip-кодирование - даже если код клиента не устанавливает этот заголовок. Но при обращении к кэшу возвращаемый поток не гзипируется, хотя getContentEncoding возвращает "gzip".

Поскольку кэширование, похоже, не активно в стабильной версии webstart на моей машине, я не могу проверить, есть ли ошибка в коде, и поэтому не решаюсь подать сообщение об ошибке.

27
задан Tobias Schulte 5 December 2012 в 09:03
поделиться