В описании URLConnection caching API в последнем предложении говорится:
В Java 2 Standard Edition нет реализации кэширования URLConnection по умолчанию. Однако Java Plugin и Java WebStart предоставляют его из коробки.
Где я могу найти больше информации о Webstart ResponseCache?
Со следующим (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, я думаю, что приведенный выше код должен всегда спрашивать сервер, а не молча игнорировать мой запрос.
Следующий код не работает при выполнении с 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 на моей машине, я не могу проверить, есть ли ошибка в коде, и поэтому не решаюсь подать сообщение об ошибке.