Skip to content

Commit c75bd30

Browse files
authored
Merge pull request #349 from graphql-java-kickstart/async-executor
Separate async executor
2 parents 05e500e + 79563dc commit c75bd30

File tree

3 files changed

+36
-10
lines changed

3 files changed

+36
-10
lines changed

graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLConfiguration.java

+14-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import graphql.schema.GraphQLSchema;
1818
import java.util.ArrayList;
1919
import java.util.List;
20+
import java.util.concurrent.Executor;
21+
import java.util.concurrent.Executors;
2022
import java.util.function.Supplier;
2123
import lombok.Getter;
2224

@@ -31,6 +33,7 @@ public class GraphQLConfiguration {
3133
@Getter private final long asyncTimeout;
3234
private final ContextSetting contextSetting;
3335
private final GraphQLResponseCacheManager responseCacheManager;
36+
@Getter private final Executor asyncExecutor;
3437
private HttpRequestHandler requestHandler;
3538

3639
private GraphQLConfiguration(
@@ -43,8 +46,10 @@ private GraphQLConfiguration(
4346
long asyncTimeout,
4447
ContextSetting contextSetting,
4548
Supplier<BatchInputPreProcessor> batchInputPreProcessor,
46-
GraphQLResponseCacheManager responseCacheManager) {
49+
GraphQLResponseCacheManager responseCacheManager,
50+
Executor asyncExecutor) {
4751
this.invocationInputFactory = invocationInputFactory;
52+
this.asyncExecutor = asyncExecutor;
4853
this.graphQLInvoker = graphQLInvoker != null ? graphQLInvoker : queryInvoker.toGraphQLInvoker();
4954
this.objectMapper = objectMapper;
5055
this.listeners = listeners;
@@ -137,6 +142,7 @@ public static class Builder {
137142
private Supplier<BatchInputPreProcessor> batchInputPreProcessorSupplier =
138143
NoOpBatchInputPreProcessor::new;
139144
private GraphQLResponseCacheManager responseCacheManager;
145+
private Executor asyncExecutor = Executors.newCachedThreadPool();
140146

141147
private Builder(GraphQLInvocationInputFactory.Builder invocationInputFactoryBuilder) {
142148
this.invocationInputFactoryBuilder = invocationInputFactoryBuilder;
@@ -192,6 +198,11 @@ public Builder asyncTimeout(long asyncTimeout) {
192198
return this;
193199
}
194200

201+
public Builder with(Executor asyncExecutor) {
202+
this.asyncExecutor = asyncExecutor;
203+
return this;
204+
}
205+
195206
public Builder with(ContextSetting contextSetting) {
196207
if (contextSetting != null) {
197208
this.contextSetting = contextSetting;
@@ -231,7 +242,8 @@ public GraphQLConfiguration build() {
231242
asyncTimeout,
232243
contextSetting,
233244
batchInputPreProcessorSupplier,
234-
responseCacheManager);
245+
responseCacheManager,
246+
asyncExecutor);
235247
}
236248
}
237249
}

graphql-java-servlet/src/main/java/graphql/kickstart/servlet/HttpRequestInvokerImpl.java

+9-7
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,15 @@ private void invokeAndHandleAsync(
7272
}
7373
};
7474
asyncContext.addListener(timeoutListener);
75-
asyncContext.start(
76-
() -> {
77-
FutureExecutionResult futureResult = invoke(invocationInput, request, response);
78-
futureHolder.set(futureResult);
79-
handle(futureResult, request, response, listenerHandler)
80-
.thenAccept(it -> asyncContext.complete());
81-
});
75+
configuration
76+
.getAsyncExecutor()
77+
.execute(
78+
() -> {
79+
FutureExecutionResult futureResult = invoke(invocationInput, request, response);
80+
futureHolder.set(futureResult);
81+
handle(futureResult, request, response, listenerHandler)
82+
.thenAccept(it -> asyncContext.complete());
83+
});
8284
}
8385

8486
private CompletableFuture<Void> handle(

graphql-java-servlet/src/test/groovy/graphql/kickstart/servlet/TestUtils.groovy

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package graphql.kickstart.servlet
22

33
import com.google.common.io.ByteStreams
4-
import graphql.Directives
54
import graphql.Scalars
65
import graphql.execution.reactive.SingleSubscriberPublisher
76
import graphql.kickstart.execution.context.ContextSetting
@@ -15,7 +14,9 @@ import graphql.schema.idl.SchemaGenerator
1514
import graphql.schema.idl.SchemaParser
1615
import graphql.schema.idl.TypeRuntimeWiring
1716
import graphql.schema.idl.errors.SchemaProblem
17+
import org.jetbrains.annotations.NotNull
1818

19+
import java.util.concurrent.Executor
1920
import java.util.concurrent.atomic.AtomicReference
2021

2122
class TestUtils {
@@ -59,6 +60,7 @@ class TestUtils {
5960
.with(schema)
6061
.with(contextSetting)
6162
.with(contextBuilder)
63+
.with(executor())
6264
.build())
6365
servlet.init(null)
6466
return servlet
@@ -96,9 +98,19 @@ class TestUtils {
9698
if (listeners != null) {
9799
configBuilder.with(Arrays.asList(listeners))
98100
}
101+
configBuilder.with(executor());
99102
configBuilder.build()
100103
}
101104

105+
private static Executor executor() {
106+
new Executor() {
107+
@Override
108+
void execute(@NotNull Runnable command) {
109+
command.run()
110+
}
111+
}
112+
}
113+
102114
static def createBatchExecutionHandler() {
103115
new TestBatchInputPreProcessor()
104116
}

0 commit comments

Comments
 (0)