我不确定何时调用 RedisLockRegistry.obtain(String lockKey)
(或更一般地说,LockRegistry.obtain(String lockKey)
)。我应该在应用程序启动时只获取一次锁,然后照常锁定/解锁它,还是应该每次在调用 lock 之前(在使用它之前)获取锁?
目前我正在使用后一个选项,但是,我不确定这是否真的有必要。
最佳答案
了解如何使用它的最佳方法是遵循框架中的现有模式。
我想说的最简单的示例是SimpleMessageStore
:
@Override
public void addMessagesToGroup(Object groupId, Message<?>... messages) {
Lock lock = this.lockRegistry.obtain(groupId);
try {
lock.lockInterruptibly();
boolean unlocked = false;
...
}
finally {
if (!unlocked) {
lock.unlock();
}
}
}
}
作为一个使用场所。
另一个示例是AbstractCorrelatedMessageHandler
:
@Override
protected void handleMessageInternal(Message<?> message) throws Exception {
Object correlationKey = this.correlationStrategy.getCorrelationKey(message);
...
UUID groupIdUuid = UUIDConverter.getUUID(correlationKey);
Lock lock = this.lockRegistry.obtain(groupIdUuid.toString());
lock.lockInterruptibly();
try {
...
}
finally {
lock.unlock();
}
}
所以,是的,在使用目标 Lock
API 之前,您始终需要调用 obtain()
。但一般来说,它不会造成伤害,不要重新获得它。让我们检查一下 RedisLockRegistry
代码:
public Lock obtain(Object lockKey) {
Assert.isInstanceOf(String.class, lockKey);
String path = (String) lockKey;
return this.locks.computeIfAbsent(path, RedisLock::new);
}
LockRegistry
和此 obtain
背后的想法是允许最终用户访问共享资源(在我们的例子中为 Lock
)只。因此,如果您的key
非常全局,足以在应用程序开始时获取它的锁,那么您完全可以决定是否保留关联的Lock
实例。
关于java - Spring LockRegistry : when to call LockRegistry. 获取(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47830824/