Uploaded image for project: 'Weld'
  1. Weld
  2. WELD-1020

NPE during cleanup after Servlet API3 AsyncContect

    Details

    • Steps to Reproduce:
      Hide

      The following example servlet demonstrates the problem. When accessing this servlet, there will be a NPE on the console/cataling log:
      java.lang.NullPointerException
      at org.jboss.weld.context.AbstractBoundContext.deactivate(AbstractBoundContext.java:71)
      at org.jboss.weld.context.http.HttpRequestContextImpl.deactivate(HttpRequestContextImpl.java:86)
      at org.jboss.weld.servlet.WeldListener.requestDestroyed(WeldListener.java:103)
      at org.jboss.weld.servlet.api.helpers.ForwardingServletListener.requestDestroyed(ForwardingServletListener.java:42)
      at org.apache.catalina.core.StandardContext.fireRequestDestroyEvent(StandardContext.java:5973)
      at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:283)
      at org.apache.coyote.http11.AbstractHttp11Processor.asyncDispatch(AbstractHttp11Processor.java:1515)
      at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:523)
      at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1575)
      at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
      at java.lang.Thread.run(Thread.java:662)

      An example servlet:

      package com.kobil.ssms.asm.presentation.b2b;

      import java.io.IOException;

      import javax.servlet.AsyncContext;
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;

      @WebServlet(asyncSupported = true, urlPatterns = "/weldasync")
      public class WeldAsyncServlet extends HttpServlet {

      @Override
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

      { doPost(request, response); }

      @Override
      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
      IOException {
      final AsyncContext async = request.startAsync(request, response);
      Runnable asyncRunnable = new Runnable() {

      @Override
      public void run()

      { async.complete(); }

      };
      async.start(asyncRunnable);
      }

      }

      Show
      The following example servlet demonstrates the problem. When accessing this servlet, there will be a NPE on the console/cataling log: java.lang.NullPointerException at org.jboss.weld.context.AbstractBoundContext.deactivate(AbstractBoundContext.java:71) at org.jboss.weld.context.http.HttpRequestContextImpl.deactivate(HttpRequestContextImpl.java:86) at org.jboss.weld.servlet.WeldListener.requestDestroyed(WeldListener.java:103) at org.jboss.weld.servlet.api.helpers.ForwardingServletListener.requestDestroyed(ForwardingServletListener.java:42) at org.apache.catalina.core.StandardContext.fireRequestDestroyEvent(StandardContext.java:5973) at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:283) at org.apache.coyote.http11.AbstractHttp11Processor.asyncDispatch(AbstractHttp11Processor.java:1515) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:523) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1575) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) An example servlet: package com.kobil.ssms.asm.presentation.b2b; import java.io.IOException; import javax.servlet.AsyncContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(asyncSupported = true, urlPatterns = "/weldasync") public class WeldAsyncServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { final AsyncContext async = request.startAsync(request, response); Runnable asyncRunnable = new Runnable() { @Override public void run() { async.complete(); } }; async.start(asyncRunnable); } }

      Description

      When using Weld with Servlet API3.0 AsyncContext, there will be a NullPointerException, when Weld tries to cleanup the request.
      There seems to be a problem when asyncContext.complete() is called in a thread that was not the original thread that received the request

      example for the exception:

      java.lang.NullPointerException
      at org.jboss.weld.context.AbstractBoundContext.deactivate(AbstractBoundContext.java:71)
      at org.jboss.weld.context.http.HttpRequestContextImpl.deactivate(HttpRequestContextImpl.java:86)
      at org.jboss.weld.servlet.WeldListener.requestDestroyed(WeldListener.java:103)
      at org.jboss.weld.servlet.api.helpers.ForwardingServletListener.requestDestroyed(ForwardingServletListener.java:42)
      at org.apache.catalina.core.StandardContext.fireRequestDestroyEvent(StandardContext.java:5973)
      at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:283)
      at org.apache.coyote.http11.AbstractHttp11Processor.asyncDispatch(AbstractHttp11Processor.java:1515)
      at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:523)
      at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1575)
      at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
      at java.lang.Thread.run(Thread.java:662)

        Gliffy Diagrams

          Attachments

            Issue Links

              Activity

                People

                • Assignee:
                  mkouba Martin Kouba
                  Reporter:
                  mhartl Manuel Hartl
                • Votes:
                  2 Vote for this issue
                  Watchers:
                  10 Start watching this issue

                  Dates

                  • Created:
                    Updated:
                    Resolved: