分布式锁
在许多情况下,针对某些上下文(甚至单个消息)的操作必须以独占方式执行。
一个例子是聚合器组件,我们必须检查当前消息的消息组状态,以确定我们是可以释放该组还是只添加该消息以供将来考虑。
为此,Java 提供了一个带有实现的 API。
但是,当应用程序在集群中分发和/或运行时,问题会变得更加复杂。
在这种情况下,锁定是具有挑战性的,需要一些共享状态及其特定方法来实现排他性要求。java.util.concurrent.locks.Lock
Spring 集成提供了一个基于 API 的内存实现的抽象。
的方法需要一个 for specific context.
例如,聚合商使用 a 来锁定其组周围的操作。
这样就可以同时使用不同的锁。
此方法返回一个实例(取决于实现),因此其余逻辑与标准 Java 并发算法相同。LockRegistry
DefaultLockRegistry
ReentrantLock
obtain(Object)
LockRegistry
lock key
correlationKey
obtain(Object)
java.util.concurrent.locks.Lock
LockRegistry
从版本 6.2 开始,提供了一个 API(此接口中的方法)以在锁定时执行某些任务。
此 API 的行为类似于 well-known 或 .
以下示例演示了此 API 的用法:LockRegistry
executeLocked()
default
JdbcTemplate
JmsTemplate
RestTemplate
LockRegistry registry = new DefaultLockRegistry();
...
registry.executeLocked("someLockKey", () -> someExclusiveResourceCall());
该方法从任务调用中重新引发异常,引发 if 被中断。
此外,具有的变体会引发 when 返回 。InterruptedException
Lock
Duration
java.util.concurrent.TimeoutException
lock.tryLock()
false
Spring 集成为分布式锁提供了这些实现:LockRegistry
Spring 集成 AWS 扩展还实现了一个 .DynamoDbLockRegistry