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 AbstractLockTaskService() { super(); this.keyLockManager = KeyLockManagers.newLock(); }
private <R> R executeLockedInternal(final Object key, final ReturnValueLockCallback<R> callback) { assert key != null : "contract broken: key != null"; assert callback != null : "contract broken: callback != null"; final CountingLock lock = getKeyLock(key); try { lock.tryLock(); try { return callback.doInLock(); } finally { lock.unlock(); } } finally { freeKeyLock(key, lock); } }
@Override public final void executeLocked(final Object key, final LockCallback callback) { Contract.isNotNull(key, "key != null"); Contract.isNotNull(callback, "callback != null"); executeLockedInternal(key, () -> { callback.doInLock(); return null; }); }
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 <R> R executeLockedInternal(final Object key, final ReturnValueLockCallback<R> callback) { assert key != null : "contract broken: key != null"; assert callback != null : "contract broken: callback != null"; final CountingLock lock = getKeyLock(key); try { lock.tryLock(); try { return callback.doInLock(); } finally { lock.unlock(); } } finally { freeKeyLock(key, lock); } }
@Override public final void executeLocked(final Object key, final LockCallback callback) { Contract.isNotNull(key, "key != null"); Contract.isNotNull(callback, "callback != null"); executeLockedInternal(key, () -> { callback.doInLock(); return null; }); }
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)); }