Allow tasklets to run without transaction synchronization - #5479
Open
n-dlms wants to merge 1 commit into
Open
Conversation
Register the chunk transaction synchronization callback only when transaction synchronization is active. When a transaction manager is configured with SYNCHRONIZATION_NEVER or SYNCHRONIZATION_ON_ACTUAL_TRANSACTION without an actual transaction, registerSynchronization used to throw an IllegalStateException which failed the step. In that case the afterCompletion callback is never invoked, so the step execution lock must be released after the transaction completes, otherwise repeating tasklets would hang. Closes spring-projectsgh-4912 Signed-off-by: Ntokozo Dlamini <ntokozo.dlamini.xyz@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Resolves gh-4912
Summary
TaskletStep$ChunkTransactionCallback.doInTransactioncalledTransactionSynchronizationManager.registerSynchronization(this)unconditionally. When the configured transaction manager does not
activate transaction synchronization (e.g.
SYNCHRONIZATION_NEVER, orSYNCHRONIZATION_ON_ACTUAL_TRANSACTIONwithout an actualtransaction), this throws
IllegalStateException: Transaction synchronization is not activeand fails the step.This PR:
TransactionSynchronizationManager.isSynchronizationActive().when the
afterCompletioncallback can never fire. Without this, arepeating tasklet would hang on the next chunk because the lock is
only released in
afterCompletion.Tests
testTaskletRunsWithoutTransactionSynchronization: a tasklet stepcompletes with a transaction manager configured with
SYNCHRONIZATION_NEVER.testTaskletRepeatsWithoutTransactionSynchronization: aCONTINUABLEtasklet runs to completion in the same configuration(guards against the lock-release hang).