Skip to content

Commit 21b16d2

Browse files
Added AsyncServlet 3.0 Support
1 parent 1dbf88c commit 21b16d2

File tree

3 files changed

+47
-19
lines changed

3 files changed

+47
-19
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
version = 5.0.1
1+
version = 5.0.2
22
group = com.graphql-java

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

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.slf4j.LoggerFactory;
2626

2727
import javax.security.auth.Subject;
28+
import javax.servlet.AsyncContext;
2829
import javax.servlet.Servlet;
2930
import javax.servlet.ServletException;
3031
import 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) {

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, null);
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, null,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, null);
97+
super(builder.objectMapperConfigurer, builder.listeners, null,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)