Package org.alfresco.repo.transaction
Class RetryingTransactionHelper
java.lang.Object
org.alfresco.repo.transaction.RetryingTransactionHelper
A helper that runs a unit of work inside a UserTransaction,
transparently retrying the unit of work if the cause of
failure is an optimistic locking or deadlock condition.
Defaults:
- maxRetries: 20
- minRetryWaitMs: 100
- maxRetryWaitMs: 2000
- retryWaitIncrementMs: 100
To get details of 'why' transactions are retried use the following log level:
Summary: log4j.logger.org.alfresco.repo.transaction.RetryingTransactionHelper=INFO
Details: log4j.logger.org.alfresco.repo.transaction.RetryingTransactionHelper=DEBUG
- Author:
- Derek Hulley
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic interfaceCallback interface -
Field Summary
Fields -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescription<R> RExecute a callback in a transaction until it succeeds, fails because of an error not the result of an optimistic locking failure, or a deadlock loser failure, or until a maximum number of retries have been attempted.<R> RdoInTransaction(RetryingTransactionHelper.RetryingTransactionCallback<R> cb, boolean readOnly) Execute a callback in a transaction until it succeeds, fails because of an error not the result of an optimistic locking failure, or a deadlock loser failure, or until a maximum number of retries have been attempted.<R> RdoInTransaction(RetryingTransactionHelper.RetryingTransactionCallback<R> cb, boolean readOnly, boolean requiresNew) Execute a callback in a transaction until it succeeds, fails because of an error not the result of an optimistic locking failure, or a deadlock loser failure, or until a maximum number of retries have been attempted.static ThrowableextractRetryCause(Throwable cause) Sometimes, the exception means retry and sometimes not.static jakarta.transaction.UserTransactionUtility method to get the active transaction.voidsetExtraExceptions(List<Class<?>> extraExceptions) Set the list of extra exceptions that should be retriedvoidsetForceWritable(boolean forceWritable) Override to allow the transactions to be writable regardless of the system read-only mode.voidsetMaxExecutionMs(long maxExecutionMs) voidsetMaxRetries(int maxRetries) Set the maximimum number of retries. -1 for infinity.voidsetMaxRetryWaitMs(int maxRetryWaitMs) voidsetMinRetryWaitMs(int minRetryWaitMs) voidsetReadOnly(boolean readOnly) Set whether this helper only supports read transactions.voidsetRetryWaitIncrementMs(int retryWaitIncrementMs) voidsetTransactionService(TransactionService service) Set the TransactionService.
-
Field Details
-
RETRY_EXCEPTIONS
Exceptions that trigger retries.
-
-
Constructor Details
-
RetryingTransactionHelper
public RetryingTransactionHelper()Default constructor.
-
-
Method Details
-
setTransactionService
Set the TransactionService. -
setMaxRetries
public void setMaxRetries(int maxRetries) Set the maximimum number of retries. -1 for infinity. -
setMinRetryWaitMs
public void setMinRetryWaitMs(int minRetryWaitMs) -
setMaxRetryWaitMs
public void setMaxRetryWaitMs(int maxRetryWaitMs) -
setRetryWaitIncrementMs
public void setRetryWaitIncrementMs(int retryWaitIncrementMs) -
setMaxExecutionMs
public void setMaxExecutionMs(long maxExecutionMs) -
setReadOnly
public void setReadOnly(boolean readOnly) Set whether this helper only supports read transactions. -
setForceWritable
public void setForceWritable(boolean forceWritable) Override to allow the transactions to be writable regardless of the system read-only mode. NOTE: This method may not be used to circumvent the Alfresco License policy.- Parameters:
forceWritable- true to force transactions to be writable regardless of system read-only mode
-
setExtraExceptions
Set the list of extra exceptions that should be retried -
doInTransaction
Execute a callback in a transaction until it succeeds, fails because of an error not the result of an optimistic locking failure, or a deadlock loser failure, or until a maximum number of retries have been attempted.If there is already an active transaction, then the callback is merely executed and any retry logic is left to the caller. The transaction will attempt to be read-write.
- Parameters:
cb- The callback containing the unit of work.- Returns:
- Returns the result of the unit of work.
- Throws:
RuntimeException- all checked exceptions are converted
-
doInTransaction
public <R> R doInTransaction(RetryingTransactionHelper.RetryingTransactionCallback<R> cb, boolean readOnly) Execute a callback in a transaction until it succeeds, fails because of an error not the result of an optimistic locking failure, or a deadlock loser failure, or until a maximum number of retries have been attempted.If there is already an active transaction, then the callback is merely executed and any retry logic is left to the caller.
- Parameters:
cb- The callback containing the unit of work.readOnly- Whether this is a read only transaction.- Returns:
- Returns the result of the unit of work.
- Throws:
RuntimeException- all checked exceptions are converted
-
doInTransaction
public <R> R doInTransaction(RetryingTransactionHelper.RetryingTransactionCallback<R> cb, boolean readOnly, boolean requiresNew) Execute a callback in a transaction until it succeeds, fails because of an error not the result of an optimistic locking failure, or a deadlock loser failure, or until a maximum number of retries have been attempted.It is possible to force a new transaction to be created or to partake in any existing transaction.
- Parameters:
cb- The callback containing the unit of work.readOnly- Whether this is a read only transaction.requiresNew- true to force a new transaction or false to partake in any existing transaction.- Returns:
- Returns the result of the unit of work.
- Throws:
RuntimeException- all checked exceptions are converted
-
extractRetryCause
Sometimes, the exception means retry and sometimes not. The stack of exceptions is also checked for any occurence ofDoNotRetryExceptionand, if found, nothing is returned.- Parameters:
cause- the cause to examine- Returns:
- Returns the original cause if it is a valid retry cause, otherwise null
-
getActiveUserTransaction
public static jakarta.transaction.UserTransaction getActiveUserTransaction()Utility method to get the active transaction. The transaction status can be queried and marked for rollback.NOTE: Any attempt to actually commit or rollback the transaction will cause failures.
- Returns:
- Returns the currently active user transaction or null if there isn't one.
-