Class ScheduledDataLoaderRegistry
- All Implemented Interfaces:
AutoCloseable
DataLoaderRegistry will use DispatchPredicates when dispatchAll() is called
to test (for each DataLoader in the registry) if a dispatch should proceed. If the predicate returns false, then a task is scheduled
to perform that predicate dispatch again via the ScheduledExecutorService.
It;s possible to have a DispatchPredicate per dataloader as well as a default DispatchPredicate for the
whole ScheduledDataLoaderRegistry.
This will continue to loop (test false and reschedule) until such time as the predicate returns true, in which case no rescheduling will occur, and you will need to call dispatch again to restart the process.
In the default mode, when tickerMode is false, the registry will continue to loop (test false and reschedule) until such time as the predicate returns true, in which case
no rescheduling will occur, and you will need to call dispatch again to restart the process.
However, when tickerMode is true, the registry will always reschedule continuously after the first ever call to dispatchAll().
This will allow you to chain together DataLoader load calls like this :
CompletableFuture<String> future = dataLoaderA.load("A")
.thenCompose(value -> dataLoaderB.load(value));
However, it may mean your batching will not be as efficient as it might be. In environments
like graphql this might mean you are too eager in fetching. The DispatchPredicate still runs to decide if
dispatch should happen however in ticker mode it will be continuously rescheduled.
When tickerMode is true, you really SHOULD close the registry say at the end of a request otherwise you will leave a job
on the ScheduledExecutorService that is continuously dispatching.
If you wanted to create a ScheduledDataLoaderRegistry that started a rescheduling immediately, just create one and
call rescheduleNow().
By default, it uses a Executors.newSingleThreadScheduledExecutor()} to schedule the tasks. However, if you
are creating a ScheduledDataLoaderRegistry per request you will want to look at sharing this ScheduledExecutorService
to avoid creating a new thread per registry created.
This code is currently marked as ExperimentalApi
-
Nested Class Summary
Nested Classes -
Field Summary
Fields inherited from class org.dataloader.DataLoaderRegistry
dataLoaders, instrumentation -
Method Summary
Modifier and TypeMethodDescriptionvoidclose()Once closed this registry will never again reschedule checkscombine(DataLoaderRegistry registry) This will combine all the current data loaders in this registry and all the data loaders from the specified registry and return a new combined registryvoidThis will be calledDataLoader.dispatch()on each of the registeredDataLoadersvoidThis will immediately dispatch theDataLoaders in the registry without testing the predicatesintSimilar toDataLoaderRegistry.dispatchAll(), this callsDataLoader.dispatch()on each of the registeredDataLoaders, but returns the number of dispatches.intThis will immediately dispatch theDataLoaders in the registry without testing the predicatesMap<DataLoader<?,?>, DispatchPredicate> There is a default predicate that applies to the wholeScheduledDataLoaderRegistrybooleanBy default, this will create use aExecutors.newSingleThreadScheduledExecutor()and a schedule duration of 10 milliseconds.register(String key, DataLoader<?, ?> dataLoader, DispatchPredicate dispatchPredicate) This will register a new dataloader and dispatch predicate associated with that data loadervoidThis will schedule a task to check the predicate and dispatch if true right now.unregister(String key) This will unregister a new dataloaderMethods inherited from class org.dataloader.DataLoaderRegistry
computeIfAbsent, dispatchDepth, getDataLoader, getDataLoaders, getDataLoadersMap, getInstrumentation, getKeys, getStatistics, newRegistry, register, register, registerAndGet
-
Method Details
-
close
public void close()Once closed this registry will never again reschedule checks- Specified by:
closein interfaceAutoCloseable
-
getScheduledExecutorService
- Returns:
- executor being used by this registry
-
getScheduleDuration
- Returns:
- how long the
ScheduledExecutorServicetask will wait before checking the predicate again
-
isTickerMode
public boolean isTickerMode()- Returns:
- true of the registry is in ticker mode or false otherwise
-
combine
This will combine all the current data loaders in this registry and all the data loaders from the specified registry and return a new combined registry- Overrides:
combinein classDataLoaderRegistry- Parameters:
registry- the registry to combine into this registry- Returns:
- a new combined registry
-
unregister
This will unregister a new dataloader- Overrides:
unregisterin classDataLoaderRegistry- Parameters:
key- the key of the data loader to unregister- Returns:
- this registry
-
getDataLoaderPredicates
- Returns:
- a map of data loaders to specific dispatch predicates
-
getDispatchPredicate
There is a default predicate that applies to the wholeScheduledDataLoaderRegistry- Returns:
- the default dispatch predicate
-
register
public ScheduledDataLoaderRegistry register(String key, DataLoader<?, ?> dataLoader, DispatchPredicate dispatchPredicate) This will register a new dataloader and dispatch predicate associated with that data loader- Parameters:
key- the key to put the data loader underdataLoader- the data loader to registerdispatchPredicate- the dispatch predicate to associate with this data loader- Returns:
- this registry
-
dispatchAll
public void dispatchAll()Description copied from class:DataLoaderRegistryThis will be calledDataLoader.dispatch()on each of the registeredDataLoaders- Overrides:
dispatchAllin classDataLoaderRegistry
-
dispatchAllWithCount
public int dispatchAllWithCount()Description copied from class:DataLoaderRegistrySimilar toDataLoaderRegistry.dispatchAll(), this callsDataLoader.dispatch()on each of the registeredDataLoaders, but returns the number of dispatches.- Overrides:
dispatchAllWithCountin classDataLoaderRegistry- Returns:
- total number of entries that were dispatched from registered
DataLoaders.
-
dispatchAllImmediately
public void dispatchAllImmediately()This will immediately dispatch theDataLoaders in the registry without testing the predicates -
dispatchAllWithCountImmediately
public int dispatchAllWithCountImmediately()This will immediately dispatch theDataLoaders in the registry without testing the predicates- Returns:
- total number of entries that were dispatched from registered
DataLoaders.
-
rescheduleNow
public void rescheduleNow()This will schedule a task to check the predicate and dispatch if true right now. It will not do a pre-check of the predicate likedispatchAll()would -
newScheduledRegistry
By default, this will create use aExecutors.newSingleThreadScheduledExecutor()and a schedule duration of 10 milliseconds.- Returns:
- A builder of
ScheduledDataLoaderRegistrys
-