svn commit: r828289 - /ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r828289 - /ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java

lektran
Author: lektran
Date: Thu Oct 22 03:19:21 2009
New Revision: 828289

URL: http://svn.apache.org/viewvc?rev=828289&view=rev
Log:
When scheduling a service to be run do it within it's own transaction.  
This resolves a bug I encountered where a long running (couple of minutes) service was scheduling jobs but the poller was unable to get a lock on those JobSandbox rows which prevented the poller from queuing any jobs at all for the duration of the service.

Modified:
    ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java

Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java?rev=828289&r1=828288&r2=828289&view=diff
==============================================================================
--- ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (original)
+++ ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java Thu Oct 22 03:19:21 2009
@@ -21,10 +21,13 @@
 import java.util.Date;
 import java.util.Map;
 
+import javax.transaction.Transaction;
 import javax.transaction.xa.XAException;
 
 import org.ofbiz.service.calendar.RecurrenceRule;
 import org.ofbiz.entity.Delegator;
+import org.ofbiz.entity.transaction.GenericTransactionException;
+import org.ofbiz.entity.transaction.TransactionUtil;
 import org.ofbiz.security.Security;
 import org.ofbiz.security.authz.Authorization;
 import org.ofbiz.service.jms.JmsListenerFactory;
@@ -60,21 +63,53 @@
      * @see org.ofbiz.service.LocalDispatcher#schedule(java.lang.String, java.lang.String, java.lang.String, java.util.Map, long, int, int, int, long, int)
      */
     public void schedule(String jobName, String poolName, String serviceName, Map<String, ? extends Object> context, long startTime, int frequency, int interval, int count, long endTime, int maxRetry) throws GenericServiceException {
+        Transaction suspendedTransaction = null;
         try {
-            getJobManager().schedule(jobName, poolName, serviceName, context, startTime, frequency, interval, count, endTime, maxRetry);
-
-            if (Debug.verboseOn()) {
-                Debug.logVerbose("[LocalDispatcher.schedule] : Current time : " + (new Date()).getTime(), module);
-                Debug.logVerbose("[LocalDispatcher.schedule] : Runtime      : " + startTime, module);
-                Debug.logVerbose("[LocalDispatcher.schedule] : Frequency    : " + frequency, module);
-                Debug.logVerbose("[LocalDispatcher.schedule] : Interval     : " + interval, module);
-                Debug.logVerbose("[LocalDispatcher.schedule] : Count        : " + count, module);
-                Debug.logVerbose("[LocalDispatcher.schedule] : EndTime      : " + endTime, module);
-                Debug.logVerbose("[LocalDispatcher.schedule] : MazRetry     : " + maxRetry, module);
+            boolean beganTransaction = false;
+            suspendedTransaction = TransactionUtil.suspend();
+            try {
+                beganTransaction = TransactionUtil.begin();
+                try {
+                    getJobManager().schedule(jobName, poolName, serviceName, context, startTime, frequency, interval, count, endTime, maxRetry);
+
+                    if (Debug.verboseOn()) {
+                        Debug.logVerbose("[LocalDispatcher.schedule] : Current time : " + (new Date()).getTime(), module);
+                        Debug.logVerbose("[LocalDispatcher.schedule] : Runtime      : " + startTime, module);
+                        Debug.logVerbose("[LocalDispatcher.schedule] : Frequency    : " + frequency, module);
+                        Debug.logVerbose("[LocalDispatcher.schedule] : Interval     : " + interval, module);
+                        Debug.logVerbose("[LocalDispatcher.schedule] : Count        : " + count, module);
+                        Debug.logVerbose("[LocalDispatcher.schedule] : EndTime      : " + endTime, module);
+                        Debug.logVerbose("[LocalDispatcher.schedule] : MazRetry     : " + maxRetry, module);
+                    }
+
+                } catch (JobManagerException jme) {
+                    throw new GenericServiceException(jme.getMessage(), jme);
+                }
+            } catch (Exception e) {
+                String errMsg = "General error while scheduling job";
+                Debug.logError(e, errMsg, module);
+                try {
+                    TransactionUtil.rollback(beganTransaction, errMsg, e);
+                } catch (GenericTransactionException gte1) {
+                    Debug.logError(gte1, "Unable to rollback transaction", module);
+                }
+            } finally {
+                try {
+                    TransactionUtil.commit(beganTransaction);
+                } catch (GenericTransactionException gte2) {
+                    Debug.logError(gte2, "Unable to commit scheduled job", module);
+                }
+            }
+        } catch (GenericTransactionException gte) {
+            Debug.logError(gte, "Error suspending transaction while scheduling job", module);
+        } finally {
+            if (suspendedTransaction != null) {
+                try {
+                    TransactionUtil.resume(suspendedTransaction);
+                } catch (GenericTransactionException gte3) {
+                    Debug.logError(gte3, "Error resuming suspended transaction after scheduling job", module);
+                }
             }
-
-        } catch (JobManagerException e) {
-            throw new GenericServiceException(e.getMessage(), e);
         }
     }