Explicit notes on transaction phase processing
Issue: SPR-15323
This commit is contained in:
parent
9aaed2bcef
commit
8b741508a6
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2016 the original author or authors.
|
||||
* Copyright 2002-2017 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -98,6 +98,11 @@ class ApplicationListenerMethodTransactionalAdapter extends ApplicationListenerM
|
|||
this.phase = phase;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOrder() {
|
||||
return this.listener.getOrder();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeCommit(boolean readOnly) {
|
||||
if (this.phase == TransactionPhase.BEFORE_COMMIT) {
|
||||
|
@ -107,20 +112,15 @@ class ApplicationListenerMethodTransactionalAdapter extends ApplicationListenerM
|
|||
|
||||
@Override
|
||||
public void afterCompletion(int status) {
|
||||
if (this.phase == TransactionPhase.AFTER_COMPLETION) {
|
||||
processEvent();
|
||||
}
|
||||
else if (this.phase == TransactionPhase.AFTER_COMMIT && status == STATUS_COMMITTED) {
|
||||
if (this.phase == TransactionPhase.AFTER_COMMIT && status == STATUS_COMMITTED) {
|
||||
processEvent();
|
||||
}
|
||||
else if (this.phase == TransactionPhase.AFTER_ROLLBACK && status == STATUS_ROLLED_BACK) {
|
||||
processEvent();
|
||||
}
|
||||
else if (this.phase == TransactionPhase.AFTER_COMPLETION) {
|
||||
processEvent();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOrder() {
|
||||
return this.listener.getOrder();
|
||||
}
|
||||
|
||||
protected void processEvent() {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2015 the original author or authors.
|
||||
* Copyright 2002-2017 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -22,6 +22,7 @@ import org.springframework.transaction.support.TransactionSynchronization;
|
|||
* The phase at which a transactional event listener applies.
|
||||
*
|
||||
* @author Stephane Nicoll
|
||||
* @author Juergen Hoeller
|
||||
* @since 4.2
|
||||
* @see TransactionalEventListener
|
||||
*/
|
||||
|
@ -33,17 +34,11 @@ public enum TransactionPhase {
|
|||
*/
|
||||
BEFORE_COMMIT,
|
||||
|
||||
/**
|
||||
* Fire the event after the transaction has completed. For
|
||||
* more fine-grained event, use {@link #AFTER_COMMIT} or
|
||||
* {@link #AFTER_ROLLBACK} to intercept transaction commit
|
||||
* or rollback respectively.
|
||||
* @see TransactionSynchronization#afterCompletion(int)
|
||||
*/
|
||||
AFTER_COMPLETION,
|
||||
|
||||
/**
|
||||
* Fire the event after the commit has completed successfully.
|
||||
* <p>Note: This is a specialization of {@link #AFTER_COMPLETION} and
|
||||
* therefore executes in the same after-completion sequence of events,
|
||||
* (and not in {@link TransactionSynchronization#afterCommit()}).
|
||||
* @see TransactionSynchronization#afterCompletion(int)
|
||||
* @see TransactionSynchronization#STATUS_COMMITTED
|
||||
*/
|
||||
|
@ -51,9 +46,20 @@ public enum TransactionPhase {
|
|||
|
||||
/**
|
||||
* Fire the event if the transaction has rolled back.
|
||||
* <p>Note: This is a specialization of {@link #AFTER_COMPLETION} and
|
||||
* therefore executes in the same after-completion sequence of events.
|
||||
* @see TransactionSynchronization#afterCompletion(int)
|
||||
* @see TransactionSynchronization#STATUS_ROLLED_BACK
|
||||
*/
|
||||
AFTER_ROLLBACK
|
||||
AFTER_ROLLBACK,
|
||||
|
||||
/**
|
||||
* Fire the event after the transaction has completed.
|
||||
* <p>For more fine-grained events, use {@link #AFTER_COMMIT} or
|
||||
* {@link #AFTER_ROLLBACK} to intercept transaction commit
|
||||
* or rollback, respectively.
|
||||
* @see TransactionSynchronization#afterCompletion(int)
|
||||
*/
|
||||
AFTER_COMPLETION
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2015 the original author or authors.
|
||||
* Copyright 2002-2017 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -28,25 +28,27 @@ import org.springframework.core.annotation.AliasFor;
|
|||
/**
|
||||
* An {@link EventListener} that is invoked according to a {@link TransactionPhase}.
|
||||
*
|
||||
* <p>If the event is not published within the boundaries of a managed transaction, the event
|
||||
* is discarded unless the {@link #fallbackExecution} flag is explicitly set. If a
|
||||
* <p>If the event is not published within the boundaries of a managed transaction, the
|
||||
* event is discarded unless the {@link #fallbackExecution} flag is explicitly set. If a
|
||||
* transaction is running, the event is processed according to its {@code TransactionPhase}.
|
||||
*
|
||||
* <p>Adding {@link org.springframework.core.annotation.Order @Order} on your annotated method
|
||||
* allows you to prioritize that listener amongst other listeners running in the same phase.
|
||||
* <p>Adding {@link org.springframework.core.annotation.Order @Order} to your annotated
|
||||
* method allows you to prioritize that listener amongst other listeners running before
|
||||
* or after transaction completion.
|
||||
*
|
||||
* @author Stephane Nicoll
|
||||
* @author Sam Brannen
|
||||
* @since 4.2
|
||||
*/
|
||||
@EventListener
|
||||
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
@EventListener
|
||||
public @interface TransactionalEventListener {
|
||||
|
||||
/**
|
||||
* Phase to bind the handling of an event to.
|
||||
* <p>The default phase is {@link TransactionPhase#AFTER_COMMIT}.
|
||||
* <p>If no transaction is in progress, the event is not processed at
|
||||
* all unless {@link #fallbackExecution} has been enabled explicitly.
|
||||
*/
|
||||
|
@ -76,7 +78,7 @@ public @interface TransactionalEventListener {
|
|||
/**
|
||||
* Spring Expression Language (SpEL) attribute used for making the event
|
||||
* handling conditional.
|
||||
* <p>Default is {@code ""}, meaning the event is always handled.
|
||||
* <p>The default is {@code ""}, meaning the event is always handled.
|
||||
* @see EventListener#condition
|
||||
*/
|
||||
String condition() default "";
|
||||
|
|
Loading…
Reference in New Issue