从Jetty 9服务器内的工作线程执行新的HttpServletRequest

时间:2014-02-15 18:05:34

标签: jetty embedded-jetty jetty-9

我的网络应用程序基于(嵌入式)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根据需要设置当前线程。不知道从哪里开始。 UPDATE 尝试setServerClasses([]),然后将当前的HttpChannel设置为我从另一个线程中偷走的那个。可怜失败:java.lang.IllegalAccessError:试图从类中访问方法org.eclipse.jetty.server.HttpChannel.setCurrentHttpChannel(Lorg / eclipse / jetty / server / HttpChannel;)V ...
  3. 理想情况下,找到一种更好/更合适的方式来提供“顶级”请求,而无需通过网络。理想情况下,它会在同一个线程上执行,但我不太关心它。
  4. 请记住,不幸的是,我现在无法避免这种情况。我宁愿直接调用代码,但我不能,因为我必须添加到我的代码太大而无法处理此时太依赖于某些第三方过滤器我甚至无法修改(并且仅用作过滤器,关于实际要求)。

    请帮忙!

0 个答案:

没有答案