From 0ee7dda91f12e4abf03abe9d9ad2e72fcbc0720d Mon Sep 17 00:00:00 2001 From: Michiel Oliemans Date: Sat, 16 May 2020 16:09:54 +0200 Subject: [PATCH 1/2] Allow async timeout to be configured #184 --- .../kickstart/execution/GraphQLInvoker.java | 2 +- .../servlet/AbstractGraphQLHttpServlet.java | 1 + .../kickstart/servlet/GraphQLConfiguration.java | 15 +++++++++++++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/GraphQLInvoker.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/GraphQLInvoker.java index 27e2f08e..aed23ab7 100644 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/GraphQLInvoker.java +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/GraphQLInvoker.java @@ -19,7 +19,7 @@ public class GraphQLInvoker { private final GraphQLBuilder graphQLBuilder; private final BatchedDataLoaderGraphQLBuilder batchedDataLoaderGraphQLBuilder; - private GraphQLInvokerProxy proxy = GraphQL::executeAsync; + private final GraphQLInvokerProxy proxy = GraphQL::executeAsync; public CompletableFuture executeAsync(GraphQLSingleInvocationInput invocationInput) { GraphQL graphQL = graphQLBuilder.build(invocationInput.getSchema()); diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/AbstractGraphQLHttpServlet.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/AbstractGraphQLHttpServlet.java index 4a054703..1a955f9e 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/AbstractGraphQLHttpServlet.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/AbstractGraphQLHttpServlet.java @@ -130,6 +130,7 @@ public String executeQuery(String query) { private void doRequestAsync(HttpServletRequest request, HttpServletResponse response, HttpRequestHandler handler) { if (configuration.isAsyncServletModeEnabled()) { AsyncContext asyncContext = request.startAsync(request, response); + asyncContext.setTimeout(configuration.getAsyncTimeout()); HttpServletRequest asyncRequest = (HttpServletRequest) asyncContext.getRequest(); HttpServletResponse asyncResponse = (HttpServletResponse) asyncContext.getResponse(); configuration.getAsyncExecutor().execute(() -> doRequest(asyncRequest, asyncResponse, handler, asyncContext)); diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLConfiguration.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLConfiguration.java index 8790160b..93a33b23 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLConfiguration.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLConfiguration.java @@ -20,6 +20,7 @@ import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.function.Supplier; +import lombok.Getter; public class GraphQLConfiguration { @@ -32,12 +33,14 @@ public class GraphQLConfiguration { private final boolean asyncServletModeEnabled; private final Executor asyncExecutor; private final long subscriptionTimeout; + @Getter + private final long asyncTimeout; private final ContextSetting contextSetting; private GraphQLConfiguration(GraphQLInvocationInputFactory invocationInputFactory, GraphQLQueryInvoker queryInvoker, GraphQLObjectMapper objectMapper, List listeners, boolean asyncServletModeEnabled, - Executor asyncExecutor, long subscriptionTimeout, ContextSetting contextSetting, + Executor asyncExecutor, long subscriptionTimeout, long asyncTimeout, ContextSetting contextSetting, Supplier batchInputPreProcessor) { this.invocationInputFactory = invocationInputFactory; this.queryInvoker = queryInvoker; @@ -47,6 +50,7 @@ private GraphQLConfiguration(GraphQLInvocationInputFactory invocationInputFactor this.asyncServletModeEnabled = asyncServletModeEnabled; this.asyncExecutor = asyncExecutor; this.subscriptionTimeout = subscriptionTimeout; + this.asyncTimeout = asyncTimeout; this.contextSetting = contextSetting; this.batchInputPreProcessor = batchInputPreProcessor; } @@ -119,8 +123,9 @@ public static class Builder { private boolean asyncServletModeEnabled = false; private Executor asyncExecutor = Executors.newCachedThreadPool(new GraphQLThreadFactory()); private long subscriptionTimeout = 0; + private long asyncTimeout = 30; private ContextSetting contextSetting = ContextSetting.PER_QUERY_WITH_INSTRUMENTATION; - private Supplier batchInputPreProcessorSupplier = () -> new NoOpBatchInputPreProcessor(); + private Supplier batchInputPreProcessorSupplier = NoOpBatchInputPreProcessor::new; private Builder(GraphQLInvocationInputFactory.Builder invocationInputFactoryBuilder) { this.invocationInputFactoryBuilder = invocationInputFactoryBuilder; @@ -178,6 +183,11 @@ public Builder with(long subscriptionTimeout) { return this; } + public Builder asyncTimeout(long asyncTimeout) { + this.asyncTimeout = asyncTimeout; + return this; + } + public Builder with(ContextSetting contextSetting) { if (contextSetting != null) { this.contextSetting = contextSetting; @@ -208,6 +218,7 @@ public GraphQLConfiguration build() { asyncServletModeEnabled, asyncExecutor, subscriptionTimeout, + asyncTimeout, contextSetting, batchInputPreProcessorSupplier ); From 0c53c641d5ccac0549b8093b3fce9c8683320410 Mon Sep 17 00:00:00 2001 From: Michiel Oliemans Date: Sat, 16 May 2020 16:13:58 +0200 Subject: [PATCH 2/2] Fix constructor issue --- .../main/java/graphql/kickstart/execution/GraphQLInvoker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/GraphQLInvoker.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/GraphQLInvoker.java index aed23ab7..27e2f08e 100644 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/GraphQLInvoker.java +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/GraphQLInvoker.java @@ -19,7 +19,7 @@ public class GraphQLInvoker { private final GraphQLBuilder graphQLBuilder; private final BatchedDataLoaderGraphQLBuilder batchedDataLoaderGraphQLBuilder; - private final GraphQLInvokerProxy proxy = GraphQL::executeAsync; + private GraphQLInvokerProxy proxy = GraphQL::executeAsync; public CompletableFuture executeAsync(GraphQLSingleInvocationInput invocationInput) { GraphQL graphQL = graphQLBuilder.build(invocationInput.getSchema());