我不确定何时调用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实例。

10-05 23:10