Что означает «сеть: запись кэша не найдена [url: ...]»? - PullRequest
3 голосов
/ 28 февраля 2012

Вскоре

Я не могу понять, какова общая причина появления сообщения network: Cache entry not found [url: ...] в консоли Java во время работы апплета в веб-браузере. Я понял, что это может появиться при выполнении с java.net.URLConnection (запрашивая некоторые данные из Интернета), но я до сих пор не знаю о возможных причинах для поиска моей конкретной проблемы. Итак, мои вопросы: Каковы возможные причины этого сообщения и может ли это повлиять на нормальный запуск приложения? Наконец, что такое кеш и можно ли как-то им управлять?

Подробно

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

Я создаю апплет на основе NASA WorldWind и сталкиваюсь с очень странным поведением при запросе слоев мозаичного изображения, вызывающих соответствующий метод апплета из JavaScript. Слой плиточного изображения - это слой, который может перекрывать трехмерную Землю и состоящий из наборов картинок фиксированного размера (плиток), которые необходимо запрашивать отдельно во время загрузки слоя (предположим, что слой является чем-то вроде головоломки плиток :). Вот почему каждый запрос плитки имеет свой собственный поток.

Изначально у меня было AccessControllerException , поскольку у каждого потока запроса плитки не было разрешений для выполнения запросов между доменами и чтения / сохранения результатов загрузки в локальный файловый кэш. Эта проблема была решена путем переноса фактического кода запроса плитки на

AccessController.doPrivileged(new PrivilegedAction() {

    @Override
    public Object run() {

        // Requesting tile and performing with the result...
        // ...
    }
});

В результате я вижу, что плитки загружаются и хранятся в локальном каталоге файлового кэша. Но я все еще не вижу слой на Земле. Дело в том, что я получаю следующие сетевые сообщения в консоли Java:

network: Cache entry not found [url: http://caches.scanex.ru/getTile.cgi?T=BMNG-01-2004&L=0&X=4&Y=1, version: null]
network: Connecting http://caches.scanex.ru/getTile.cgi?T=BMNG-01-2004&L=0&X=4&Y=1 with proxy=HTTP @ /192.168.4.10:8080

Мне удалось найти место в коде, когда появляются эти сообщения - при получении кода ответа HTTP:

HttpURLConnection htpc = (HttpURLConnection)fconnection;
responseCode = htpc.getResponseCode();

Затем я обнаружил, что экземпляр java.net.URL предоставлен для URLConnection, а другие приготовления также выполняются в другом потоке. Чтобы быть точным, загрузка плитки проходит через цепочку следующих потоков, где каждый дочерний поток представлен java.util.concurrent.FutureTask :

Layer's rendering thread >> Tile request task where URL is to be prepared basing on existing local cache data >> Reading tile contents and handling the result (storing in local cache if it's required (это место, где появляются сетевые сообщения выше).

Наконец, я предоставил привилегии для всех этих потоков со структурой AccessController.doPrivileged(...), и я вижу желаемый результат - слои мозаичного изображения накладываются. Но я все еще смущен Cache entry not found сообщениями, потому что они остаются в консоли Java и появляются для каждой запрошенной плитки. Вот почему я хочу знать: нормально ли такое поведение, и что на самом деле означают эти сообщения?

P.S. Для заинтересованных людей - http://caches.scanex.ru в данный момент не работает извне.

...