Explicit notes on transaction phase processing
Issue: SPR-15323
(cherry picked from commit 8b74150)
			
			
This commit is contained in:
		
							parent
							
								
									98dbc17591
								
							
						
					
					
						commit
						227ac3faa4
					
				|  | @ -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"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with 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; | 			this.phase = phase; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		@Override | ||||||
|  | 		public int getOrder() { | ||||||
|  | 			return this.listener.getOrder(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		@Override | 		@Override | ||||||
| 		public void beforeCommit(boolean readOnly) { | 		public void beforeCommit(boolean readOnly) { | ||||||
| 			if (this.phase == TransactionPhase.BEFORE_COMMIT) { | 			if (this.phase == TransactionPhase.BEFORE_COMMIT) { | ||||||
|  | @ -107,20 +112,15 @@ class ApplicationListenerMethodTransactionalAdapter extends ApplicationListenerM | ||||||
| 
 | 
 | ||||||
| 		@Override | 		@Override | ||||||
| 		public void afterCompletion(int status) { | 		public void afterCompletion(int status) { | ||||||
| 			if (this.phase == TransactionPhase.AFTER_COMPLETION) { | 			if (this.phase == TransactionPhase.AFTER_COMMIT && status == STATUS_COMMITTED) { | ||||||
| 				processEvent(); |  | ||||||
| 			} |  | ||||||
| 			else if (this.phase == TransactionPhase.AFTER_COMMIT && status == STATUS_COMMITTED) { |  | ||||||
| 				processEvent(); | 				processEvent(); | ||||||
| 			} | 			} | ||||||
| 			else if (this.phase == TransactionPhase.AFTER_ROLLBACK && status == STATUS_ROLLED_BACK) { | 			else if (this.phase == TransactionPhase.AFTER_ROLLBACK && status == STATUS_ROLLED_BACK) { | ||||||
| 				processEvent(); | 				processEvent(); | ||||||
| 			} | 			} | ||||||
| 		} | 			else if (this.phase == TransactionPhase.AFTER_COMPLETION) { | ||||||
| 
 | 				processEvent(); | ||||||
| 		@Override | 			} | ||||||
| 		public int getOrder() { |  | ||||||
| 			return this.listener.getOrder(); |  | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		protected void processEvent() { | 		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"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with 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. |  * The phase at which a transactional event listener applies. | ||||||
|  * |  * | ||||||
|  * @author Stephane Nicoll |  * @author Stephane Nicoll | ||||||
|  |  * @author Juergen Hoeller | ||||||
|  * @since 4.2 |  * @since 4.2 | ||||||
|  * @see TransactionalEventListener |  * @see TransactionalEventListener | ||||||
|  */ |  */ | ||||||
|  | @ -33,17 +34,11 @@ public enum TransactionPhase { | ||||||
| 	 */ | 	 */ | ||||||
| 	BEFORE_COMMIT, | 	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. | 	 * 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#afterCompletion(int) | ||||||
| 	 * @see TransactionSynchronization#STATUS_COMMITTED | 	 * @see TransactionSynchronization#STATUS_COMMITTED | ||||||
| 	 */ | 	 */ | ||||||
|  | @ -51,9 +46,20 @@ public enum TransactionPhase { | ||||||
| 
 | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * Fire the event if the transaction has rolled back. | 	 * 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#afterCompletion(int) | ||||||
| 	 * @see TransactionSynchronization#STATUS_ROLLED_BACK | 	 * @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"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with 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}. |  * 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 |  * <p>If the event is not published within the boundaries of a managed transaction, the | ||||||
|  * is discarded unless the {@link #fallbackExecution} flag is explicitly set. If a |  * 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}. |  * 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 |  * <p>Adding {@link org.springframework.core.annotation.Order @Order} to your annotated | ||||||
|  * allows you to prioritize that listener amongst other listeners running in the same phase. |  * method allows you to prioritize that listener amongst other listeners running before | ||||||
|  |  * or after transaction completion. | ||||||
|  * |  * | ||||||
|  * @author Stephane Nicoll |  * @author Stephane Nicoll | ||||||
|  * @author Sam Brannen |  * @author Sam Brannen | ||||||
|  * @since 4.2 |  * @since 4.2 | ||||||
|  */ |  */ | ||||||
| @EventListener |  | ||||||
| @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) | @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) | ||||||
| @Retention(RetentionPolicy.RUNTIME) | @Retention(RetentionPolicy.RUNTIME) | ||||||
| @Documented | @Documented | ||||||
|  | @EventListener | ||||||
| public @interface TransactionalEventListener { | public @interface TransactionalEventListener { | ||||||
| 
 | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * Phase to bind the handling of an event to. | 	 * 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 | 	 * <p>If no transaction is in progress, the event is not processed at | ||||||
| 	 * all unless {@link #fallbackExecution} has been enabled explicitly. | 	 * 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 | 	 * Spring Expression Language (SpEL) attribute used for making the event | ||||||
| 	 * handling conditional. | 	 * 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 | 	 * @see EventListener#condition | ||||||
| 	 */ | 	 */ | ||||||
| 	String condition() default ""; | 	String condition() default ""; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue