我有一个要求,即无法使用 hazelcast IMap 和 ILock 构造找到解决方案。
我需要跟踪通过分布式映射获取的所有锁(成功调用 IMap.tryLock(K key) 后获取的锁)。 每个成功获取的锁都必须与映射中的自定义对象关联/配对以进行跟踪。 (这些自定义对象包含用于监控目的的应用程序特定的储物柜信息。) 我想要的是,当成功获取锁时,与锁相关的关联自定义对象必须自动自动放入映射中。 并且当锁被释放时,与锁相关的关联自定义对象必须自动被原子地逐出。
换句话说,我想正确跟踪所有未释放锁的储物柜信息。
我的第一次尝试/倾向是实现如下所示的锁定实用程序方法:
public boolean tryLockUtilMethod(String key, long maxTimeToWaitForTheLockInMilis) {
boolean isLockAcquired = false;
try {
isLockAcquired = IMap.tryLock(key, maxTimeToWaitForTheLockInMilis, TimeUnit.MILLISECONDS);
} catch (Exception e) {
...
}
if (isLockAcquired) {
putLockInfoToMapAfterLockAcquire(key);
}
}
解锁实用方法如下:
public void unlockUtilMethod(String key) {
boolean isUnlockSuccess = false;
try {
IMap.unlock(key);
isUnlockSuccess = true;
} catch (IllegalMonitorStateException e) {
// current thread does not hold the lock
...
} catch (Exception ex) {
...
}
if (isUnlockSuccess) {
removeLockInfoAfterUnlockSuccess(key);
}
}
显然这种方法很容易出错,因为锁获取/释放操作和后续的映射放置(在示例代码 putLockInfoToMapAfterLockAcquire 方法中)/删除(在示例代码 removeLockInfoAfterUnlockSuccess 方法中)操作不是原子操作...
我无法找到使用 hazelcast 并发构造的解决方案。
保存锁相关信息并确保它们与锁同步的正确方法是什么?以前没有人有过类似的需求吗?
感谢任何指导
最佳答案
据我所知,API级别没有直接支持遍历或获取有关从Imap接口(interface)获得的锁的信息。所以我认为你自己做的方法是正确的。对于同步锁定信息和锁定,您可以使用 hazelcast transactions.
关于java - Hazelcast - 将锁键与映射值关联以进行锁监控的策略/算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43282103/