@Target(value={METHOD,ANNOTATION_TYPE}) @Retention(value=RUNTIME) @Documented @EventListener public @interface TransactionalEventListener
EventListener
that is invoked according to a TransactionPhase
.
If the event is not published within an active transaction, the event is discarded
unless the fallbackExecution()
flag is explicitly set. If a transaction is
running, the event is handled according to its TransactionPhase
.
Adding @Order
to your annotated
method allows you to prioritize that listener amongst other listeners running before
or after transaction completion.
NOTE: Transactional event listeners only work with thread-bound transactions
managed by a PlatformTransactionManager
. A reactive transaction managed by a
ReactiveTransactionManager
uses the Reactor context instead of thread-local variables, so from the perspective of
an event listener, there is no compatible active transaction that it can participate in.
WARNING: if the TransactionPhase
is set to
AFTER_COMMIT
(the default),
AFTER_ROLLBACK
, or
AFTER_COMPLETION
, the transaction will
have been committed or rolled back already, but the transactional resources might
still be active and accessible. As a consequence, any data access code triggered
at this point will still "participate" in the original transaction, but changes
will not be committed to the transactional resource. See
TransactionSynchronization.afterCompletion(int)
for details.
Modifier and Type | Optional Element and Description |
---|---|
Class<?>[] |
classes
The event classes that this listener handles.
|
String |
condition
Spring Expression Language (SpEL) attribute used for making the event
handling conditional.
|
boolean |
fallbackExecution
Whether the event should be handled if no transaction is running.
|
TransactionPhase |
phase
Phase to bind the handling of an event to.
|
Class<?>[] |
value
Alias for
classes() . |
public abstract TransactionPhase phase
The default phase is TransactionPhase.AFTER_COMMIT
.
If no transaction is in progress, the event is not processed at
all unless fallbackExecution()
has been enabled explicitly.
public abstract boolean fallbackExecution
@AliasFor(annotation=EventListener.class, attribute="classes") public abstract Class<?>[] value
classes()
.@AliasFor(annotation=EventListener.class, attribute="classes") public abstract Class<?>[] classes
If this attribute is specified with a single value, the annotated method may optionally accept a single parameter. However, if this attribute is specified with multiple values, the annotated method must not declare any parameters.
public abstract String condition
The default is ""
, meaning the event is always handled.
EventListener.condition()