我的Web应用程序基于(嵌入式)Jetty 9.在Jetty内部运行的代码(即来自* .war文件)需要有时将一个HTTP请求执行回Jetty及其本身,与"real" 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 's Request class and getCurrentHttpChannel() returns null because the thread is a worker thread, not an http serving one and does not have Jetty' s线程本地设置的实例 .

我正在考虑各种选择,但如果有人能提供,我希望得到一些指导 . 我想到的一些事情:

  • 实际上使用Jetty 's Request class as a base. Currently not visible to the web app (a container class, would have to play with classpath and class loaders perhaps. May still be impossible (don' t知道会有什么期待) .

  • 与Jetty一起玩's thread locals, attempt to tell Jetty to set up current thread as necessary. Don'知道从哪里开始 . UPDATE 尝试setServerClasses([]),然后将当前HttpChannel设置为另一个线程的I 'stole' . 失败了:java.lang.IllegalAccessError:试图从类中访问方法org.eclipse.jetty.server.HttpChannel.setCurrentHttpChannel(Lorg / eclipse / jetty / server / HttpChannel;)

  • 理想情况下,找到一种更好/正确的方式来提供"top"请求,而无需通过网络 . 理想情况下会在同一个线程上执行,但我不太关心它 .

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

请帮忙!