我的网络应用程序基于(嵌入式)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的线程本地起来。
我正在考虑各种选择,但如果有人能提供选择,我希望得到一些指导。我正在考虑的一些事情:
请记住,不幸的是,我现在无法避免这种情况。我宁愿直接调用代码,但我不能,因为我必须添加到我的代码太大而无法处理此时太依赖于某些第三方过滤器我甚至无法修改(并且仅用作过滤器,关于实际要求)。
请帮忙!