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); } } |
Free forum by Nabble | Edit this page |