Skip to content

Commit f418e68

Browse files
authored
Merge pull request #74 from shariqislam786/master
Added AsyncServlet 3.0 Support
2 parents 838c6b4 + 7a3d284 commit f418e68

File tree

2 files changed

+46
-17
lines changed

2 files changed

+46
-17
lines changed

src/main/java/graphql/servlet/GraphQLServlet.java

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.slf4j.LoggerFactory;
2121

2222
import javax.security.auth.Subject;
23+
import javax.servlet.AsyncContext;
2324
import javax.servlet.Servlet;
2425
import javax.servlet.ServletException;
2526
import javax.servlet.http.HttpServlet;
@@ -67,14 +68,17 @@ public abstract class GraphQLServlet extends HttpServlet implements Servlet, Gra
6768

6869
private final HttpRequestHandler getHandler;
6970
private final HttpRequestHandler postHandler;
71+
72+
private final boolean asyncServletMode;
7073

7174
public GraphQLServlet() {
72-
this(null, null);
75+
this(null, null, false);
7376
}
7477

75-
public GraphQLServlet(ObjectMapperConfigurer objectMapperConfigurer, List<GraphQLServletListener> listeners) {
78+
public GraphQLServlet(ObjectMapperConfigurer objectMapperConfigurer, List<GraphQLServletListener> listeners, boolean asyncServletMode) {
7679
this.lazyObjectMapperBuilder = new LazyObjectMapperBuilder(objectMapperConfigurer != null ? objectMapperConfigurer : new DefaultObjectMapperConfigurer());
7780
this.listeners = listeners != null ? new ArrayList<>(listeners) : new ArrayList<>();
81+
this.asyncServletMode = asyncServletMode;
7882

7983
this.getHandler = (request, response) -> {
8084
final GraphQLContext context = createContext(Optional.of(request), Optional.of(response));
@@ -249,7 +253,7 @@ public String executeQuery(String query) {
249253
}
250254
}
251255

252-
private void doRequest(HttpServletRequest request, HttpServletResponse response, HttpRequestHandler handler) {
256+
private void doRequest(HttpServletRequest request, HttpServletResponse response, HttpRequestHandler handler,AsyncContext asyncContext) {
253257

254258
List<GraphQLServletListener.RequestCallback> requestCallbacks = runListeners(l -> l.onRequest(request, response));
255259

@@ -262,17 +266,33 @@ private void doRequest(HttpServletRequest request, HttpServletResponse response,
262266
runCallbacks(requestCallbacks, c -> c.onError(request, response, t));
263267
} finally {
264268
runCallbacks(requestCallbacks, c -> c.onFinally(request, response));
269+
if(asyncContext !=null)
270+
asyncContext.complete();
265271
}
266272
}
267273

268-
@Override
269-
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
270-
doRequest(req, resp, getHandler);
271-
}
274+
@Override
275+
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
276+
if (asyncServletMode) {
277+
AsyncContext asyncContext = req.startAsync();
278+
HttpServletRequest request = (HttpServletRequest) asyncContext.getRequest();
279+
HttpServletResponse response = (HttpServletResponse) asyncContext.getResponse();
280+
new Thread(() -> doRequest(request, response, getHandler, asyncContext)).start();
281+
} else {
282+
doRequest(req, resp, getHandler, null);
283+
}
284+
}
272285

273286
@Override
274287
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
275-
doRequest(req, resp, postHandler);
288+
if (asyncServletMode) {
289+
AsyncContext asyncContext = req.startAsync();
290+
HttpServletRequest request = (HttpServletRequest) asyncContext.getRequest();
291+
HttpServletResponse response = (HttpServletResponse) asyncContext.getResponse();
292+
new Thread(() -> doRequest(request, response, postHandler, asyncContext)).start();
293+
} else {
294+
doRequest(req, resp, postHandler, null);
295+
}
276296
}
277297

