3

我的网络应用程序基于(嵌入式)Jetty 9。在 Jetty内部运行的代码(即来自 *.war 文件)有时需要将 HTTP 请求执行回 Jetty 及其本身,完全异步到“真实" 来自网络的 HTTP 请求。

我知道你会说什么,但这是我在将多个不同的产品合并到一个容器中后最终遇到的情况,目前无法避免。一个权宜之计已经到位 - 它实际上将网络 HTTP 请求发送回自身(目前使用 Jetty 客户端,但这并不重要)。然而,这不仅增加了更多开销,而且还不允许我们传递我们希望能够通过请求属性传递的实际对象引用。

希望能够做一些事情,比如构建新的 HttpServletRequest 和 HttpServletResponse 对,并使用调度程序“包含”(或类似)我们目前只能通过网络访问的另一个 servlet。我们已经构建了它们的“虚拟”实现,但是这在 Jetty 的调度程序第 120 行失败,并出现空指针异常:

public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException
{
  Request baseRequest=(request instanceof Request)?((Request)request):HttpChannel.getCurrentHttpChannel().getRequest();

...因为这不是Jetty 的 Request 类的实例,并且 getCurrentHttpChannel() 返回 null 因为线程是工作线程,而不是 http 服务线程,并且没有设置 Jetty 的线程本地。

我正在考虑选择,但如果有人可以提供的话,我想要一些指导。我正在考虑的一些事情:

  1. 实际上使用 Jetty 的 Request 类作为基础。目前对 Web 应用程序不可见(一个容器类,可能必须使用类路径和类加载器。可能仍然不可能(不知道那里会发生什么)。
  2. 使用 Jetty 的线程本地变量,尝试告诉 Jetty 根据需要设置当前线程。不知道从哪里开始。更新试图 setServerClasses([]) 然后将当前 HttpChannel 设置为我从另一个线程“偷”的那个。惨遭失败:java.lang.IllegalAccessError:试图从类访问方法 org.eclipse.jetty.server.HttpChannel.setCurrentHttpChannel(Lorg/eclipse/jetty/server/HttpChannel;)V ...
  3. 理想情况下,找到一种更好/正确的方式来提供“顶级”请求,而无需通过网络。理想情况下会在同一个线程上执行,但我不太关心这一点。

请记住,不幸的是,我目前无法避免这种情况。我宁愿直接调用代码,但我不能,因为我必须添加到我的代码现在太大而无法处理,并且太依赖于一些我什至无法修改的第三方过滤器(并且只能用作过滤器,根据实际要求)。

请帮忙!

4

0 回答 0