【问题标题】:jetty upgrade 8 to 9 missing classes码头升级 8 至 9 个缺失的班级
【发布时间】:2018-03-14 13:57:21
【问题描述】:

我之前曾问过这个问题 -> Upgrading Jetty 8 to Jetty 9 这有助于对一些缺少的包/类进行特定升级。

我现在正在升级一个稍旧的版本,它的包和类不再在 Jetty 中,我找不到任何文档来查看它们被替换的内容或位置/是否被替换。

以下不再存在:

import org.eclipse.jetty.io.Buffer;
import org.eclipse.jetty.util.thread.Timeout;
import org.eclipse.jetty.server.AbstractHttpConnection;

HttpURI.getCompletePath 不再存在,我可以使用 getPath() 或 getDecodedPath() HttpClient 不再有:

setThreadPool 
setMaxConnectionsPerAddress 
setTimeout 
setRequestHeaderSize 
setResponseHeaderSize

我可以在HttpConfiguration上使用QueuedThreadPool,上面的大部分方法也在HTTPConfiguration上,不过是setTimeout(httpClient),现在是setIdleTimeout(HttpConfiguration)?

HttpExchange() 不再具有公共默认构造函数,因此我无法使用默认构造函数覆盖它。 在新的 HttpExchange(9.4) 中,它在构造函数中需要以下三个参数:

 HttpDestination destination, HttpRequest request, List<Response.ResponseListener> listeners 

他们现在上什么课?我只有 访问 HttpClient _client、ServletConfig 和 ServletContext

以下方法也不再存在:

onResponseContent
onResponseHeaderComplete
onResponseStatus
onResponseHeader
onConnectionFailed
setRequestHeader
exchange.setScheme(HttpScheme.HTTPS.equals(request.getScheme())?HttpScheme.HTTPS_BUFFER:HttpScheme.HTTP_BUFFER);
exchange.setMethod(request.getMethod());
exchange.setURL(url.toString());
exchange.setVersion(request.getProtocol());
addRequestHeader

这些方法是否可以替代 HttpExchange 或其他类?

IO.copyThread(InputStream, OutputStream) 不再存在

org.eclipse.jetty.server.RequestRequest 不再有 getConnection();

