Jetty ResourceCache与CachedContentFactory

时间:2019-05-15 16:52:30

标签: jetty embedded-jetty jetty-9

我正在从码头9.0.x迁移到9.4.x

org.eclipse.jetty.server.ResourceCache已从码头9.4.x中删除

问题:

1)9.4.x中此类的替代品是什么?

2)我发现CachedContentFactory是该类的最接近等价物,但是该类的构造函数需要一个额外的参数CompressedContentFormat[] precompressedFormats。如果这是正确的替代品,那么我不确定应该将此参数传递给什么?可以是空数组吗?抱歉,javadocs也没有太大帮助。

1 个答案:

答案 0 :(得分:1)

首先介绍一些历史。

在主要版本Jetty 9.0.0中,有两种处理静态内容的主要方法: DefaultHandler(和下级ResourceHandler)。

当主要版本Jetty 9.4.0推出时(这是Jetty的4个主要版本,随后是Jetty 9.0.0),我们努力使这两个组件都使用通用代码库,因此ResourceService创建是为了在一个地方标准化静态内容的服务。现在DefaultHandlerResourceHandler之间的差异已大大减少。 (注意:DefaultHandler仍支持其自身的更多功能以及各种HTTP规范的更多功能。)

接下来,Issue #539已解决,允许ResourceHandler(现在DefaultHandler)具有自定义目录列表。为此,引入了HttpOutput.ContentFactory接口。

新的HttpOutput.ContentFactory负责返回代表提供的路径的HttpContent(和可选的最大缓冲区大小配置选项)。

因此,这意味着我们有...

  1. 一个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. 返回错误,指示“未知内容”

Jetty 9.4.0+中存在HttpOutput.ContentFactory的2种主要实现方式

  • ResourceContentFactory处理临时内容(未缓存)-如果内容超过maxBufferSize,则将不返回原始ByteBuffer版本。
  • CachedContentFactory,将缓存从先前的ByteBuffer返回的各种HttpOutput值。

CachedContentFactory有一个isCacheable(Resource)方法,该方法被询问以了解所提供的资源是否应进入内存缓存。

关于CompressedContentFormat[] precompressedFormats构造函数中的CachedContentFactory参数,指的是ResourceServiceCachedContentFactory都支持的“预压缩”格式。 / p>

典型情况下,默认设置为...

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

,如果“基础资源”目录中有一个${resource.basedir}/css/main.css 一个${resource.basedir}/css/main.css.gz,则响应将从main.css.gz(而不是{{ 1}}),导致HTTP响应,如...

main.css