Servlets 带有嵌入式Jetty的异步Servlet

Servlets 带有嵌入式Jetty的异步Servlet,servlets,asynchronous,jetty,embedded-jetty,Servlets,Asynchronous,Jetty,Embedded Jetty,我想构建一个真正简单的示例,用于在嵌入式Jetty服务器中调用异步servlet。当我尝试从请求的AsyncContext启动Runnable时,会得到一个NullPointerException。 这是服务器代码: public static void main(String[] args) throws Exception { Server server = new Server(8080); ServletHandler handler = new ServletHandl

我想构建一个真正简单的示例,用于在嵌入式Jetty服务器中调用异步servlet。当我尝试从请求的AsyncContext启动Runnable时,会得到一个NullPointerException。 这是服务器代码:

public static void main(String[] args) throws Exception {
    Server server = new Server(8080);
    ServletHandler handler = new ServletHandler();
    server.setHandler(handler);
    ServletHolder holder = handler.addServletWithMapping(AsyncServlet.class, "/*");
    holder.setAsyncSupported(true);
    server.start();
    server.join();
}
以下是servlet代码:

public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
    final AsyncContext ctxt = req.startAsync();
    ctxt.start(() -> {
        ctxt.complete();
    });
}
这是堆栈跟踪的错误:

java.lang.NullPointerException
at org.eclipse.jetty.server.AsyncContextState$2.run(AsyncContextState.java:168)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:620)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:540)
at java.lang.Thread.run(Thread.java:745) 
可能服务器需要任何额外的配置。有什么建议吗


添加:同一个servlet在嵌入式tomcat中运行时没有任何更改。

不要直接使用
ServletHandler
,这是一个内部类,它创建/使用/管理
ServletContextHandler

下面是对示例的修改,它正确地设置了servlet上下文

包装码头;
导入java.io.IOException;
导入javax.servlet.AsyncContext;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入org.eclipse.jetty.server.server;
导入org.eclipse.jetty.servlet.ServletContextHandler;
导入org.eclipse.jetty.servlet.ServletHolder;
公共类EmbeddedAsyncServer
{
公共静态类EmbeddedAsyncServlet扩展了HttpServlet
{
@凌驾
受保护的void doGet(HttpServletRequest-req,HttpServletResponse-resp)抛出ServletException,IOException
{
final AsyncContext ctxt=req.startAsync();
ctxt.start(新的Runnable()
{
@凌驾
公开募捐
{
System.err.println(“在异步上下文中/Start/Runnable/run”);
ctxt.complete();
}
});
}
}
公共静态void main(字符串[]args)引发异常
{
服务器=新服务器(9090);
ServletContextHandler上下文=新的ServletContextHandler();
context.setContextPath(“/”);
ServletHolder asyncHolder=context.addServlet(EmbeddedAsyncServlet.class,“/async”);
asyncHolder.setAsyncSupported(true);
setHandler(上下文);
server.start();
join();
}
}
访问
http://localhost:9090/async
您将看到以下输出

2014-12-29 13:18:57.075:INFO::main: Logging initialized @69ms
2014-12-29 13:18:57.131:INFO:oejs.Server:main: jetty-9.2.6.v20141205
2014-12-29 13:18:57.156:INFO:oejsh.ContextHandler:main: Started o.e.j.s.ServletContextHandler@65123c41{/,null,AVAILABLE}
2014-12-29 13:18:57.169:INFO:oejs.ServerConnector:main: Started ServerConnector@722b302{HTTP/1.1}{0.0.0.0:9090}
2014-12-29 13:18:57.169:INFO:oejs.Server:main: Started @166ms
In AsyncContext / Start / Runnable / run

什么版本的码头?谢谢!现在一切都好了。