缺少码头升级 8 到 9 类

jetty upgrade 8 to 9 missing classes

我之前问过这个问题 -> 这有助于进行一些缺失的特定升级 packages/classes。

我现在有一个稍旧的版本正在升级,它有软件包和 classes 不再在 Jetty 中,我找不到任何文档来查看它们有什么或 where/if已被替换。

以下不再存在:

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() 不再具有 public 默认构造函数,因此我无法使用默认构造函数覆盖它。 在新的 HttpExchange(9.4) 中,它需要在构造函数中包含以下三个参数:

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

他们现在 class 穿什么?我只有 访问 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 或其他 class?

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

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

import org.eclipse.jetty.io.Buffer;

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

import org.eclipse.jetty.util.thread.Timeout;

不替换,idle timeout 处理in-line与各个需要它的地方。

import org.eclipse.jetty.server.AbstractHttpConnection;

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

HttpURI.getCompletePath no longer exists can I use getPath() or getDecodedPath()

使用java.net.URI.

Jetty 9 的 HttpURI 与您在 Jetty 8 中使用的内容无关。

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

HttpClient no longer has:

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

根据您提出的问题类型,您可能想要查看 Jetty 具有的整个可扩展代理层 built-in

setThreadPool

使用setExecutor()

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

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

扰乱执行器(线程池)的最常见原因是人为地限制资源利用率。搞乱executor是限制资源利用的错误地方。

setMaxConnectionsPerAddress

连接现在被合并。

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

参见 setMaxConnectionsPerDestination​setMaxRequestsQueuedPerDestination​

setTimeout

现在有很多超时。

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

setRequestHeaderSize setResponseHeaderSize

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

I can use QueuedThreadPool on HttpConfiguration, and most of the above methods are also on HTTPConfiguration, but is setTimeout(httpClient), now setIdleTimeout(HttpConfiguration)?

HttpClient 和 HttpConfiguration 无关。

HttpExchange() no longer has a public default constructor and therefore I cant override it with a default constructor. In the new HttpExchange(9.4) it requires the following three arguments in construtctor: What class are they on now? I only have access to the HttpClient _client, ServletConfig and ServletContext

The following methods no longer exist either:

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 Is there a replacement for HttpExchange or another class with these methods?

HttpExchange 是一个内部 class 并且不适合您 use/access/configure 或通常乱用。

我怀疑您正在查看一个古老的代码库,其中包含 jetty-client.

的 HttpExchange 概念

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

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

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

IO.copyThread(InputStream, OutputStream) no longer exists

已不存在,无替代(它是许多 bugs/issues 的来源)

org.eclipse.jetty.server.RequestRequest no longer has getConnection();

DANGER WILL ROBINSON - 这表示严重 bad/dangerous 代码库。 执行此操作的代码库本来就不应该存在。

虽然有内部方法可以访问 connection/endpoint/channel/httpinput/httpoutput/interceptors,但要想成功,必须考虑所有这些概念,而不仅仅是连接。

你的问题尖叫 "I have an old proxy i'm attempting to update"。 Jetty 现在是 100% 异步的,Servlet 2.x 时代的旧 InputStream/OutputStream 行为早已一去不复返了。如果您不开发具有 Async I/O 的代理解决方案,那么您注定会无休止地 errors/issues/failures,直到您针对 Servlet 3.1 Async I/O 功能更新它。

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

您将结束扩展 AsyncProxyServlet(对于典型的代理行为)或 AsyncMiddleManServlet(对于具有内容修改行为的代理),并挂钩 servlet 端异步 I/O 实现智能地进入 HttpClient 的 Async I/O 行为。