【问题讨论】:

    标签: java eclipse webserver jetty httpclient


    【解决方案1】:

    导入 org.eclipse.jetty.io.Buffer;

    不存在,我们现在使用java.nio.ByteBuffer

    导入 org.eclipse.jetty.util.thread.Timeout;

    没有替换,空闲超时根据需要它的各个地方进行处理。

    导入 org.eclipse.jetty.server.AbstractHttpConnection;

    没有替换,整个 Connector 层大约在 6 年前就已经完全重写了。

    HttpURI.getCompletePath 不再存在,我可以使用 getPath() 还是 getDecodedPath()

    使用java.net.URI

    Jetty 9 的HttpURI 与你在 Jetty 8 中使用的没有关系。

    我们在内部使用java.net.URI 做很多事情,并且只使用HttpURI 拼凑一个URI,用于HTTP/2 物理连接与逻辑通道请求。

    HttpClient 不再有:

    HttpClient 大约在 6 年前被重写,以满足更新后的 HTTP/1.1 RFC、HTTP/2、FastCGI 和代理使用。

    根据您提出的问题类型,您可能需要了解 Jetty 内置的整个可扩展代理层

    设置线程池

    使用setExecutor()

    注意:这不是一个明智的做法,尤其是 Jetty 8 和 Jetty 9 之间的连接处理存在巨大差异。

    可以从 [1..n] 个线程处理单个请求(在其生命周期内)。

    弄乱执行器(线程池)的最常见原因是人为地限制资源利用率。与执行者混在一起是限制资源利用率的错误地方。

    setMaxConnectionsPerAddress

    连接现在是池化的。

    您可以选择您的连接池实现,还可以在HttpClient 上设置一些通用连接池行为。

    setMaxConnectionsPerDestination​setMaxRequestsQueuedPerDestination​

    设置超时

    现在有很多超时。

    • HttpClient.setIdleTimeout
    • HttpClient.setConnectTimeout
    • Request.setIdleTimeout
    • 连接空闲超时
    • 连接池空闲超时

    setRequestHeaderSize 设置响应头大小

    jetty-client 不存在,这些是服务器端的概念。

    我可以在HttpConfiguration上使用QueuedThreadPool,上面的大部分方法也在HTTPConfiguration上,不过是setTimeout(httpClient),现在是setIdleTimeout(HttpConfiguration)?

    HttpClient 和 HttpConfiguration 无关。

    HttpExchange() 不再具有公共默认构造函数,因此我无法使用默认构造函数覆盖它。在新的 HttpExchange(9.4) 中,它在构造函数中需要以下三个参数: 他们现在上什么课?我只能访问 HttpClient _client, ServletConfig 和 ServletContext

    以下方法也不再存在:

    onResponseContent onResponseHeaderComplete onResponseStatus onResponseHeader onConnectionFailed setRequestHeader exchange.setScheme(HttpScheme.HTTPS.equals(request.getScheme())?HttpScheme.HTTPS_BUFFER:HttpScheme.HTTP_BUFFER); exchange.setMethod(request.getMethod()); exchange.setURL(url.toString()); exchange.setVersion(request.getProtocol()); addRequestHeader 有没有 用这些方法替代 HttpExchange 或其他类?

    HttpExchange 是一个内部类,不适合您使用/访问/配置或通常乱用。

    我怀疑您正在查看一个古老的代码库,其中包含用于码头客户端的 HttpExchange 概念。

    Jetty 9 中不再存在 HttpClient 的整个概念。

    您创建一个org.eclipse.jetty.client.api.Request(参见各种HttpClient.newRequest() 方法),在请求中连接到各种侦听器,然后Request.send() 它。响应您感兴趣的各种侦听器事件。

    我建议您首先从Response.CompleteListener 开始,仔细查看在其onComplete(Result) 方法中传递给您的Result 对象。

    IO.copyThread(InputStream, OutputStream) 不再存在

    不再存在,没有替代品(它是许多错误/问题的根源)

    org.eclipse.jetty.server.RequestRequest 不再有 getConnection();

    DANGER WILL ROBINSON - 这表明代码库非常糟糕/危险。 这样做的代码库一开始就不应该存在。

    虽然有访问连接/端点/通道/httpinput/httpoutput/interceptors 的内部方法,但所有这些概念都必须考虑到任何成功的希望,而不仅仅是连接。

    您的问题是“我正在尝试更新一个旧代理”。 Jetty 现在是 100% 异步的,Servlet 2.x 时代的旧 InputStream/OutputStream 行为早已不复存在。如果您在开发代理解决方案时没有考虑到 Async I/O,那么在您更新 Servlet 3.1 Async I/O 功能之前,您注定会遇到无穷无尽的错误/问题/失败。

    帮自己一个忙,阅读整个 org.eclipse.jetty.proxy 包。

    您最终会扩展AsyncProxyServlet(用于典型代理行为)或AsyncMiddleManServlet(用于具有内容修改行为的代理),将 servlet 端异步 I/O 实现挂钩到 Async I/O 行为HttpClient 智能。

    【讨论】:

    • 代码库正在使用 servlet 3.1.0 实现,并且他们已经用自己的 AsyncProxyServlet 实现有效地覆盖了 Servlet,即动态创建 HTTPExchange 并从 ServletConfig 中创建 HTTPCLient。有一个 proxyservlet 和 asyncproxyservlet 实现来处理这个问题。我想知道是否可以直接将两者都替换为 org.eclipse.jetty.proxy.ProxyServlet org.eclipse.jetty.proxy.AsyncProxyServlet 是否有一些关于配置代理和负载平衡的码头章节?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 2019-04-26
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 2020-05-25
    相关资源
    最近更新 更多