@Override public WorkerResult loadSessions(KeycloakSession session, RemoteCacheSessionsLoaderContext loaderContext, WorkerContext ctx) { Cache cache = getCache(session); Cache decoratedCache = cache.getAdvancedCache().withFlags(Flag.SKIP_CACHE_LOAD, Flag.SKIP_CACHE_STORE, Flag.IGNORE_RETURN_VALUES); RemoteCache remoteCache = getRemoteCache(session); Set<Integer> myIspnSegments = getMyIspnSegments(ctx.getSegment(), loaderContext); log.debugf("Will do bulk load of sessions from remote cache '%s' . Segment: %d", cache.getName(), ctx.getSegment()); Map<Object, Object> remoteEntries = new HashMap<>(); CloseableIterator<Map.Entry> iterator = null; int countLoaded = 0; try { iterator = remoteCache.retrieveEntries(null, myIspnSegments, loaderContext.getSessionsPerSegment()); while (iterator.hasNext()) { countLoaded++; Map.Entry entry = iterator.next(); remoteEntries.put(entry.getKey(), entry.getValue()); } } catch (RuntimeException e) { log.warnf(e, "Error loading sessions from remote cache '%s' for segment '%d'", remoteCache.getName(), ctx.getSegment()); throw e; } finally { if (iterator != null) { iterator.close(); } } decoratedCache.putAll(remoteEntries); log.debugf("Successfully finished loading sessions from cache '%s' . Segment: %d, Count of sessions loaded: %d", cache.getName(), ctx.getSegment(), countLoaded); return new WorkerResult(true, ctx.getSegment(), ctx.getWorkerId()); }
@Override public WorkerResult createFailedWorkerResult(RemoteCacheSessionsLoaderContext loaderContext, WorkerContext workerContext) { return new WorkerResult(false, workerContext.getSegment(), workerContext.getWorkerId()); }
@Override public WorkerContext computeWorkerContext(RemoteCacheSessionsLoaderContext loaderCtx, int segment, int workerId, List<WorkerResult> previousResults) { return new WorkerContext(segment, workerId); }