[hibernate-commits] Hibernate SVN: r19201 - in search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend: impl and 1 other directory.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Fri Apr 9 11:38:15 EDT 2010


Author: epbernard
Date: 2010-04-09 11:38:14 -0400 (Fri, 09 Apr 2010)
New Revision: 19201

Modified:
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/Worker.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/EventSourceTransactionContext.java
Log:
HSEARCH-501 use BeforeTransactionCompletionProcess and AfterTransactionCompletionProcess instead of Synchronization to let exceptions go through if needed instead of swallowing.

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/Worker.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/Worker.java	2010-04-09 15:36:40 UTC (rev 19200)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/Worker.java	2010-04-09 15:38:14 UTC (rev 19201)
@@ -34,8 +34,11 @@
  * @author Emmanuel Bernard
  */
 public interface Worker {
-	//Use of EventSource since it's the common subinterface for Session and SessionImplementor
-	//the alternative would have been to do a subcasting or to retrieve 2 parameters :(
+	/**
+	 * Declare a work to be done within a given transaction context
+	 * @param work
+	 * @param transactionContext
+	 */
 	void performWork(Work work, TransactionContext transactionContext);
 
 	void initialize(Properties props, SearchFactoryImplementor searchFactoryImplementor);

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/EventSourceTransactionContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/EventSourceTransactionContext.java	2010-04-09 15:36:40 UTC (rev 19200)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/EventSourceTransactionContext.java	2010-04-09 15:38:14 UTC (rev 19201)
@@ -26,15 +26,23 @@
 
 import java.io.Serializable;
 
+import javax.transaction.Status;
 import javax.transaction.Synchronization;
 
+import org.hibernate.HibernateException;
 import org.hibernate.Transaction;
+import org.hibernate.action.AfterTransactionCompletionProcess;
+import org.hibernate.action.BeforeTransactionCompletionProcess;
+import org.hibernate.engine.ActionQueue;
+import org.hibernate.engine.SessionImplementor;
 import org.hibernate.event.EventSource;
 import org.hibernate.event.FlushEventListener;
 import org.hibernate.search.SearchException;
 import org.hibernate.search.backend.TransactionContext;
 import org.hibernate.search.event.FullTextIndexEventListener;
 import org.hibernate.search.util.LoggerFactory;
+
+import com.sun.xml.internal.ws.handler.HandlerException;
 import org.slf4j.Logger;
 
 /**
@@ -75,8 +83,12 @@
 
 	public void registerSynchronization(Synchronization synchronization) {
 		if ( isRealTransactionInProgress() ) {
-			Transaction transaction = eventSource.getTransaction();
-			transaction.registerSynchronization( synchronization );
+			//use {Before|After}TransactionCompletionProcess instead of registerTransaction because it does not
+			//swallow transactions.
+			final ActionQueue actionQueue = eventSource.getActionQueue();
+			actionQueue.registerProcess( new DelegateToSynchronizationOnBeforeTx( synchronization ) );
+			actionQueue.registerProcess( new DelegateToSynchronizationOnAfterTx( synchronization ) );
+//			eventSource.getTransaction().registerSynchronization( synchronization );
 		}
 		else {
 			//registerSynchronization is only called if isRealTransactionInProgress or if
@@ -122,5 +134,39 @@
 		}
 		return realTxInProgress;
 	}
+
+	private static class DelegateToSynchronizationOnBeforeTx implements BeforeTransactionCompletionProcess {
+		private final Synchronization synchronization;
+
+		DelegateToSynchronizationOnBeforeTx(Synchronization synchronization) {
+			this.synchronization = synchronization;
+		}
+
+		public void doBeforeTransactionCompletion(SessionImplementor sessionImplementor) {
+			try {
+				synchronization.beforeCompletion();
+			}
+			catch ( Exception e ) {
+				throw new HibernateException( "Error while indexing in Hibernate Search (before transaction completion)", e);
+			}
+		}
+	}
+
+	private static class DelegateToSynchronizationOnAfterTx implements AfterTransactionCompletionProcess {
+		private final Synchronization synchronization;
+
+		DelegateToSynchronizationOnAfterTx(Synchronization synchronization) {
+			this.synchronization = synchronization;
+		}
+
+		public void doAfterTransactionCompletion(boolean success, SessionImplementor sessionImplementor) {
+			try {
+				synchronization.afterCompletion( success ? Status.STATUS_COMMITTED : Status.STATUS_ROLLEDBACK );
+			}
+			catch ( Exception e ) {
+				throw new HibernateException( "Error while indexing in Hibernate Search (ater transaction completion)", e);
+			}
+		}
+	}
 	
 }



More information about the hibernate-commits mailing list