A Spring Framework plugin in order to dispatch ad-hoc Spring events during a transaction lifecycle.
Current last version: 0.9.0
- Java 1.6 or higher
- Spring 3.2 or higher
Currently, the module has been tested only using Spring 3.2.2 and org.springframework.orm.jpa.JpaTransactionManager as transaction manager.
In order to dispatch ad-hoc events for tracking a transaction lifecycle, replace the Spring transaction manager with a new implementation that overrides the original transaction manager.
For now, the transaction managers supported are:
org.springframework.jdbc.datasource.DataSourceTransactionManagerorg.springframework.orm.hibernate3.HibernateTransactionManagerorg.springframework.orm.hibernate4.HibernateTransactionManagerorg.springframework.orm.jdo.JdoTransactionManagerorg.springframework.orm.jpa.JpaTransactionManagerorg.springframework.transaction.jta.JtaTransactionManager
For example this configuration:
<!-- TX Configuration -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>must be replaced by
<!-- TX Configuration -->
<bean id="transactionManager" class="it.diepet.spring.tx.lifecycle.EventDispatcherJpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>Notes that all supported transaction manager classes are subclass of org.springframework.transaction.support.AbstractPlatformTransactionManager.
An event is triggered when one of these transaction manager method terminates without runtime errors:
-
[Original Transaction Manager Class].doBegin(Object transaction, TransactionDefinition definition) -
[Original Transaction Manager Class].doCommit(DefaultTransactionStatus status) -
[Original Transaction Manager Class].doRollback(DefaultTransactionStatus status) -
[Original Transaction Manager Class].doSuspend(Object transaction) -
[Original Transaction Manager Class].doResume(Object transaction, Object suspendedResources) -
[Original Transaction Manager Class].doSetRollbackOnly(DefaultTransactionStatus status)
where [Original Transaction Manager Class] is one of the Spring transaction manager supported listed above.
All the events triggered for tracking a transaction lifecycle are subclass of
it.diepet.spring.tx.lifecycle.event.TransactionLifecycleEvent<T>
The list of events triggered is:
-
it.diepet.spring.tx.lifecycle.event.BeginEvent: when a new transaction begins. -
it.diepet.spring.tx.lifecycle.event.CommitEvent: when a transaction commits successfully. -
it.diepet.spring.tx.lifecycle.event.RollbackEvent: when a transaction is roll backed. -
it.diepet.spring.tx.lifecycle.event.SuspendEvent: when a transaction is suspended . -
it.diepet.spring.tx.lifecycle.event.ResumeEvent: when a previous suspended transaction resumes. -
it.diepet.spring.tx.lifecycle.event.SetRollbackOnlyEvent: when a transaction is set to rollback.
An error event is triggered when one of the these transaction manager method call fails for a runtime exception:
-
[Original Transaction Manager Class].doBegin(Object transaction, TransactionDefinition definition) -
[Original Transaction Manager Class].doCommit(DefaultTransactionStatus status) -
[Original Transaction Manager Class].doRollback(DefaultTransactionStatus status) -
[Original Transaction Manager Class].doSuspend(Object transaction) -
[Original Transaction Manager Class].doResume(Object transaction, Object suspendedResources) -
[Original Transaction Manager Class].doSetRollbackOnly(DefaultTransactionStatus status)
where [Original Transaction Manager Class] is one of the Spring transaction manager supported listed above.
For example, when the transaction manager tries to commit a transaction set to rollback the doCommit(...) method will throw a runtime exception.
All the error events related to a transaction lifecycle are subclass of
it.diepet.spring.tx.lifecycle.event.failure.TransactionLifecycleErrorEvent<T>
The list of possible error events triggered is:
-
it.diepet.spring.tx.lifecycle.event.failure.BeginErrorEvent -
it.diepet.spring.tx.lifecycle.event.failure.CommitErrorEvent -
it.diepet.spring.tx.lifecycle.event.failure.RollbackErrorEvent -
it.diepet.spring.tx.lifecycle.event.failure.SuspendErrorEvent -
it.diepet.spring.tx.lifecycle.event.failure.ResumeErrorEvent -
it.diepet.spring.tx.lifecycle.event.failure.SetRollbackOnlyErrorEvent
Generally, when one of these error events is triggered than the transaction will not succeed.
Following a list of events triggered by calling a transactional method f().
// Example #1
@Transactional
void f() {
}Example #1 events:
it.diepet.spring.tx.lifecycle.event.BeginEventit.diepet.spring.tx.lifecycle.event.CommitEvent
// Example #2
@Transactional
void f() {
// throws a checked exception
throw new CheckedException();
}Example #2 events:
it.diepet.spring.tx.lifecycle.event.BeginEventit.diepet.spring.tx.lifecycle.event.CommitEvent
(notes that the transaction is committed even if the method has thrown an exception)
// Example #3
@Transactional
void f() {
// throws a unchecked exception
throw new UncheckedException();
}Example #3 events:
it.diepet.spring.tx.lifecycle.event.BeginEventit.diepet.spring.tx.lifecycle.event.RollbackEvent
// Example #4
@Transactional(rollbackFor=CheckedException.class)
void f() {
// throws a checked exception
throw new CheckedException();
}Example #4 events:
it.diepet.spring.tx.lifecycle.event.BeginEventit.diepet.spring.tx.lifecycle.event.RollbackEvent
// Example #5
// Tx #1
@Transactional
void f() {
g();
}
// Tx #2
@Transactional(propagation = Propagation.REQUIRES_NEW)
void g() {
}Example #5 events:
it.diepet.spring.tx.lifecycle.event.BeginEvent(for Tx #1)it.diepet.spring.tx.lifecycle.event.SuspendEvent(for Tx #1)it.diepet.spring.tx.lifecycle.event.BeginEvent(for Tx #2)it.diepet.spring.tx.lifecycle.event.CommitEvent(for Tx #2)it.diepet.spring.tx.lifecycle.event.ResumeEvent(for Tx #1)it.diepet.spring.tx.lifecycle.event.CommitEvent(for Tx #1)
// Example #6
@Transactional
void f() {
g();
}
@Transactional(propagation = Propagation.REQUIRED)
void g() {
}Example #6 events:
it.diepet.spring.tx.lifecycle.event.BeginEventit.diepet.spring.tx.lifecycle.event.CommitEvent
// Example #7
@Transactional
void f() {
try {
g();
} catch (CheckedException e) {
// do nothing
}
}
@Transactional(propagation = Propagation.REQUIRED, rollbackFor=CheckedException.class)
void g() throws CheckedException {
throw new CheckedException();
}Example #7 events:
it.diepet.spring.tx.lifecycle.event.BeginEvent: triggered by the callingf().it.diepet.spring.tx.lifecycle.event.SetRollbackOnlyEvent: triggered becauseg()throws a checked exception instance of the exception class set into the rollbackFor attribute.it.diepet.spring.tx.lifecycle.event.failure.CommitErrorEvent: triggered becausef()tries to commit, but the transaction was set to be rollbacked by callingg().
This project is licensed under the terms of the MIT license.