K
- type parameter indicating the type of the data load keysV
- type parameter indicating the type of the data that is returned@PublicApi public class DataLoader<K,V> extends java.lang.Object
CompletableFuture
is returned, that completes as the batch function completes.
With batching enabled the execution will start after calling dispatch()
, causing the queue of
loaded keys to be sent to the batch function, clears the queue, and returns a promise to the values.
As BatchLoader
batch functions are executed the resulting futures are cached using a cache
implementation of choice, so they will only execute once. Individual cache keys can be cleared, so they will
be re-fetched when referred to again.
It is also possible to clear the cache entirely, and prime it with values before they are used.
Both caching and batching can be disabled. Configuration of the data loader is done by providing a
DataLoaderOptions
instance on creation.
A call to the batch loader might result in individual exception failures for item with the returned list. if
you want to capture these specific item failures then use Try
as a return value and
create the data loader with newDataLoaderWithTry(BatchLoader)
form. The Try values will be interpreted
as either success values or cause the load(Object)
promise to complete exceptionally.
Constructor and Description |
---|
DataLoader(BatchLoader<K,V> batchLoadFunction)
Deprecated.
use
DataLoaderFactory instead |
DataLoader(BatchLoader<K,V> batchLoadFunction,
DataLoaderOptions options)
Deprecated.
use
DataLoaderFactory instead |
Modifier and Type | Method and Description |
---|---|
DataLoader<K,V> |
clear(K key)
Clears the future with the specified key from the cache, if caching is enabled, so it will be re-fetched
on the next load request.
|
DataLoader<K,V> |
clear(K key,
java.util.function.BiConsumer<java.lang.Void,java.lang.Throwable> handler)
Clears the future with the specified key from the cache remote value store, if caching is enabled
and a remote store is set, so it will be re-fetched and stored on the next load request.
|
DataLoader<K,V> |
clearAll()
Clears the entire cache map of the loader.
|
DataLoader<K,V> |
clearAll(java.util.function.BiConsumer<java.lang.Void,java.lang.Throwable> handler)
Clears the entire cache map of the loader, and of the cached value store.
|
java.util.concurrent.CompletableFuture<java.util.List<V>> |
dispatch()
Dispatches the queued load requests to the batch execution function and returns a promise of the result.
|
java.util.List<V> |
dispatchAndJoin()
Normally
dispatch() is an asynchronous operation but this version will 'join' on the
results if dispatch and wait for them to complete. |
int |
dispatchDepth() |
DispatchResult<V> |
dispatchWithCounts()
Dispatches the queued load requests to the batch execution function and returns both the promise of the result
and the number of entries that were dispatched.
|
java.lang.Object |
getCacheKey(K key)
Gets the object that is used in the internal cache map as key, by applying the cache key function to
the provided key.
|
CacheMap<java.lang.Object,V> |
getCacheMap()
Gets the cacheMap associated with this data loader passed in via
DataLoaderOptions.cacheMap() |
java.util.Optional<java.util.concurrent.CompletableFuture<V>> |
getIfCompleted(K key)
This will return an optional promise to a value previously loaded via a
load(Object) call that has in fact been completed or empty
if no call has been made for that key or the promise has not completed yet. |
java.util.Optional<java.util.concurrent.CompletableFuture<V>> |
getIfPresent(K key)
This will return an optional promise to a value previously loaded via a
load(Object) call or empty if not call has been made for that key. |
java.time.Instant |
getLastDispatchTime()
This returns the last instant the data loader was dispatched.
|
Statistics |
getStatistics()
Gets the statistics associated with this data loader.
|
java.time.Duration |
getTimeSinceDispatch()
This returns the
Duration since the data loader was dispatched. |
ValueCache<K,V> |
getValueCache()
Gets the valueCache associated with this data loader passed in via
DataLoaderOptions.valueCache() |
java.util.concurrent.CompletableFuture<V> |
load(K key)
Requests to load the data with the specified key asynchronously, and returns a future of the resulting value.
|
java.util.concurrent.CompletableFuture<V> |
load(K key,
java.lang.Object keyContext)
Requests to load the data with the specified key asynchronously, and returns a future of the resulting value.
|
java.util.concurrent.CompletableFuture<java.util.List<V>> |
loadMany(java.util.List<K> keys)
Requests to load the list of data provided by the specified keys asynchronously, and returns a composite future
of the resulting values.
|
java.util.concurrent.CompletableFuture<java.util.List<V>> |
loadMany(java.util.List<K> keys,
java.util.List<java.lang.Object> keyContexts)
Requests to load the list of data provided by the specified keys asynchronously, and returns a composite future
of the resulting values.
|
static <K,V> DataLoader<K,V> |
newDataLoader(BatchLoader<K,V> batchLoadFunction)
Deprecated.
use
DataLoaderFactory instead |
static <K,V> DataLoader<K,V> |
newDataLoader(BatchLoader<K,V> batchLoadFunction,
DataLoaderOptions options)
Deprecated.
use
DataLoaderFactory instead |
static <K,V> DataLoader<K,V> |
newDataLoader(BatchLoaderWithContext<K,V> batchLoadFunction)
Deprecated.
use
DataLoaderFactory instead |
static <K,V> DataLoader<K,V> |
newDataLoader(BatchLoaderWithContext<K,V> batchLoadFunction,
DataLoaderOptions options)
Deprecated.
use
DataLoaderFactory instead |
static <K,V> DataLoader<K,V> |
newDataLoaderWithTry(BatchLoader<K,Try<V>> batchLoadFunction)
Deprecated.
use
DataLoaderFactory instead |
static <K,V> DataLoader<K,V> |
newDataLoaderWithTry(BatchLoader<K,Try<V>> batchLoadFunction,
DataLoaderOptions options)
Deprecated.
use
DataLoaderFactory instead |
static <K,V> DataLoader<K,V> |
newDataLoaderWithTry(BatchLoaderWithContext<K,Try<V>> batchLoadFunction)
Deprecated.
use
DataLoaderFactory instead |
static <K,V> DataLoader<K,V> |
newDataLoaderWithTry(BatchLoaderWithContext<K,Try<V>> batchLoadFunction,
DataLoaderOptions options)
Deprecated.
use
DataLoaderFactory instead |
static <K,V> DataLoader<K,V> |
newMappedDataLoader(MappedBatchLoader<K,V> batchLoadFunction)
Deprecated.
use
DataLoaderFactory instead |
static <K,V> DataLoader<K,V> |
newMappedDataLoader(MappedBatchLoader<K,V> batchLoadFunction,
DataLoaderOptions options)
Deprecated.
use
DataLoaderFactory instead |
static <K,V> DataLoader<K,V> |
newMappedDataLoader(MappedBatchLoaderWithContext<K,V> batchLoadFunction)
Deprecated.
use
DataLoaderFactory instead |
static <K,V> DataLoader<K,V> |
newMappedDataLoader(MappedBatchLoaderWithContext<K,V> batchLoadFunction,
DataLoaderOptions options)
Deprecated.
use
DataLoaderFactory instead |
static <K,V> DataLoader<K,V> |
newMappedDataLoaderWithTry(MappedBatchLoader<K,Try<V>> batchLoadFunction)
Deprecated.
use
DataLoaderFactory instead |
static <K,V> DataLoader<K,V> |
newMappedDataLoaderWithTry(MappedBatchLoader<K,Try<V>> batchLoadFunction,
DataLoaderOptions options)
Deprecated.
use
DataLoaderFactory instead |
static <K,V> DataLoader<K,V> |
newMappedDataLoaderWithTry(MappedBatchLoaderWithContext<K,Try<V>> batchLoadFunction)
Deprecated.
use
DataLoaderFactory instead |
static <K,V> DataLoader<K,V> |
newMappedDataLoaderWithTry(MappedBatchLoaderWithContext<K,Try<V>> batchLoadFunction,
DataLoaderOptions options)
Deprecated.
use
DataLoaderFactory instead |
DataLoader<K,V> |
prime(K key,
java.util.concurrent.CompletableFuture<V> value)
Primes the cache with the given key and value.
|
DataLoader<K,V> |
prime(K key,
java.lang.Exception error)
Primes the cache with the given key and error.
|
DataLoader<K,V> |
prime(K key,
V value)
Primes the cache with the given key and value.
|
@Deprecated public DataLoader(BatchLoader<K,V> batchLoadFunction)
DataLoaderFactory
insteadbatchLoadFunction
- the batch load function to use@Deprecated public DataLoader(BatchLoader<K,V> batchLoadFunction, DataLoaderOptions options)
DataLoaderFactory
insteadbatchLoadFunction
- the batch load function to useoptions
- the batch load options@Deprecated public static <K,V> DataLoader<K,V> newDataLoader(BatchLoader<K,V> batchLoadFunction)
DataLoaderFactory
insteadK
- the key typeV
- the value typebatchLoadFunction
- the batch load function to use@Deprecated public static <K,V> DataLoader<K,V> newDataLoader(BatchLoader<K,V> batchLoadFunction, DataLoaderOptions options)
DataLoaderFactory
insteadK
- the key typeV
- the value typebatchLoadFunction
- the batch load function to useoptions
- the options to use@Deprecated public static <K,V> DataLoader<K,V> newDataLoaderWithTry(BatchLoader<K,Try<V>> batchLoadFunction)
DataLoaderFactory
insteadTry
objects.
If its important you to know the exact status of each item in a batch call and whether it threw exceptions then you can use this form to create the data loader.
Using Try objects allows you to capture a value returned or an exception that might have occurred trying to get a value. .
K
- the key typeV
- the value typebatchLoadFunction
- the batch load function to use that uses Try
objects@Deprecated public static <K,V> DataLoader<K,V> newDataLoaderWithTry(BatchLoader<K,Try<V>> batchLoadFunction, DataLoaderOptions options)
DataLoaderFactory
insteadTry
objects.K
- the key typeV
- the value typebatchLoadFunction
- the batch load function to use that uses Try
objectsoptions
- the options to useDataLoaderFactory.newDataLoaderWithTry(BatchLoader)
@Deprecated public static <K,V> DataLoader<K,V> newDataLoader(BatchLoaderWithContext<K,V> batchLoadFunction)
DataLoaderFactory
insteadK
- the key typeV
- the value typebatchLoadFunction
- the batch load function to use@Deprecated public static <K,V> DataLoader<K,V> newDataLoader(BatchLoaderWithContext<K,V> batchLoadFunction, DataLoaderOptions options)
DataLoaderFactory
insteadK
- the key typeV
- the value typebatchLoadFunction
- the batch load function to useoptions
- the options to use@Deprecated public static <K,V> DataLoader<K,V> newDataLoaderWithTry(BatchLoaderWithContext<K,Try<V>> batchLoadFunction)
DataLoaderFactory
insteadTry
objects.
If its important you to know the exact status of each item in a batch call and whether it threw exceptions then you can use this form to create the data loader.
Using Try objects allows you to capture a value returned or an exception that might have occurred trying to get a value. .
K
- the key typeV
- the value typebatchLoadFunction
- the batch load function to use that uses Try
objects@Deprecated public static <K,V> DataLoader<K,V> newDataLoaderWithTry(BatchLoaderWithContext<K,Try<V>> batchLoadFunction, DataLoaderOptions options)
DataLoaderFactory
insteadTry
objects.K
- the key typeV
- the value typebatchLoadFunction
- the batch load function to use that uses Try
objectsoptions
- the options to useDataLoaderFactory.newDataLoaderWithTry(BatchLoader)
@Deprecated public static <K,V> DataLoader<K,V> newMappedDataLoader(MappedBatchLoader<K,V> batchLoadFunction)
DataLoaderFactory
insteadK
- the key typeV
- the value typebatchLoadFunction
- the batch load function to use@Deprecated public static <K,V> DataLoader<K,V> newMappedDataLoader(MappedBatchLoader<K,V> batchLoadFunction, DataLoaderOptions options)
DataLoaderFactory
insteadK
- the key typeV
- the value typebatchLoadFunction
- the batch load function to useoptions
- the options to use@Deprecated public static <K,V> DataLoader<K,V> newMappedDataLoaderWithTry(MappedBatchLoader<K,Try<V>> batchLoadFunction)
DataLoaderFactory
insteadTry
objects.
If its important you to know the exact status of each item in a batch call and whether it threw exceptions then you can use this form to create the data loader.
Using Try objects allows you to capture a value returned or an exception that might have occurred trying to get a value. .
K
- the key typeV
- the value typebatchLoadFunction
- the batch load function to use that uses Try
objects@Deprecated public static <K,V> DataLoader<K,V> newMappedDataLoaderWithTry(MappedBatchLoader<K,Try<V>> batchLoadFunction, DataLoaderOptions options)
DataLoaderFactory
insteadTry
objects.K
- the key typeV
- the value typebatchLoadFunction
- the batch load function to use that uses Try
objectsoptions
- the options to useDataLoaderFactory.newDataLoaderWithTry(BatchLoader)
@Deprecated public static <K,V> DataLoader<K,V> newMappedDataLoader(MappedBatchLoaderWithContext<K,V> batchLoadFunction)
DataLoaderFactory
insteadK
- the key typeV
- the value typebatchLoadFunction
- the batch load function to use@Deprecated public static <K,V> DataLoader<K,V> newMappedDataLoader(MappedBatchLoaderWithContext<K,V> batchLoadFunction, DataLoaderOptions options)
DataLoaderFactory
insteadK
- the key typeV
- the value typebatchLoadFunction
- the batch load function to useoptions
- the options to use@Deprecated public static <K,V> DataLoader<K,V> newMappedDataLoaderWithTry(MappedBatchLoaderWithContext<K,Try<V>> batchLoadFunction)
DataLoaderFactory
insteadTry
objects.
If its important you to know the exact status of each item in a batch call and whether it threw exceptions then you can use this form to create the data loader.
Using Try objects allows you to capture a value returned or an exception that might have occurred trying to get a value. .
K
- the key typeV
- the value typebatchLoadFunction
- the batch load function to use that uses Try
objects@Deprecated public static <K,V> DataLoader<K,V> newMappedDataLoaderWithTry(MappedBatchLoaderWithContext<K,Try<V>> batchLoadFunction, DataLoaderOptions options)
DataLoaderFactory
insteadTry
objects.K
- the key typeV
- the value typebatchLoadFunction
- the batch load function to use that uses Try
objectsoptions
- the options to useDataLoaderFactory.newDataLoaderWithTry(BatchLoader)
public java.time.Instant getLastDispatchTime()
public java.time.Duration getTimeSinceDispatch()
Duration
since the data loader was dispatched. When the data loader is created this is zero.public java.util.concurrent.CompletableFuture<V> load(K key)
If batching is enabled (the default), you'll have to call dispatch()
at a later stage to
start batch execution. If you forget this call the future will never be completed (unless already completed,
and returned from cache).
key
- the key to loadpublic java.util.Optional<java.util.concurrent.CompletableFuture<V>> getIfPresent(K key)
load(Object)
call or empty if not call has been made for that key.
If you do get a present CompletableFuture it does not mean it has been dispatched and completed yet. It just means its at least pending and in cache.
If caching is disabled there will never be a present Optional returned.
NOTE : This will NOT cause a data load to happen. You must called load(Object)
for that to happen.
key
- the key to checkpublic java.util.Optional<java.util.concurrent.CompletableFuture<V>> getIfCompleted(K key)
load(Object)
call that has in fact been completed or empty
if no call has been made for that key or the promise has not completed yet.
If you do get a present CompletableFuture it means it has been dispatched and completed. Completed is defined as
CompletableFuture.isDone()
returning true.
If caching is disabled there will never be a present Optional returned.
NOTE : This will NOT cause a data load to happen. You must called load(Object)
for that to happen.
key
- the key to checkpublic java.util.concurrent.CompletableFuture<V> load(K key, java.lang.Object keyContext)
If batching is enabled (the default), you'll have to call dispatch()
at a later stage to
start batch execution. If you forget this call the future will never be completed (unless already completed,
and returned from cache).
The key context object may be useful in the batch loader interfaces such as BatchLoaderWithContext
or
MappedBatchLoaderWithContext
to help retrieve data.
key
- the key to loadkeyContext
- a context object that is specific to this keypublic java.util.concurrent.CompletableFuture<java.util.List<V>> loadMany(java.util.List<K> keys)
If batching is enabled (the default), you'll have to call dispatch()
at a later stage to
start batch execution. If you forget this call the future will never be completed (unless already completed,
and returned from cache).
keys
- the list of keys to loadpublic java.util.concurrent.CompletableFuture<java.util.List<V>> loadMany(java.util.List<K> keys, java.util.List<java.lang.Object> keyContexts)
If batching is enabled (the default), you'll have to call dispatch()
at a later stage to
start batch execution. If you forget this call the future will never be completed (unless already completed,
and returned from cache).
The key context object may be useful in the batch loader interfaces such as BatchLoaderWithContext
or
MappedBatchLoaderWithContext
to help retrieve data.
keys
- the list of keys to loadkeyContexts
- the list of key calling context objectspublic java.util.concurrent.CompletableFuture<java.util.List<V>> dispatch()
If batching is disabled, or there are no queued requests, then a succeeded promise is returned.
public DispatchResult<V> dispatchWithCounts()
If batching is disabled, or there are no queued requests, then a succeeded promise with no entries dispatched is returned.
public java.util.List<V> dispatchAndJoin()
dispatch()
is an asynchronous operation but this version will 'join' on the
results if dispatch and wait for them to complete. If the CompletableFuture
callbacks make more
calls to this data loader then the dispatchDepth()
will be > 0 and this method will loop
around and wait for any other extra batch loads to occur.dispatchDepth()
reached 0public int dispatchDepth()
public DataLoader<K,V> clear(K key)
key
- the key to removepublic DataLoader<K,V> clear(K key, java.util.function.BiConsumer<java.lang.Void,java.lang.Throwable> handler)
key
- the key to removehandler
- a handler that will be called after the async remote clear completespublic DataLoader<K,V> clearAll()
public DataLoader<K,V> clearAll(java.util.function.BiConsumer<java.lang.Void,java.lang.Throwable> handler)
handler
- a handler that will be called after the async remote clear all completespublic DataLoader<K,V> prime(K key, V value)
ValueCache.set(Object, Object)
if you want
to prime it with values before usekey
- the keyvalue
- the valuepublic DataLoader<K,V> prime(K key, java.lang.Exception error)
key
- the keyerror
- the exception to prime instead of a valuepublic DataLoader<K,V> prime(K key, java.util.concurrent.CompletableFuture<V> value)
ValueCache.set(Object, Object)
if you want
to prime it with values before usekey
- the keyvalue
- the valuepublic java.lang.Object getCacheKey(K key)
If no cache key function is present in DataLoaderOptions
, then the returned value equals the input key.
key
- the input keypublic Statistics getStatistics()
StatisticsCollector
passed in via DataLoaderOptions.getStatisticsCollector()
public CacheMap<java.lang.Object,V> getCacheMap()
DataLoaderOptions.cacheMap()
public ValueCache<K,V> getValueCache()
DataLoaderOptions.valueCache()