将Jetty 8从后台升级到9后出现错误的网关错误

我有一个运行Jetty 8作为embedded式HTTP服务器的Java应用程序。 这是一个后端服务,在端口20000上运行。我的实际服务的代码是不相关的。 我在GitHub上创build了一个示例项目来演示这个问题: https : //github.com/janvanmansum/apache-jetty9-502-error

主代码显示在下面供参考。 这取决于几个库:

javax.servlet:javax.servlet-api:3.1.0 commons-io:commons-io:2.5 org.eclipse.jetty:jetty-server:9.4.6.v20170531 or 8.2.0.v20160908 org.eclipse.jetty:jetty-servlet:9.4.6.v20170531 or 8.2.0.v20160908 

BackendServer.java

 package nl.knaw.dans.test; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletContextHandler; public class BackendServer { public static void main(String[] args) throws Exception { Server server = new Server(20000); ServletContextHandler handler = new ServletContextHandler(); handler.addServlet(AcceptAllServlet.class, "/acceptAll"); handler.addServlet(ReadAllServlet.class, "/readAll"); server.setHandler(handler); server.start(); server.join(); } } 

AcceptAllServlet

 package nl.knaw.dans.test; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class AcceptAllServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("AcceptAll Servlet OK!"); resp.setStatus(200); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setStatus(201); } } 

ReadAllServlet

 package nl.knaw.dans.test; import org.apache.commons.io.IOUtils; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileOutputStream; import java.io.IOException; public class ReadAllServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("ReadAll Servlet OK!"); resp.setStatus(200); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { FileOutputStream fos = new FileOutputStream("target/outfile"); try { IOUtils.copy(req.getInputStream(), fos); } finally { fos.close(); } resp.setStatus(201); } 

}

通过使用以下configuration提供代理服务的Apache HTTP Server将服务暴露给外部世界:

 <VirtualHost *:80> ProxyTimeout 600 <Location / > ProxyPass http://localhost:20000/ ProxyPassReverse http://localhost:20000/ </Location> </VirtualHost> 

通过Apache将文件发送到后端服务可以和Jetty 8一起使用任何大小的文件。 但是,在Jetty 9中,当发布到AcceptAllServlet时文件大小超过256K时,出现502 Bad Gateway错误。 我的猜测是,这与Apache没有完成将数据写入后端服务有关。 但是,如果后端服务器想要响应401 Unauthorized我不希望它先读取它将要拒绝的所有数据。

任何想法,为什么这显然已经改变? 我configuration错误的Apache或我错误地使用Jetty? 或者这是一个错误?

谢谢你的帮助!