@@ -38,54 +38,58 @@ public AsyncExecutionStrategy(DataFetcherExceptionHandler exceptionHandler) {
3838 @ Override
3939 @ SuppressWarnings ("FutureReturnValueIgnored" )
4040 public CompletableFuture <ExecutionResult > execute (ExecutionContext executionContext , ExecutionStrategyParameters parameters ) throws NonNullableFieldWasNullException {
41- DataLoaderDispatchStrategy dataLoaderDispatcherStrategy = executionContext .getDataLoaderDispatcherStrategy ();
42- dataLoaderDispatcherStrategy .executionStrategy (executionContext , parameters );
43- Instrumentation instrumentation = executionContext .getInstrumentation ();
44- InstrumentationExecutionStrategyParameters instrumentationParameters = new InstrumentationExecutionStrategyParameters (executionContext , parameters );
41+ return executionContext .call (() -> {
42+ DataLoaderDispatchStrategy dataLoaderDispatcherStrategy = executionContext .getDataLoaderDispatcherStrategy ();
43+ dataLoaderDispatcherStrategy .executionStrategy (executionContext , parameters );
44+ Instrumentation instrumentation = executionContext .getInstrumentation ();
45+ InstrumentationExecutionStrategyParameters instrumentationParameters = new InstrumentationExecutionStrategyParameters (executionContext , parameters );
4546
46- ExecutionStrategyInstrumentationContext executionStrategyCtx = ExecutionStrategyInstrumentationContext .nonNullCtx (instrumentation .beginExecutionStrategy (instrumentationParameters , executionContext .getInstrumentationState ()));
47+ ExecutionStrategyInstrumentationContext executionStrategyCtx = ExecutionStrategyInstrumentationContext .nonNullCtx (instrumentation .beginExecutionStrategy (instrumentationParameters , executionContext .getInstrumentationState ()));
4748
48- MergedSelectionSet fields = parameters .getFields ();
49- List <String > fieldNames = fields .getKeys ();
49+ MergedSelectionSet fields = parameters .getFields ();
50+ List <String > fieldNames = fields .getKeys ();
5051
51- Optional <ExecutionResult > isNotSensible = Introspection .isIntrospectionSensible (fields , executionContext );
52- if (isNotSensible .isPresent ()) {
53- return CompletableFuture .completedFuture (isNotSensible .get ());
54- }
52+ Optional <ExecutionResult > isNotSensible = Introspection .isIntrospectionSensible (fields , executionContext );
53+ if (isNotSensible .isPresent ()) {
54+ return CompletableFuture .completedFuture (isNotSensible .get ());
55+ }
5556
56- DeferredExecutionSupport deferredExecutionSupport = createDeferredExecutionSupport (executionContext , parameters );
57- Async .CombinedBuilder <FieldValueInfo > futures = getAsyncFieldValueInfo (executionContext , parameters , deferredExecutionSupport );
57+ DeferredExecutionSupport deferredExecutionSupport = createDeferredExecutionSupport (executionContext , parameters );
58+ Async .CombinedBuilder <FieldValueInfo > futures = getAsyncFieldValueInfo (executionContext , parameters , deferredExecutionSupport );
5859
59- CompletableFuture <ExecutionResult > overallResult = new CompletableFuture <>();
60- executionStrategyCtx .onDispatched ();
60+ CompletableFuture <ExecutionResult > overallResult = new CompletableFuture <>();
61+ executionStrategyCtx .onDispatched ();
6162
62- futures .await ().whenComplete ((completeValueInfos , throwable ) -> {
63- List <String > fieldsExecutedOnInitialResult = deferredExecutionSupport .getNonDeferredFieldNames (fieldNames );
63+ futures .await ().whenComplete ((completeValueInfos , throwable ) -> {
64+ executionContext .run (() -> {
65+ List <String > fieldsExecutedOnInitialResult = deferredExecutionSupport .getNonDeferredFieldNames (fieldNames );
6466
65- BiConsumer <List <Object >, Throwable > handleResultsConsumer = handleResults (executionContext , fieldsExecutedOnInitialResult , overallResult );
66- if (throwable != null ) {
67- handleResultsConsumer .accept (null , throwable .getCause ());
68- return ;
69- }
67+ BiConsumer <List <Object >, Throwable > handleResultsConsumer = handleResults (executionContext , fieldsExecutedOnInitialResult , overallResult );
68+ if (throwable != null ) {
69+ handleResultsConsumer .accept (null , throwable .getCause ());
70+ return ;
71+ }
7072
71- Async .CombinedBuilder <Object > fieldValuesFutures = Async .ofExpectedSize (completeValueInfos .size ());
72- for (FieldValueInfo completeValueInfo : completeValueInfos ) {
73- fieldValuesFutures .addObject (completeValueInfo .getFieldValueObject ());
74- }
75- dataLoaderDispatcherStrategy .executionStrategyOnFieldValuesInfo (completeValueInfos );
76- executionStrategyCtx .onFieldValuesInfo (completeValueInfos );
77- fieldValuesFutures .await ().whenComplete (handleResultsConsumer );
78- }).exceptionally ((ex ) -> {
79- // if there are any issues with combining/handling the field results,
80- // complete the future at all costs and bubble up any thrown exception so
81- // the execution does not hang.
82- dataLoaderDispatcherStrategy .executionStrategyOnFieldValuesException (ex );
83- executionStrategyCtx .onFieldValuesException ();
84- overallResult .completeExceptionally (ex );
85- return null ;
86- });
73+ Async .CombinedBuilder <Object > fieldValuesFutures = Async .ofExpectedSize (completeValueInfos .size ());
74+ for (FieldValueInfo completeValueInfo : completeValueInfos ) {
75+ fieldValuesFutures .addObject (completeValueInfo .getFieldValueObject ());
76+ }
77+ dataLoaderDispatcherStrategy .executionStrategyOnFieldValuesInfo (completeValueInfos );
78+ executionStrategyCtx .onFieldValuesInfo (completeValueInfos );
79+ fieldValuesFutures .await ().whenComplete (handleResultsConsumer );
80+ });
81+ }).exceptionally ((ex ) -> executionContext .call (() -> {
82+ // if there are any issues with combining/handling the field results,
83+ // complete the future at all costs and bubble up any thrown exception so
84+ // the execution does not hang.
85+ dataLoaderDispatcherStrategy .executionStrategyOnFieldValuesException (ex );
86+ executionStrategyCtx .onFieldValuesException ();
87+ overallResult .completeExceptionally (ex );
88+ return null ;
89+ }));
8790
88- overallResult .whenComplete (executionStrategyCtx ::onCompleted );
89- return overallResult ;
91+ overallResult .whenComplete (executionStrategyCtx ::onCompleted );
92+ return overallResult ;
93+ });
9094 }
9195}
0 commit comments