我要求使用hazelcast IMap和ILock构造找不到解决方案。
我需要跟踪通过分布式映射获取的所有锁(在成功完成IMap.tryLock(K键)调用后获取的锁)。 每个成功获取的锁必须与地图中的自定义对象关联/配对以进行跟踪。 (这些自定义对象包含用于监视目的的应用程序特定的锁定器信息。 我想要的是,当成功获取锁定时,与锁相关的关联自定义对象必须自动以原子方式放入地图。 当释放锁时,与锁相关的关联自定义对象必须自动逐步驱逐。
换句话说,我想正确跟踪所有未发布锁的锁定信息。
我的第一个尝试/趋势是实现如下锁定实用程序方法:
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);
}
}
显然这种方法很容易出错,因为锁获取/释放操作和后续map put(在示例代码putLockInfoToMapAfterLockAcquire方法中)/ remove(在示例代码中的removeLockInfoAfterUnlockSuccess方法)操作都不是原子的...
我无法找到使用hazelcast并发构造的解决方案。
保持锁相关信息并确保它们与锁同步的正确方法是什么?之前没有人有类似的要求吗?
感谢任何指导
答案 0 :(得分:1)
AFAIK没有直接支持API级别来遍历或获取从Imap界面获取的锁的信息。所以我认为你自己做的方式是正确的。要同步锁定信息和锁定,您可以使用hazelcast transactions.