java - 嵌入式 jetty 中的异步 servlet 似乎在高负载时写入错误响应

标签 java asynchronous jetty servlet-3.0

当我发送手动请求时,下面给出的代码工作正常。如果我使用 siege (siege -c 500 -r 100 'http://localhost:8080/?name=Chandru&age=560') 生成请求,我开始在 jetty 的日志中看到这些消息:

2013-01-02 00:06:55.761:WARN:oejh.HttpGenerator:Ignoring extra content {name: "
2013-01-02 00:07:56.393:WARN:oejh.HttpGenerator:Ignoring extra content Chandru
2013-01-02 00:07:56.393:WARN:oejh.HttpGenerator:Ignoring extra content ", age: 
2013-01-02 00:07:56.393:WARN:oejh.HttpGenerator:Ignoring extra content 560
2013-01-02 00:07:56.393:WARN:oejh.HttpGenerator:Ignoring extra content }

我在 Java 1.7.0_10 上使用 Jetty 8.1.8.v20121106。我做错了什么?

public class Main {

    public static void main(String[] args) throws Exception {
        final Server server = new Server(8080);
        final ServletContextHandler context = new ServletContextHandler(server, "/");
        final ServletHolder servlet = new ServletHolder(new RequestHandler(new Responder()));
        servlet.setAsyncSupported(true);
        context.addServlet(servlet, "/");
        server.start();
    }
}

class RequestHandler extends HttpServlet {

    private final Responder responder;

    public RosterHandler(Responder responder) {
        this.responder = responder;
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        responder.process(request.startAsync());
    }
}

class Responder {

    private final ExecutorService pool;

    public Responder() {
        this.pool = Executors.newFixedThreadPool(100);
    }

    public void process(final AsyncContext ctx) {
        pool.execute(new Runnable() {
            @Override
            public void run() {

                final String name = ctx.getRequest().getParameter("name");
                final int age = Integer.parseInt(ctx.getRequest().getParameter("age"));

                ctx.getResponse().setContentType("application/json");
                try (final PrintWriter w = ctx.getResponse().getWriter()) {
                    w.printf("{name: \"%s\", age: %d}", name, age);
                } catch (IOException e) {
                    e.printStackTrace(System.err);
                }
            }
        });
    }
}

最佳答案

您应该调用 context.complete() 来表示您的工作已完成,并且可以认为异步连接已完成。

关于java - 嵌入式 jetty 中的异步 servlet 似乎在高负载时写入错误响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14113178/

相关文章:

java - Jetty(?) 在 Windows 上破坏大型 js 文件

java - Jetty 和 Netty 集成

java - 在 Jetty 中,如何记录持久 HTTP 连接何时打开和关闭?

c# - 异步/等待继续

c# - 使用 Task.Delay() 的成本是多少?

c# - Task.RunSynchronously() 工作 "recursively"吗?

java - 我如何转义冒号( :) in a mysql query over jdbc that contains a variable assignment?

Java split() 在索引 0 处有空间

java - Java 中字符串转换的简单属性

c# - Java 和 C# 应用程序之间的 SSL 通信