A Java 8 port of Facebook DataLoader
CacheMap
signature has been changed to correctly reflect that it is a cache of CompletableFuture<V>
and not just <V>
a new ValueCache
layer has been added to that allows values to be stored in external cache systems such as REDIS or long lived cross request systems like Caffeine
A new last dispatched time is present on DataLoaders
An experimental ScheduledDataLoaderRegistry
that allows new ways to dispatch dataloaders.
This adds getIfPresent
and getIfCompleted
methods as well as a computeIfAbsent
on DataLoaderRegistry for lazy loaders
This adds the ability to be passed a list of context load objects per batch key as well as a map of them
This adds new features into data loader to allow you to write more powerful batch loading functions
The first is returning a Map from batch loader function instead of an ordered list. This suits some use cases much more naturally
MappedBatchLoaderWithContext<Long, User> mapBatchLoader = new MappedBatchLoaderWithContext<Long, User>() {
@Override
public CompletionStage<Map<Long, User>> load(Set<Long> userIds, BatchLoaderEnvironment environment) {
SecurityCtx callCtx = environment.getContext();
return CompletableFuture.supplyAsync(() -> userManager.loadMapOfUsersByIds(callCtx, userIds));
}
};
DataLoader<Long, User> userLoader = DataLoader.newMappedDataLoader(mapBatchLoader);
// ...
The second major change is that context
can now be pushed into batch loading functions allowing you to get user credentials or database details for example
DataLoaderOptions options = DataLoaderOptions.newOptions()
.setBatchLoaderContextProvider(() -> SecurityCtx.getCallingUserCtx());
BatchLoaderWithContext<String, String> batchLoader = new BatchLoaderWithContext<String, String>() {
@Override
public CompletionStage<List<String>> load(List<String> keys, BatchLoaderEnvironment environment) {
SecurityCtx callCtx = environment.getContext();
return callDatabaseForResults(callCtx, keys);
}
};
DataLoader<String, String> loader = DataLoader.newDataLoader(batchLoader, options);
This release is borked. DO NOT USE. Use 2.1.1 instead
This fixes a bug where calling load while caching is disabled means the batch loader should get duplicate batch calls.
Also the synchronized code policy was changed
#5
Instrumentation
support that ensures dataloader is dispatched as a graphql query executesThis is the first release of the pure Java 8 port of Facebook data loader
It has no dependencies on any library to make it as lightweight as possible.
https://github.com/graphql-java/java-dataloader
Enjoy