Make coroutine scope configurable via context #350
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
When using suspending resolvers, graphql-java-tools launches coroutines in the global scope, which makes it impossible to structure concurrency properly. More details on why using
GlobalScope
is not recommended: https://medium.com/@elizarov/the-reason-to-avoid-globalscope-835337445abc.This PR makes the coroutine scope configurable. This is done by having the GraphQL context implement
CoroutineScope
. It is of course completely optional,GlobalScope
will still be used by default.Note: this is different from
coroutineContextProvider
inSchemaParserOptions
, which does not override the scope, and does not allow having a different scope for each request. A concrete use-case for per-request scopes is to ensure all coroutines spawned by any given request are cancelled after at most 1 minute.