Jetty ResourceCache vs CachedContentFactory

Jetty ResourceCache vs CachedContentFactory,jetty,embedded-jetty,jetty-9,Jetty,Embedded Jetty,Jetty 9,我正在从Jetty9.0.x迁移到9.4.x org.eclipse.jetty.server.ResourceCache已从jetty9.4.x 问题: 1) 在9.4.x中,这个类的替代品是什么 2) 我发现,CachedContentFactory是这个类最接近的等价物,但是这个类的构造函数需要一个额外的参数CompressedContentFormat[]precompressedFormats。如果这是一个正确的替换,那么我不确定我应该为这个参数传递什么?它可以是空数组吗?抱歉,jav

我正在从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也帮不了什么忙

首先是一些历史

在主要版本Jetty 9.0.0期间,有两种处理静态内容的主要方法:
DefaultHandler
(以及下级
ResourceHandler

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

接下来,解析为允许
ResourceHandler
(现在是
DefaultHandler
)具有定制的目录列表。为此,引入了
HttpOutput.ContentFactory
接口

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

这意味着,在这一点上,我们有

  • DefaultServlet
    (或
    ResourceHandler
  • 它有一个
    ResourceService
  • 它从一个
    HttpOutput.ContentFactory
  • 返回的
    HttpContent
    可以是静态资源、目录列表或欢迎文件
  • 当需要发送一段静态内容时,所采取的步骤是

  • HttpOutput.ContentFactory.getContent(路径,maxBufferSize)
  • 要求提供可用于发送引用内容的
    HttpContent
    的表示形式,如下之一(按此顺序):
  • 如果将
    HttpChannel
    配置为使用“直接缓冲区”,则请求表示整个内容的
    HttpContent.getDirectBuffer()
    。(这可能是一个内存映射文件,使用的堆内存量可以忽略不计)
  • 请求表示整个内容的
    HttpContent.getIndirectBuffer()
    。(这可能是一个内存映射文件,使用的堆内存量可以忽略不计)
  • 请求
    HttpContent.getReadableByteChannel()
    发送内容
  • 请求
    HttpContent.getInputStream()
    发送内容
  • 返回指示“未知内容”的错误
  • Jetty 9.4.0中有两种主要的HttpOutput.ContentFactory实现+

    • ResourceContentFactory
      处理临时内容(未缓存)-如果内容超过
      maxBufferSize
      则不会返回原始
      ByteBuffer
      版本
    • CachedContentFactory
      将缓存以前使用的
      HttpOutput
      返回的各种
      ByteBuffer
    CachedContentFactory
    有一个
    isCacheable(Resource)
    方法,该方法被询问,以确定提供的资源是否应进入内存缓存

    关于
    CachedContentFactory
    构造函数中的
    CompressedContentFormat[]precompressedFormats
    参数,它指的是
    ResourceService
    CachedContentFactory
    都支持的“预压缩”格式

    典型的默认设置是

    压缩内容格式[]预压缩格式={
    CompressedContentFormat.GZIP,//GZIP compressed
    CompressedContentFormat.BR,//brotli compressed
    新的压缩内容格式(“bzip”,“.bz”)//bzip压缩
    };
    CachedContentFactory CachedContentFactory=新的CachedContentFactory(parentContentFactory,
    resourceFactory、mimeTypes、useFileMappedBuffers、,
    使用标签、预压缩格式);
    setContentFactory(cachedContentFactory);
    
    这些
    precompressedformat
    指的是在服务器启动之前预压缩的静态(不可变)内容

    这允许客户端发送请求,例如

    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
    (而不是
    main.css
    )提供,从而产生一个类似于

    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
    

    在我回答之前,为什么要定制
    ResourceCache
    (一个纯内部类)?您正在做的事情现在很可能在别处完成。我正在重写
    isCacheable(Resource Resource)
    方法,该方法读取一个布尔值,该值指示是否为所有资源启用了资源缓存。`@Override protected boolean isCacheable(Resource Resource){if(!cacheEnabled)return false;return super.isCacheable(resource);}`大多数情况下都是真的,我们甚至不需要重写它。不管怎样,我想知道答案!此外,还发现`HtpOutput.sendContent(HttpContent内容)抛出IOException`提交http通道。因此,任何第二次调用
    sendContent
    的尝试都会引发IO异常。在9.0之前,这不是一个问题。有什么意见吗?(供参考)