java - jetty 升级 8 至 9 个缺失的类(class)

标签 java eclipse webserver jetty httpclient

我之前问过这个问题-> 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() 不再具有公共(public)默认构造函数,因此我无法使用默认构造函数覆盖它。
在新的 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();

最佳答案

import org.eclipse.jetty.io.Buffer;



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

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



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

import org.eclipse.jetty.server.AbstractHttpConnection;



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

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



使用java.net.URI .
HttpURI Jetty 9 和你在 Jetty 8 中使用的没有关系。

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

HttpClient no longer has:



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

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

setThreadPool



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

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

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

setMaxConnectionsPerAddress



连接现在是池化的。

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

setMaxConnectionsPerDestination​setMaxRequestsQueuedPerDestination​

setTimeout



现在有很多超时。
  • HttpClient.setIdleTimeout
  • HttpClient.setConnectTimeout
  • 请求.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 是一个内部类,并不意味着您可以使用/访问/配置或通常弄乱。

    我怀疑您正在查看一个古老的代码库,该代码库具有用于 jetty 客户端的 HttpExchange 概念。

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

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

    我建议你从 Response.CompleteListener 开始只是起初,仔细观察 Result对象在其 onComplete(Result) 中传递给您方法。

    IO.copyThread(InputStream, OutputStream) no longer exists



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

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



    危险将罗宾逊 - 这表明代码库非常糟糕/危险。
    这样做的代码库本来就不应该存在。

    虽然有访问连接/端点/ channel /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 端 Async I/O 实现智能地挂接到 HttpClient 的 Async I/O 行为。

    关于java - jetty 升级 8 至 9 个缺失的类(class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49279663/

    相关文章:

    java - 服务器加载静态资源太慢

    java - for 循环产生一系列不同的数字

    java - 如何在不删除其他变量的情况下更新java中的属性值

    android - 将 MySql 数据库迁移到 sqlite for android

    java - 缺少图像/文件的可运行 JAR(资源)

    python - python中的套接字服务器拒绝连接

    java - 如何在Eclipse插件中以编程方式设置TextEditor的字符串输入?

    java - 通过集合进行迭代期间出现 ConcurrentModificationException

    android - 意外的字符 '\' build.gradle

    api - 谁与 API (REST) 对话? Web 客户端与服务器?