You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by le...@apache.org on 2009/10/22 05:19:21 UTC
svn commit: r828289 -
/ofbiz/trunk/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java
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);
}
}