From 1558831288aa35d39b9030952f6cd695b5fe066e Mon Sep 17 00:00:00 2001 From: ksrinivasan Date: Fri, 3 Nov 2023 21:15:41 -0700 Subject: [PATCH] Update set up for ScheduledExecutorService. --- .../graphql/dgs/autoconfig/DgsAutoConfiguration.kt | 12 ++++++++++-- .../dgs/autoconfig/DgsConfigurationProperties.kt | 4 +++- .../graphql/dgs/internal/DgsDataLoaderProvider.kt | 9 +++++++-- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsAutoConfiguration.kt b/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsAutoConfiguration.kt index 68552c85f3..f63b53ae26 100644 --- a/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsAutoConfiguration.kt +++ b/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsAutoConfiguration.kt @@ -69,6 +69,8 @@ import org.springframework.mock.web.MockHttpServletRequest import org.springframework.web.context.request.NativeWebRequest import org.springframework.web.context.request.WebRequest import java.util.* +import java.util.concurrent.Executors +import java.util.concurrent.ScheduledExecutorService /** * Framework auto configuration based on open source Spring only, without Netflix integrations. @@ -154,8 +156,14 @@ open class DgsAutoConfiguration( } @Bean - open fun dgsDataLoaderProvider(applicationContext: ApplicationContext, dataloaderOptionProvider: DgsDataLoaderOptionsProvider): DgsDataLoaderProvider { - return DgsDataLoaderProvider(applicationContext, dataloaderOptionProvider) + @ConditionalOnMissingBean + open fun scheduledExecutorService(): ScheduledExecutorService { + return Executors.newSingleThreadScheduledExecutor() + } + + @Bean + open fun dgsDataLoaderProvider(applicationContext: ApplicationContext, dataloaderOptionProvider: DgsDataLoaderOptionsProvider, scheduledExecutorService: ScheduledExecutorService): DgsDataLoaderProvider { + return DgsDataLoaderProvider(applicationContext, dataloaderOptionProvider, scheduledExecutorService) } /** diff --git a/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsConfigurationProperties.kt b/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsConfigurationProperties.kt index 5b284a1b90..5a960e1449 100644 --- a/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsConfigurationProperties.kt +++ b/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/autoconfig/DgsConfigurationProperties.kt @@ -28,7 +28,9 @@ import org.springframework.boot.context.properties.bind.DefaultValue data class DgsConfigurationProperties( /** Location of the GraphQL schema files. */ @DefaultValue(DEFAULT_SCHEMA_LOCATION) val schemaLocations: List, - @DefaultValue("true") val schemaWiringValidationEnabled: Boolean + @DefaultValue("true") val schemaWiringValidationEnabled: Boolean, + /** Data loader properties.*/ + @DefaultValue("false") val dataloaderTickerMode: Boolean ) { companion object { const val PREFIX: String = "dgs.graphql" diff --git a/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DgsDataLoaderProvider.kt b/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DgsDataLoaderProvider.kt index 1e89ed044a..402fc171c2 100644 --- a/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DgsDataLoaderProvider.kt +++ b/graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/internal/DgsDataLoaderProvider.kt @@ -38,6 +38,8 @@ import org.springframework.aop.support.AopUtils import org.springframework.beans.factory.NoSuchBeanDefinitionException import org.springframework.context.ApplicationContext import org.springframework.util.ReflectionUtils +import java.util.concurrent.Executors +import java.util.concurrent.ScheduledExecutorService import java.util.function.Supplier import kotlin.system.measureTimeMillis @@ -46,7 +48,8 @@ import kotlin.system.measureTimeMillis */ class DgsDataLoaderProvider( private val applicationContext: ApplicationContext, - private val dataLoaderOptionsProvider: DgsDataLoaderOptionsProvider = DefaultDataLoaderOptionsProvider() + private val dataLoaderOptionsProvider: DgsDataLoaderOptionsProvider = DefaultDataLoaderOptionsProvider(), + private val scheduledExecutorService: ScheduledExecutorService = Executors.newSingleThreadScheduledExecutor() ) { private data class LoaderHolder(val theLoader: T, val annotation: DgsDataLoader, val name: String, val dispatchPredicate: DispatchPredicate? = null) @@ -63,7 +66,9 @@ class DgsDataLoaderProvider( } fun buildRegistryWithContextSupplier(contextSupplier: Supplier): DataLoaderRegistry { - val registry = ScheduledDataLoaderRegistry.newScheduledRegistry().dispatchPredicate(DispatchPredicate.DISPATCH_NEVER).build() + val tickerMode = applicationContext.environment.getProperty("dgs.graphql.dataloaderTickerMode").toBoolean() + val registry = ScheduledDataLoaderRegistry.newScheduledRegistry().scheduledExecutorService(scheduledExecutorService).tickerMode(tickerMode).dispatchPredicate(DispatchPredicate.DISPATCH_NEVER).build() + val totalTime = measureTimeMillis { val extensionProviders = applicationContext .getBeanProvider(DataLoaderInstrumentationExtensionProvider::class.java)