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