Jetty ResourceCache против CachedContentFactory - PullRequest
1 голос
/ 15 мая 2019

Я мигрирую с Jetty 9.0.x на 9.4.x

org.eclipse.jetty.server.ResourceCache удалено с Jetty 9.4.x

Вопросы:

1) Что такоезамена для этого класса в 9.4.x?

2) Я обнаружил, что CachedContentFactory является ближайшим эквивалентом этого класса, но конструктор этого класса принимает один дополнительный параметр CompressedContentFormat[] precompressedFormats.если это правильная замена, то я не уверен, что я должен передать это для этого параметра?это может быть пустой массив?Извините, javadocs тоже не очень помогли.

1 Ответ

1 голос
/ 15 мая 2019

Сначала немного истории.

Еще во время основного выпуска Jetty 9.0.0 было 2 основных способа обработки статического содержимого: DefaultHandler (и подчиненный ResourceHandler).

Когда вышел основной выпуск Jetty 9.4.0 (это 4 основных выпуска Jetty позже, чем Jetty 9.0.0), была предпринята попытка заставить оба этих компонента использовать общую кодовую базу, поэтому ResourceService был создан для стандартизацииобслуживание статического контента в одном месте.Теперь различия между DefaultHandler и ResourceHandler значительно сократились.( примечание: DefaultHandler по-прежнему поддерживает больше собственных функций и больше возможностей различных спецификаций HTTP )

Далее, Проблема # 539 была разрешена для разрешенияResourceHandler (и теперь DefaultHandler), чтобы иметь настроенные списки каталогов.Для этого был введен интерфейс HttpOutput.ContentFactory.

Новый HttpOutput.ContentFactory отвечал за возвращение HttpContent, представляющего предоставленный путь (и необязательный параметр конфигурации максимального размера буфера).

Это означает, что на данный момент мы имеем ...

  1. A DefaultServlet (или ResourceHandler)
  2. , который имеет ResourceService
  3. Который получает его содержимое из HttpOutput.ContentFactory
  4. Возвращенный HttpContent может быть статическим ресурсом, списком каталогов или файлом приветствия.

Когда приходит время отправкикусок статического контента, шаги предприняты ...

  1. Запросить HttpContent объект из HttpOutput.ContentFactory.getContent(path, maxBufferSize)
  2. Запросить представление HttpContent, которое можно использовать для отправкиссылочный контент, один из следующих (в этом порядке):
    1. Если HttpChannel настроен на использование «прямых буферов», то запросите HttpContent.getDirectBuffer(), представляющий весь контент.(это может быть файл с отображенной памятью, использующий незначительный объем памяти кучи)
    2. Запросить HttpContent.getIndirectBuffer(), представляющий весь контент.(это может быть файл с отображенной памятью, использующий незначительный объем памяти кучи)
    3. Запросить HttpContent.getReadableByteChannel() для отправки содержимого.
    4. Запросить HttpContent.getInputStream() для отправки контента.
  3. Ошибка возврата, указывающая «Неизвестный контент»

Существует 2 основных реализации HttpOutput.ContentFactory присутствует в Jetty 9.4.0 +

  • ResourceContentFactory, который обрабатывает временное содержимое (не кэшируется) - если содержимое превышает maxBufferSize, то исходные версии ByteBuffer не будут возвращены.
  • CachedContentFactory, который будет кешировать различные ByteBuffer значения, возвращенные из предыдущего HttpOutput использования.

В CachedContentFactory есть метод isCacheable(Resource), который запрашивается, чтобы узнать, является ли предоставленный ресурсследует вводить в кэш-память в памяти или нет.

Что касается параметра CompressedContentFormat[] precompressedFormats в конструкторе CachedContentFactory, который относится к форматам "предварительного сжатия", поддерживаемым как ResourceService, так иCachedContentFactory.

Типичная настройка по умолчанию: ...

CompressedContentFormat[] precompressedFormats = {
    CompressedContentFormat.GZIP, // gzip compressed
    CompressedContentFormat.BR, // brotli compressed
    new CompressedContentFormat("bzip", ".bz") // bzip compressed
};
CachedContentFactory cachedContentFactory = new CachedContentFactory(parentContentFactory,
   resourceFactory, mimeTypes, useFileMappedBuffers,
   useEtags, precompressedFormats);
resourceService.setContentFactory(cachedContentFactory);

Эти precompressedFormats относятся к статическому (и неизменяемому) содержимому, которое было предварительно сжато перед запуском сервера.

Это позволяет клиенту отправлять запрос, скажем ...

GET /css/main.css HTTP/1.1
Host: example.hostname.com
Accept-Encoding: gzip, deflate

and если каталог «Базовый ресурс» имеет ${resource.basedir}/css/main.css И a ${resource.basedir}/css/main.css.gz, то ответ будет отправлен из main.css.gz (не main.css), что приведет к ответу HTTP, подобному...

HTTP/1.1 200 OK
Date: Wed, 15 May 2019 20:17:22 GMT
Vary: Accept-Encoding
Last-Modified: Wed, 15 May 2019 20:17:22 GMT
Content-Type: text/css
ETag: W/"H/6qTDwA8vsH/6rJoEknqc"
Accept-Ranges: bytes
Content-Length: 11222
...