[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