此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Integration 6.5.1spring-doc.cadn.net.cn

分布式锁

在许多情况下,必须以排他方式执行针对某些上下文(甚至单个消息)的作。 一个例子是聚合器组件,我们必须检查当前消息的消息组状态,以确定我们是否可以释放该组或仅添加该消息以供将来考虑。 为此,Java 提供了一个 APIjava.util.concurrent.locks.Lock实现。 但是,当应用程序在集群中分布和/或运行时,问题变得更加复杂。 在这种情况下,锁定具有挑战性,需要一些共享状态及其特定方法来实现排他性要求。spring-doc.cadn.net.cn

Spring Integration 提供了一个LockRegistry具有内存中的抽象DefaultLockRegistry基于ReentrantLock应用程序接口。 这obtain(Object)方法LockRegistry需要一个lock key对于特定上下文。 例如,聚合器使用correlationKey锁定其组周围的作。 这样可以同时使用不同的锁。 这obtain(Object)方法返回一个java.util.concurrent.locks.Lock实例(取决于LockRegistry实现),因此其余的逻辑与标准 Java 并发算法相同。spring-doc.cadn.net.cn

从 6.2 版开始,LockRegistry提供executeLocked()API (default方法)在锁定时执行某些任务。 此 API 的行为类似于众所周知的JdbcTemplate,JmsTemplateRestTemplate. 以下示例演示了此 API 的用法:spring-doc.cadn.net.cn

LockRegistry registry = new DefaultLockRegistry();
...
registry.executeLocked("someLockKey", () -> someExclusiveResourceCall());

该方法从任务调用中重新抛出异常,抛出InterruptedException如果Lock被打断。 此外,具有Duration抛出一个java.util.concurrent.TimeoutException什么时候lock.tryLock()返回false.spring-doc.cadn.net.cn

Spring Integration 提供了这些LockRegistry分布式锁的实现:spring-doc.cadn.net.cn

Spring Integration AWS 扩展还实现了一个DynamoDbLockRegistry.spring-doc.cadn.net.cn