2525import org .slf4j .LoggerFactory ;
2626
2727import javax .security .auth .Subject ;
28+ import javax .servlet .AsyncContext ;
2829import javax .servlet .Servlet ;
2930import javax .servlet .ServletException ;
3031import javax .servlet .http .HttpServlet ;
@@ -77,16 +78,18 @@ public abstract class GraphQLServlet extends HttpServlet implements Servlet, Gra
7778
7879 private final HttpRequestHandler getHandler ;
7980 private final HttpRequestHandler postHandler ;
81+
82+ private final boolean asyncServletMode ;
8083
8184 public GraphQLServlet () {
82- this (null , null , null );
85+ this (null , null , null , false );
8386 }
8487
85- public GraphQLServlet (ObjectMapperConfigurer objectMapperConfigurer , List <GraphQLServletListener > listeners , FileItemFactory fileItemFactory ) {
88+ public GraphQLServlet (ObjectMapperConfigurer objectMapperConfigurer , List <GraphQLServletListener > listeners , FileItemFactory fileItemFactory , boolean asyncServletMode ) {
8689 this .lazyObjectMapperBuilder = new LazyObjectMapperBuilder (objectMapperConfigurer != null ? objectMapperConfigurer : new DefaultObjectMapperConfigurer ());
8790 this .listeners = listeners != null ? new ArrayList <>(listeners ) : new ArrayList <>();
8891 this .fileUpload = new ServletFileUpload (fileItemFactory != null ? fileItemFactory : new DiskFileItemFactory ());
89-
92+ this . asyncServletMode = asyncServletMode ;
9093 this .getHandler = (request , response ) -> {
9194 final GraphQLContext context = createContext (Optional .of (request ), Optional .of (response ));
9295 final Object rootObject = createRootObject (Optional .of (request ), Optional .of (response ));
@@ -247,7 +250,7 @@ public String executeQuery(String query) {
247250 }
248251 }
249252
250- private void doRequest (HttpServletRequest request , HttpServletResponse response , HttpRequestHandler handler ) {
253+ private void doRequest (HttpServletRequest request , HttpServletResponse response , HttpRequestHandler handler , AsyncContext asyncContext ) {
251254
252255 List <GraphQLServletListener .RequestCallback > requestCallbacks = runListeners (l -> l .onRequest (request , response ));
253256
@@ -260,17 +263,33 @@ private void doRequest(HttpServletRequest request, HttpServletResponse response,
260263 runCallbacks (requestCallbacks , c -> c .onError (request , response , t ));
261264 } finally {
262265 runCallbacks (requestCallbacks , c -> c .onFinally (request , response ));
266+ if (asyncContext !=null )
267+ asyncContext .complete ();
263268 }
264269 }
265270
266- @ Override
267- protected void doGet (HttpServletRequest req , HttpServletResponse resp ) throws ServletException , IOException {
268- doRequest (req , resp , getHandler );
269- }
271+ @ Override
272+ protected void doGet (HttpServletRequest req , HttpServletResponse resp ) throws ServletException , IOException {
273+ if (asyncServletMode ) {
274+ AsyncContext asyncContext = req .startAsync ();
275+ HttpServletRequest request = (HttpServletRequest ) asyncContext .getRequest ();
276+ HttpServletResponse response = (HttpServletResponse ) asyncContext .getResponse ();
277+ new Thread (() -> doRequest (request , response , getHandler , asyncContext )).start ();
278+ } else {
279+ doRequest (req , resp , getHandler , null );
280+ }
281+ }
270282
271283 @ Override
272284 protected void doPost (HttpServletRequest req , HttpServletResponse resp ) throws ServletException , IOException {
273- doRequest (req , resp , postHandler );
285+ if (asyncServletMode ) {
286+ AsyncContext asyncContext = req .startAsync ();
287+ HttpServletRequest request = (HttpServletRequest ) asyncContext .getRequest ();
288+ HttpServletResponse response = (HttpServletResponse ) asyncContext .getResponse ();
289+ new Thread (() -> doRequest (request , response , getHandler , asyncContext )).start ();
290+ } else {
291+ doRequest (req , resp , postHandler , null );
292+ }
274293 }
275294
276295 private Optional <FileItem > getFileItem (Map <String , List <FileItem >> fileItems , String name ) {
0 commit comments