You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by jo...@apache.org on 2007/09/11 10:52:18 UTC

svn commit: r574514 - in /ofbiz/trunk/framework: entity/src/org/ofbiz/entity/transaction/TransactionUtil.java service/servicedef/services_test_se.xml service/src/org/ofbiz/service/ServiceDispatcher.java

Author: jonesde
Date: Tue Sep 11 01:52:18 2007
New Revision: 574514

URL: http://svn.apache.org/viewvc?rev=574514&view=rev
Log:
Fixed problem with service engine and TransactionUtil where if rollback only was set in a service it could not run sub-services even in their own transaction; the test case for this now passes with no problems

Modified:
    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/transaction/TransactionUtil.java
    ofbiz/trunk/framework/service/servicedef/services_test_se.xml
    ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceDispatcher.java

Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/transaction/TransactionUtil.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/transaction/TransactionUtil.java?rev=574514&r1=574513&r2=574514&view=diff
==============================================================================
--- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/transaction/TransactionUtil.java (original)
+++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/transaction/TransactionUtil.java Tue Sep 11 01:52:18 2007
@@ -146,6 +146,10 @@
             return STATUS_NO_TRANSACTION;
         }
     }
+    
+    public static String getStatusString() throws GenericTransactionException {
+        return getTransactionStateString(getStatus());
+    }
 
     public static boolean isTransactionInPlace() throws GenericTransactionException {
         int status = getStatus();
@@ -311,7 +315,7 @@
 
     public static Transaction suspend() throws GenericTransactionException {
         try {
-            if (TransactionUtil.getStatus() == TransactionUtil.STATUS_ACTIVE) {
+            if (TransactionUtil.getStatus() != TransactionUtil.STATUS_NO_TRANSACTION) {
                 TransactionManager txMgr = TransactionFactory.getTransactionManager();
                 if (txMgr != null) {
                     pushTransactionBeginStackSave(clearTransactionBeginStack());
@@ -323,7 +327,7 @@
                     return null;
                 }
             } else {
-                Debug.logWarning("No transaction active, so not suspending.", module);
+                Debug.logWarning("No transaction in place, so not suspending.", module);
                 return null;
             }
         } catch (SystemException e) {
@@ -409,6 +413,19 @@
     }
 
     public static String getTransactionStateString(int state) {
+        /*
+         * javax.transaction.Status
+         * STATUS_ACTIVE           0
+         * STATUS_MARKED_ROLLBACK  1
+         * STATUS_PREPARED         2
+         * STATUS_COMMITTED        3
+         * STATUS_ROLLEDBACK       4
+         * STATUS_UNKNOWN          5        
+         * STATUS_NO_TRANSACTION   6
+         * STATUS_PREPARING        7
+         * STATUS_COMMITTING       8
+         * STATUS_ROLLING_BACK     9
+         */
         switch (state) {
             case Status.STATUS_ACTIVE:
                 return "Transaction Active (" + state + ")";

Modified: ofbiz/trunk/framework/service/servicedef/services_test_se.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/servicedef/services_test_se.xml?rev=574514&r1=574513&r2=574514&view=diff
==============================================================================
--- ofbiz/trunk/framework/service/servicedef/services_test_se.xml (original)
+++ ofbiz/trunk/framework/service/servicedef/services_test_se.xml Tue Sep 11 01:52:18 2007
@@ -32,7 +32,7 @@
     <service name="testServiceDeadLockRetryThreadA" engine="java" auth="false" transaction-timeout="10"
         location="org.ofbiz.service.test.ServiceEngineTestServices" invoke="testServiceDeadLockRetryThreadA">
     </service>
-    <service name="testServiceDeadLockRetryThreadB" engine="java" auth="false" transaction-timeout="4"
+    <service name="testServiceDeadLockRetryThreadB" engine="java" auth="false" transaction-timeout="10"
         location="org.ofbiz.service.test.ServiceEngineTestServices" invoke="testServiceDeadLockRetryThreadB">
     </service>
     

Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceDispatcher.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceDispatcher.java?rev=574514&r1=574513&r2=574514&view=diff
==============================================================================
--- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceDispatcher.java (original)
+++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceDispatcher.java Tue Sep 11 01:52:18 2007
@@ -22,20 +22,20 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+
 import javax.transaction.Transaction;
 
 import javolution.util.FastList;
 import javolution.util.FastMap;
-import org.apache.commons.collections.map.LRUMap;
-import org.w3c.dom.Element;
 
+import org.apache.commons.collections.map.LRUMap;
 import org.ofbiz.base.config.GenericConfigException;
 import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.GeneralRuntimeException;
 import org.ofbiz.base.util.UtilMisc;
 import org.ofbiz.base.util.UtilTimer;
 import org.ofbiz.base.util.UtilValidate;
 import org.ofbiz.base.util.UtilXml;
-import org.ofbiz.base.util.GeneralRuntimeException;
 import org.ofbiz.entity.GenericDelegator;
 import org.ofbiz.entity.GenericEntityException;
 import org.ofbiz.entity.GenericValue;
@@ -53,6 +53,7 @@
 import org.ofbiz.service.jms.JmsListenerFactory;
 import org.ofbiz.service.job.JobManager;
 import org.ofbiz.service.job.JobManagerException;
+import org.w3c.dom.Element;
 
 /**
  * Global Service Dispatcher
@@ -277,11 +278,17 @@
         boolean beganTrans = false;
         try {
             if (modelService.useTransaction) {
-                beganTrans = TransactionUtil.begin(modelService.transactionTimeout);
-                // isolate the transaction if defined
-                if (modelService.requireNewTransaction && !beganTrans) {
-                    parentTransaction = TransactionUtil.suspend();
-                    // now start a new transaction
+                if (TransactionUtil.isTransactionInPlace()) {
+                    // if a new transaction is needed, do it here; if not do nothing, just use current tx
+                    if (modelService.requireNewTransaction) {
+                        parentTransaction = TransactionUtil.suspend();
+                        if (TransactionUtil.isTransactionInPlace()) {
+                            throw new GenericTransactionException("In service " + modelService.name + " transaction is still in place after suspend, status is " + TransactionUtil.getStatusString());
+                        }
+                        // now start a new transaction
+                        beganTrans = TransactionUtil.begin(modelService.transactionTimeout);
+                    }
+                } else {
                     beganTrans = TransactionUtil.begin(modelService.transactionTimeout);
                 }
                 // enlist for XAResource debugging
@@ -481,7 +488,7 @@
             } finally {
                 // if there was an error, rollback transaction, otherwise commit
                 if (isError) {
-                    String errMsg = "Error is Service [" + modelService.name + "]: " + ServiceUtil.getErrorMessage(result);
+                    String errMsg = "Error in Service [" + modelService.name + "]: " + ServiceUtil.getErrorMessage(result);
                     Debug.logError(errMsg, module);
                     
                     // rollback the transaction
@@ -585,11 +592,14 @@
 
         try {
             if (service.useTransaction) {
-                beganTrans = TransactionUtil.begin(service.transactionTimeout);
-                // isolate the transaction if defined
-                if (service.requireNewTransaction && !beganTrans) {
-                    parentTransaction = TransactionUtil.suspend();
-                    // now start a new transaction
+                if (TransactionUtil.isTransactionInPlace()) {
+                    // if a new transaction is needed, do it here; if not do nothing, just use current tx
+                    if (service.requireNewTransaction) {
+                        parentTransaction = TransactionUtil.suspend();
+                        // now start a new transaction
+                        beganTrans = TransactionUtil.begin(service.transactionTimeout);
+                    }
+                } else {
                     beganTrans = TransactionUtil.begin(service.transactionTimeout);
                 }
                 // enlist for XAResource debugging