Class DefaultLockRepository
java.lang.Object
org.springframework.integration.jdbc.lock.DefaultLockRepository
- All Implemented Interfaces:
Closeable
,AutoCloseable
,Aware
,InitializingBean
,SmartInitializingSingleton
,ApplicationContextAware
,Lifecycle
,Phased
,SmartLifecycle
,LockRepository
public class DefaultLockRepository
extends Object
implements LockRepository, InitializingBean, ApplicationContextAware, SmartInitializingSingleton, SmartLifecycle
The default implementation of the
LockRepository
based on the
table from the script presented in the org/springframework/integration/jdbc/schema-*.sql
.
This repository can't be shared between different JdbcLockRegistry
instances.
Otherwise, it opens a possibility to break Lock
contract,
where JdbcLockRegistry
uses non-shared ReentrantLock
s
for local synchronizations.
This class implements SmartLifecycle
and calls
SELECT COUNT(REGION) FROM %sLOCK
query
according to the provided prefix on start()
to check if required table is present in DB.
The application context will fail to start if the table is not present.
This check can be disabled via setCheckDatabaseOnStart(boolean)
.
- Since:
- 4.3
- Author:
- Dave Syer, Artem Bilan, Glenn Renfro, Gary Russell, Alexandre Strubel, Ruslan Stelmachenko
-
Field Summary
Modifier and TypeFieldDescriptionstatic final String
Default value for the table prefix property.static final Duration
Default value for the time-to-live property.Fields inherited from interface org.springframework.context.SmartLifecycle
DEFAULT_PHASE
-
Constructor Summary
ConstructorDescriptionDefaultLockRepository
(DataSource dataSource) Constructor that initializes the client id that will be associated for all the locks persisted by the store instance to a randomUUID
.DefaultLockRepository
(DataSource dataSource, String id) Constructor that allows the user to specify a client id that will be associated for all the locks persisted by the store instance. -
Method Summary
Modifier and TypeMethodDescriptionboolean
Acquire a lock for a key.void
void
void
close()
void
Remove a lock from this repository.void
Remove all the expired locks.Return the current insert query.Return the current renew query.Return the current update query.boolean
isAcquired
(String lock) Check if a lock is held by this repository.boolean
boolean
boolean
Renew the lease for a lock.void
setApplicationContext
(ApplicationContext applicationContext) void
setCheckDatabaseOnStart
(boolean checkDatabaseOnStart) The flag to perform a database check query on start or not.void
setInsertQuery
(String insertQuery) Set a customINSERT
query for a lock record.void
Specify the prefix for target database table used from queries.void
A unique grouping identifier for all locks persisted with this store.void
setRenewQuery
(String renewQuery) Set a customINSERT
query for a lock record.void
setTimeToLive
(int timeToLive) Specify the time (in milliseconds) to expire deadlocks.void
setTransactionManager
(PlatformTransactionManager transactionManager) Set aPlatformTransactionManager
for operations.void
setUpdateQuery
(String updateQuery) Set a customUPDATE
query for a lock record.void
start()
void
stop()
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface org.springframework.context.SmartLifecycle
getPhase, stop
-
Field Details
-
DEFAULT_TABLE_PREFIX
Default value for the table prefix property.- See Also:
-
DEFAULT_TTL
Default value for the time-to-live property.
-
-
Constructor Details
-
DefaultLockRepository
Constructor that initializes the client id that will be associated for all the locks persisted by the store instance to a randomUUID
.- Parameters:
dataSource
- theDataSource
used to maintain the lock repository.
-
DefaultLockRepository
Constructor that allows the user to specify a client id that will be associated for all the locks persisted by the store instance.- Parameters:
dataSource
- theDataSource
used to maintain the lock repository.id
- the client id to be associated with locks handled by the repository.- Since:
- 4.3.13
-
-
Method Details
-
setRegion
A unique grouping identifier for all locks persisted with this store. Using multiple regions allows the store to be partitioned (if necessary) for different purposes. Defaults toDEFAULT
.- Parameters:
region
- the region name to set
-
setPrefix
Specify the prefix for target database table used from queries.- Parameters:
prefix
- the prefix to set (defaultINT_
).
-
setTimeToLive
public void setTimeToLive(int timeToLive) Specify the time (in milliseconds) to expire deadlocks.- Parameters:
timeToLive
- the time to expire deadlocks.
-
setTransactionManager
Set aPlatformTransactionManager
for operations. Otherwise, a primaryPlatformTransactionManager
bean is obtained from the application context.- Parameters:
transactionManager
- thePlatformTransactionManager
to use.- Since:
- 6.0
-
setApplicationContext
- Specified by:
setApplicationContext
in interfaceApplicationContextAware
- Throws:
BeansException
-
setUpdateQuery
Set a customUPDATE
query for a lock record. ThegetUpdateQuery()
can be used as a template for customization. The default query is:UPDATE %sLOCK SET CLIENT_ID=?, CREATED_DATE=? WHERE REGION=? AND LOCK_KEY=? AND (CLIENT_ID=? OR CREATED_DATE<?)
- Parameters:
updateQuery
- the query to update a lock record.- Since:
- 6.1
- See Also:
-
getUpdateQuery
Return the current update query. Can be used in a setter as a concatenation of the default query and some extra hint.- Returns:
- the current update query.
- Since:
- 6.1
- See Also:
-
setInsertQuery
Set a customINSERT
query for a lock record. ThegetInsertQuery()
can be used as a template for customization. The default query isINSERT INTO %sLOCK (REGION, LOCK_KEY, CLIENT_ID, CREATED_DATE) VALUES (?, ?, ?, ?)
. For example a PostgreSQLON CONFLICT DO NOTHING
hint can be provided like this:lockRepository.setInsertQuery(lockRepository.getInsertQuery() + " ON CONFLICT DO NOTHING");
- Parameters:
insertQuery
- the insert query for a lock record.- Since:
- 6.1
- See Also:
-
getInsertQuery
Return the current insert query. Can be used in a setter as a concatenation of the default query and some extra hint.- Returns:
- the current insert query.
- Since:
- 6.1
- See Also:
-
setRenewQuery
Set a customINSERT
query for a lock record. ThegetRenewQuery()
can be used as a template for customization. The default query is:UPDATE %sLOCK SET CREATED_DATE=? WHERE REGION=? AND LOCK_KEY=? AND CLIENT_ID=?
- Parameters:
renewQuery
- the update query to renew a lock record.- Since:
- 6.1
- See Also:
-
getRenewQuery
Return the current renew query. Can be used in a setter as a concatenation of a default query and some extra hint.- Returns:
- the current renew query.
- Since:
- 6.1
- See Also:
-
afterPropertiesSet
public void afterPropertiesSet()- Specified by:
afterPropertiesSet
in interfaceInitializingBean
-
afterSingletonsInstantiated
public void afterSingletonsInstantiated()- Specified by:
afterSingletonsInstantiated
in interfaceSmartInitializingSingleton
-
setCheckDatabaseOnStart
public void setCheckDatabaseOnStart(boolean checkDatabaseOnStart) The flag to perform a database check query on start or not.- Parameters:
checkDatabaseOnStart
- false to not perform the database check.- Since:
- 6.2
-
isAutoStartup
public boolean isAutoStartup()- Specified by:
isAutoStartup
in interfaceSmartLifecycle
-
start
public void start() -
stop
public void stop() -
isRunning
public boolean isRunning() -
close
public void close()- Specified by:
close
in interfaceAutoCloseable
- Specified by:
close
in interfaceCloseable
- Specified by:
close
in interfaceLockRepository
-
delete
Description copied from interface:LockRepository
Remove a lock from this repository.- Specified by:
delete
in interfaceLockRepository
- Parameters:
lock
- the lock to remove.
-
acquire
Description copied from interface:LockRepository
Acquire a lock for a key.- Specified by:
acquire
in interfaceLockRepository
- Parameters:
lock
- the key for lock to acquire.- Returns:
- acquired or not.
-
isAcquired
Description copied from interface:LockRepository
Check if a lock is held by this repository.- Specified by:
isAcquired
in interfaceLockRepository
- Parameters:
lock
- the lock to check.- Returns:
- acquired or not.
-
deleteExpired
public void deleteExpired()Description copied from interface:LockRepository
Remove all the expired locks.- Specified by:
deleteExpired
in interfaceLockRepository
-
renew
Description copied from interface:LockRepository
Renew the lease for a lock.- Specified by:
renew
in interfaceLockRepository
- Parameters:
lock
- the lock to renew.- Returns:
- renewed or not.
-