【问题标题】:ProxyServlet stop working after migration from jetty 8 to jetty 9从 jetty 8 迁移到 jetty 9 后 ProxyServlet 停止工作
【发布时间】:2014-12-23 17:05:12
【问题描述】:

我有一个 Eclipse 插件,它使用带有 ProxyServlet 的码头服务器。基本上,实现如下:

    ServletHolder proxyServletHolder = new ServletHolder(new SubClassOfProxyServlet()); 
    proxyServletHolder.setAsyncSupported(true);
    ServletHandler proxyServletHandler = new ServletHandler();
    proxyServletHandler.addServletWithMapping(proxyServletHolder, "/mapping/url");

之后,我将代理处理程序添加到处理程序列表并将此列表设置为服务器:

    HandlerList handlers = new HandlerList();
    handlers.setHandlers(new Handler[] {
            . // Other Handlers
            .
            proxyServletHandler,
            .
            .
            .
            new DefaultHandler()
        });
    server.setHandler(handlers);

jetty 8 的一切都很有效,但在迁移到 jetty 9 后,我收到以下错误:

Caused by: java.lang.IllegalStateException: No server executor for proxy at org.eclipse.jetty.proxy.ProxyServlet.createHttpClient(ProxyServlet.java:279) at org.eclipse.jetty.proxy.ProxyServlet.init(ProxyServlet.java:123) ... 24 more

使用 ProxyServer 的机制是否发生了变化?我错过了什么吗?

【问题讨论】:

    标签: eclipse-plugin jetty


    【解决方案1】:

    您需要更新您的SubClassOfProxyServlet 类以包含现在从Server 传递到代理的各种配置,然后这些配置又被内部HttpClient 使用

    特定错误意味着您没有正确传递执行程序。

    对于 Executor 特定部分,您有 2 种选择(解决此问题后您可能需要配置更多内容)

    1. 将初始化参数maxThreads 设置为有效的整数值。
    2. 或创建一个执行器,并在应用程序部署/启动时将其设置在ServletContext.setAttribute("org.eclipse.jetty.server.Executor", myExecutor) 的servlet 上下文属性中。 - 您也可以在 SubClassOfProxyServlet.init(ServletConfig config) 方法中执行此操作。

    【讨论】:

    • 你能举个例子吗?很难找到一个
    • 很难做到,因为大多数人不会继承 ProxyServlet,而是按原样使用它。此外,一些长期的注意事项,ProxyServlet 正在慢慢被弃用并被 AsyncProxyServlet 取代(为了正确使用异步 I/O,几乎完全重写)
    • 感谢您的帮助。会尝试以某种方式处理它;-)
    【解决方案2】:

    我能够通过上面提到的maxThreads 方法让它工作,在创建时设置它。将此应用于原始示例将导致:

    ServletHolder proxyServletHolder = new ServletHolder(new SubClassOfProxyServlet()); 
    proxyServletHolder.setAsyncSupported(true);
    proxyServletHolder.setInitParameter("maxThreads", "2");
    ServletHandler proxyServletHandler = new ServletHandler();
    proxyServletHandler.addServletWithMapping(proxyServletHolder, "/mapping/url");
    

    【讨论】:

      【解决方案3】:

      以下是如何将 servlet 添加到处理程序列表的示例:

          private void addWebApp(String contextPath, String resourceBase, Server server) {
      
              WebAppContext webAppContext = new WebAppContext();
              // webAppContext.setDescriptor(webapp + "/WEB-INF/web.xml");
              webAppContext.setResourceBase(resourceBase);
              webAppContext.setContextPath(contextPath);
              webAppContext.setParentLoaderPriority(true);
              webAppContext.setWelcomeFiles(new String[] {"index.html"});
              webAppContext.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false");
              webAppContext.setInitParameter("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false");
      
              final ServletHolder servletHolder =new ServletHolder();
              servletHolder.setAsyncSupported(ContentBasedProxyServlet.class);
              servletHolder.setAsyncSupported(true);
      
              webAppContext.addServlet(servletHolder, "/*");
      
              HandlerList handlers = (HandlerList) server.getHandler();
              handlers.addHandler(webAppContext);
      }
      

      【讨论】:

        【解决方案4】:

        此外,您还可以将maxThreads 转为web.xml

        <servlet>
            <servlet-name>proxy</servlet-name>
            <servlet-class>example.MyProxyServlet</servlet-class>
            <init-param>
                <param-name>maxThreads</param-name>
                <param-value>5</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
            <async-supported>true</async-supported>
        </servlet>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-08
          • 2012-09-07
          • 2014-03-02
          相关资源
          最近更新 更多