Jetty ResourceCache vs CachedContentFactory
我正在从JettyJetty 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
9.0.x
迁移到9.4.x
org.eclipse.jetty.server.ResourceCache
已从jetty9.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()
发送内容
处理临时内容(未缓存)-如果内容超过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之前,这不是一个问题。有什么意见吗?(供参考)