我不确定何时调用RedisLockRegistry.obtain(String lockKey)
(或更普遍的是LockRegistry.obtain(String lockKey)
)。我应该只在应用程序启动时获得一次锁,然后照常对其进行锁定/解锁吗?还是应该在每次调用锁之前(在使用之前)都获得锁?
目前,我正在使用后一种选项,但是,我不确定这是否真的必要。
最佳答案
理解如何使用它的最好方法是遵循框架中的现有模式。
我要说的最简单的样本是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();
}
}
}
}
作为一个使用场所。
另一个示例是
AbstractCorrelatingMessageHandler
:@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();
}
}
因此,是的,您始终在使用目标
obtain()
API之前先调用Lock
。但总的来说,不伤害它就不要重新获得它。我们只检查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
实例。