Class RedisLockRegistry
java.lang.Object
org.springframework.integration.redis.util.RedisLockRegistry
- All Implemented Interfaces:
DisposableBean
,ExpirableLockRegistry
,LockRegistry
,RenewableLockRegistry
public final class RedisLockRegistry
extends Object
implements ExpirableLockRegistry, DisposableBean, RenewableLockRegistry
Implementation of
ExpirableLockRegistry
providing a distributed lock using Redis.
Locks are stored under the key registryKey:lockKey
. Locks expire after
(default 60) seconds. Threads unlocking an
expired lock will get an IllegalStateException
. This should be
considered as a critical error because it is possible the protected
resources were compromised.
Locks are reentrant.
However, locks are scoped by the registry; a lock from a different registry with the same key (even if the registry uses the same 'registryKey') are different locks, and the second cannot be acquired by the same thread while the first is locked.
Note: This is not intended for low latency applications. It is intended for resource locking across multiple JVMs.
Condition
s are not supported.
- Since:
- 4.0
- Author:
- Gary Russell, Konstantin Yakimov, Artem Bilan, Vedran Pavic, Unseok Kim, Anton Gabov, Christian Tzolov, Eddie Cho, Myeonghyeon Lee, Roman Zabaluev, Alex Peelman, Youbin Wu
-
Nested Class Summary
Modifier and TypeClassDescriptionstatic enum
The mode in which this registry is going to work with locks. -
Constructor Summary
ConstructorDescriptionRedisLockRegistry
(RedisConnectionFactory connectionFactory, String registryKey) Constructs a lock registry with the default (60 second) lock expiration.RedisLockRegistry
(RedisConnectionFactory connectionFactory, String registryKey, long expireAfter) Constructs a lock registry with the supplied lock expiration. -
Method Summary
Modifier and TypeMethodDescriptionvoid
destroy()
void
expireUnusedOlderThan
(long age) Remove locks last acquired more than 'age' ago that are not currently locked.Obtain the lock associated with the parameter object.void
Renew the time to live of the lock is associated with the parameter object.void
setCacheCapacity
(int cacheCapacity) Set the capacity of cached locks.void
setExecutor
(Executor executor) Set theExecutor
, where is not provided then a default of cached thread pool Executor will be used.void
setIdleBetweenTries
(Duration idleBetweenTries) Specify a @link Duration} to sleep between obtainLock attempts.void
setRedisLockType
(RedisLockRegistry.RedisLockType redisLockType) SetRedisLockRegistry.RedisLockType
mode to work in.void
setRenewalTaskScheduler
(TaskScheduler renewalTaskScheduler) Set theTaskScheduler
to use for the renewal task.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface org.springframework.integration.support.locks.LockRegistry
executeLocked, executeLocked, executeLocked, executeLocked
-
Constructor Details
-
RedisLockRegistry
Constructs a lock registry with the default (60 second) lock expiration.- Parameters:
connectionFactory
- The connection factory.registryKey
- The key prefix for locks.
-
RedisLockRegistry
public RedisLockRegistry(RedisConnectionFactory connectionFactory, String registryKey, long expireAfter) Constructs a lock registry with the supplied lock expiration.- Parameters:
connectionFactory
- The connection factory.registryKey
- The key prefix for locks.expireAfter
- The expiration in milliseconds.
-
-
Method Details
-
setExecutor
Set theExecutor
, where is not provided then a default of cached thread pool Executor will be used.- Parameters:
executor
- the executor service- Since:
- 5.0.5
-
setRenewalTaskScheduler
Description copied from interface:RenewableLockRegistry
Set theTaskScheduler
to use for the renewal task. When renewalTaskScheduler is set, it will be used to periodically renew the lock to ensure that the lock does not expire while the thread is working.- Specified by:
setRenewalTaskScheduler
in interfaceRenewableLockRegistry
- Parameters:
renewalTaskScheduler
- renew task scheduler
-
setCacheCapacity
public void setCacheCapacity(int cacheCapacity) Set the capacity of cached locks.- Parameters:
cacheCapacity
- The capacity of cached lock, (default 100_000).- Since:
- 5.5.6
-
setIdleBetweenTries
Specify a @link Duration} to sleep between obtainLock attempts. Defaults to 100 milliseconds.- Parameters:
idleBetweenTries
- theDuration
to sleep between obtainLock attempts.- Since:
- 6.4.0
-
setRedisLockType
SetRedisLockRegistry.RedisLockType
mode to work in. By default, theRedisLockRegistry.RedisLockType.SPIN_LOCK
is used - works in all the environment. TheRedisLockRegistry.RedisLockType.PUB_SUB_LOCK
is a preferred mode when not in Master/Replica connections - less network chatter. Set the type of unlockType, Select the lock method.- Parameters:
redisLockType
- theRedisLockRegistry.RedisLockType
to work in.- Since:
- 5.5.13
-
obtain
Description copied from interface:LockRegistry
Obtain the lock associated with the parameter object.- Specified by:
obtain
in interfaceLockRegistry
- Parameters:
lockKey
- The object with which the lock is associated.- Returns:
- The associated lock.
-
expireUnusedOlderThan
public void expireUnusedOlderThan(long age) Description copied from interface:ExpirableLockRegistry
Remove locks last acquired more than 'age' ago that are not currently locked.- Specified by:
expireUnusedOlderThan
in interfaceExpirableLockRegistry
- Parameters:
age
- the time since the lock was last obtained.
-
destroy
public void destroy()- Specified by:
destroy
in interfaceDisposableBean
-
renewLock
Description copied from interface:RenewableLockRegistry
Renew the time to live of the lock is associated with the parameter object. The lock must be held by the current thread- Specified by:
renewLock
in interfaceRenewableLockRegistry
- Parameters:
lockKey
- The object with which the lock is associated.
-