protected void createBundleIfNeeded(final String versionedBundleName, final List<String> filePaths, final ResourceResolverChain resolverChain, final List<Resource> locations, final String bundleAppend) { if (!createdBundles.containsKey(versionedBundleName)) { keyLockManager.executeLocked(versionedBundleName, new LockCallback() { @Override public void doInLock() { Resource bundleResource = getBundledResource(versionedBundleName); if (bundleResource == null || !bundleResource.exists()) { bundleResource = createBundle(versionedBundleName, filePaths, resolverChain, locations, bundleAppend); if (bundleResource != null) { saveBundle(bundleResource); } Resource savedResource = readBundle(versionedBundleName); BundledResourceInfo bundledResourceInfo = new BundledResourceInfo(savedResource, versionedBundleName, filePaths); createdBundles.put(versionedBundleName, bundledResourceInfo); } } }); } } protected Resource createBundle(String versionedBundleName, List<String> filePaths,
public class WeatherServiceProxy { ... private final KeyLockManager lockManager = KeyLockManagers.newManager(); public void updateWeatherData(String cityName, Date samplingTime, float temperature) { lockManager.executeLocked(cityName, new LockCallback() { public void doInLock() { delegate.updateWeatherData(cityName, samplingTime, temperature); } }); }
private ConcurrentMap<String, Long> getMap(String key, int longestDuration) { // Currently unable to putIfAbsent when using jodah's expiry map so will wrap in a lock return lockManager.executeLocked(key, () -> { ConcurrentMap<String, Long> keyMap = expiringKeyMap.get(key); if (keyMap == null) { keyMap = new ConcurrentHashMap<>(); expiringKeyMap.put(key, keyMap, ExpirationPolicy.CREATED, longestDuration, TimeUnit.SECONDS); } return keyMap; }); }
@Override public final IExecutionResult execute(final IEngineContext context, final ICommonTask task) { return keyLockManager.executeLocked(getLockKey(task), () -> executeInLock(context, task)); }