278298
private Optional<Part> getFileItem(Map<String, List<Part>> fileItems, String name) {

src/main/java/graphql/servlet/SimpleGraphQLServlet.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
package graphql.servlet;
22

3+
import java.util.List;
4+
import java.util.Optional;
5+
6+
import javax.servlet.http.HttpServletRequest;
7+
import javax.servlet.http.HttpServletResponse;
8+
39
import graphql.execution.ExecutionStrategy;
410
import graphql.execution.instrumentation.Instrumentation;
511
import graphql.execution.instrumentation.SimpleInstrumentation;
612
import graphql.execution.preparsed.NoOpPreparsedDocumentProvider;
713
import graphql.execution.preparsed.PreparsedDocumentProvider;
814
import graphql.schema.GraphQLSchema;
915

10-
import javax.servlet.http.HttpServletRequest;
11-
import javax.servlet.http.HttpServletResponse;
12-
import java.util.List;
13-
import java.util.Optional;
14-
1516
/**
1617
* @author Andrew Potter
1718
*/
1819
public class SimpleGraphQLServlet extends GraphQLServlet {
20+
1921

2022
/**
2123
* @deprecated use {@link #builder(GraphQLSchema)} instead.
@@ -46,15 +48,16 @@ public SimpleGraphQLServlet(GraphQLSchema schema, ExecutionStrategyProvider exec
4648
*/
4749
@Deprecated
4850
public SimpleGraphQLServlet(final GraphQLSchema schema, ExecutionStrategyProvider executionStrategyProvider, ObjectMapperConfigurer objectMapperConfigurer, List<GraphQLServletListener> listeners, Instrumentation instrumentation, GraphQLErrorHandler errorHandler, GraphQLContextBuilder contextBuilder, GraphQLRootObjectBuilder rootObjectBuilder, PreparsedDocumentProvider preparsedDocumentProvider) {
49-
this(new DefaultGraphQLSchemaProvider(schema), executionStrategyProvider, objectMapperConfigurer, listeners, instrumentation, errorHandler, contextBuilder, rootObjectBuilder, preparsedDocumentProvider);
51+
this(new DefaultGraphQLSchemaProvider(schema), executionStrategyProvider, objectMapperConfigurer, listeners, instrumentation, errorHandler, contextBuilder, rootObjectBuilder, preparsedDocumentProvider,false);
5052
}
5153

54+
5255
/**
5356
* @deprecated use {@link #builder(GraphQLSchemaProvider)} instead.
5457
*/
5558
@Deprecated
56-
public SimpleGraphQLServlet(GraphQLSchemaProvider schemaProvider, ExecutionStrategyProvider executionStrategyProvider, ObjectMapperConfigurer objectMapperConfigurer, List<GraphQLServletListener> listeners, Instrumentation instrumentation, GraphQLErrorHandler errorHandler, GraphQLContextBuilder contextBuilder, GraphQLRootObjectBuilder rootObjectBuilder, PreparsedDocumentProvider preparsedDocumentProvider) {
57-
super(objectMapperConfigurer, listeners);
59+
public SimpleGraphQLServlet(GraphQLSchemaProvider schemaProvider, ExecutionStrategyProvider executionStrategyProvider, ObjectMapperConfigurer objectMapperConfigurer, List<GraphQLServletListener> listeners, Instrumentation instrumentation, GraphQLErrorHandler errorHandler, GraphQLContextBuilder contextBuilder, GraphQLRootObjectBuilder rootObjectBuilder, PreparsedDocumentProvider preparsedDocumentProvider, boolean asyncServletMode) {
60+
super(objectMapperConfigurer, listeners, asyncServletMode);
5861

5962
this.schemaProvider = schemaProvider;
6063
this.executionStrategyProvider = executionStrategyProvider;
@@ -91,7 +94,7 @@ public SimpleGraphQLServlet(GraphQLSchemaProvider schemaProvider, ExecutionStrat
9194
}
9295

9396
protected SimpleGraphQLServlet(Builder builder) {
94-
super(builder.objectMapperConfigurer, builder.listeners);
97+
super(builder.objectMapperConfigurer, builder.listeners, builder.asyncServletMode);
9598

9699
this.schemaProvider = builder.schemaProvider;
97100
this.executionStrategyProvider = builder.executionStrategyProvider;
@@ -136,6 +139,7 @@ public static class Builder {
136139
private GraphQLContextBuilder contextBuilder = new DefaultGraphQLContextBuilder();
137140
private GraphQLRootObjectBuilder rootObjectBuilder = new DefaultGraphQLRootObjectBuilder();
138141
private PreparsedDocumentProvider preparsedDocumentProvider = NoOpPreparsedDocumentProvider.INSTANCE;
142+
private boolean asyncServletMode;
139143

140144
public Builder(GraphQLSchema schema) {
141145
this(new DefaultGraphQLSchemaProvider(schema));
@@ -184,6 +188,11 @@ public Builder withListeners(List<GraphQLServletListener> listeners) {
184188
this.listeners = listeners;
185189
return this;
186190
}
191+
192+
public Builder withAsyncServletMode(boolean value) {
193+
this.asyncServletMode=value;
194+
return this;
195+
}
187196

188197
public SimpleGraphQLServlet build() {
189198
return new SimpleGraphQLServlet(this);

0 commit comments

Comments
 (0)