Author: jacopoc
Date: Tue Jun 26 14:52:06 2012
New Revision: 1354041

URL: http://svn.apache.org/viewvc?rev=1354041&view=rev
Log:
Added new field "Current Retry Count" and logic to keep track of failed job 
executions; before this enhancement the check against maxRetry was done 
querying failed records and the approach had performance issues and could be 
unreliable because failed records can be purged. However the old mechanism is 
still used when the new field is not set for backward compatibility.

Modified:
    ofbiz/trunk/framework/service/entitydef/entitymodel.xml
    ofbiz/trunk/framework/service/src/org/ofbiz/service/job/JobManager.java
    
ofbiz/trunk/framework/service/src/org/ofbiz/service/job/PersistedServiceJob.java

Modified: ofbiz/trunk/framework/service/entitydef/entitymodel.xml
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/entitydef/entitymodel.xml?rev=1354041&r1=1354040&r2=1354041&view=diff
==============================================================================
--- ofbiz/trunk/framework/service/entitydef/entitymodel.xml (original)
+++ ofbiz/trunk/framework/service/entitydef/entitymodel.xml Tue Jun 26 14:52:06 
2012
@@ -51,6 +51,7 @@ under the License.
         <field name="serviceName" type="name"></field>
         <field name="loaderName" type="name"></field>
         <field name="maxRetry" type="numeric"></field>
+        <field name="currentRetryCount" type="numeric"></field>
         <field name="authUserLoginId" type="id-vlong"></field>
         <field name="runAsUser" type="id-vlong"></field>
         <field name="runtimeDataId" type="id"></field>

Modified: 
ofbiz/trunk/framework/service/src/org/ofbiz/service/job/JobManager.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/job/JobManager.java?rev=1354041&r1=1354040&r2=1354041&view=diff
==============================================================================
--- ofbiz/trunk/framework/service/src/org/ofbiz/service/job/JobManager.java 
(original)
+++ ofbiz/trunk/framework/service/src/org/ofbiz/service/job/JobManager.java Tue 
Jun 26 14:52:06 2012
@@ -410,6 +410,7 @@ public class JobManager {
 
         // set the max retry
         jFields.put("maxRetry", Long.valueOf(maxRetry));
+        jFields.put("currentRetryCount", new Long(0));
 
         // create the value and store
         GenericValue jobV;

Modified: 
ofbiz/trunk/framework/service/src/org/ofbiz/service/job/PersistedServiceJob.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/job/PersistedServiceJob.java?rev=1354041&r1=1354040&r2=1354041&view=diff
==============================================================================
--- 
ofbiz/trunk/framework/service/src/org/ofbiz/service/job/PersistedServiceJob.java
 (original)
+++ 
ofbiz/trunk/framework/service/src/org/ofbiz/service/job/PersistedServiceJob.java
 Tue Jun 26 14:52:06 2012
@@ -63,6 +63,7 @@ public class PersistedServiceJob extends
     private Timestamp storedDate = null;
     private long nextRecurrence = -1;
     private long maxRetry = -1;
+    private long currentRetryCount = 0;
     private boolean warningLogged = false;
 
     /**
@@ -79,7 +80,14 @@ public class PersistedServiceJob extends
         this.storedDate = jobValue.getTimestamp("runTime");
         this.runtime = storedDate.getTime();
         this.maxRetry = jobValue.get("maxRetry") != null ? 
jobValue.getLong("maxRetry").longValue() : -1;
-        
+        Long retryCount = jobValue.getLong("currentRetryCount");
+        if (retryCount != null) {
+            this.currentRetryCount = retryCount.longValue();
+        } else {
+            // backward compatibility
+            this.currentRetryCount = PersistedServiceJob.getRetries(jobValue, 
this.delegator);
+        }
+
         // Debug.logInfo("=============== New PersistedServiceJob, delegator 
from dctx is [" + dctx.getDelegator().getDelegatorName() + "] and delegator 
from jobValue is [" + jobValue.getDelegator().getDelegatorName() + "]", module);
     }
 
@@ -173,7 +181,7 @@ public class PersistedServiceJob extends
                 }
                 Calendar next = expr.next(Calendar.getInstance());
                 if (next != null) {
-                    createRecurrence(job, next.getTimeInMillis());
+                    createRecurrence(job, next.getTimeInMillis(), false);
                 }
             }
         } catch (GenericEntityException e) {
@@ -182,7 +190,7 @@ public class PersistedServiceJob extends
         if (Debug.infoOn()) Debug.logInfo("Job  [" + getJobName() + "] Id ["  
+ getJobId() + "] -- Next runtime: " + new Date(nextRecurrence), module);
     }
 
-    private void createRecurrence(GenericValue job, long next) throws 
GenericEntityException {
+    private void createRecurrence(GenericValue job, long next, boolean 
isRetryOnFailure) throws GenericEntityException {
         if (Debug.verboseOn()) Debug.logVerbose("Next runtime returned: " + 
next, module);
 
         if (next > runtime) {
@@ -198,6 +206,11 @@ public class PersistedServiceJob extends
             newJob.set("startDateTime", null);
             newJob.set("runByInstanceId", null);
             newJob.set("runTime", new java.sql.Timestamp(next));
+            if (isRetryOnFailure) {
+                newJob.set("currentRetryCount", new Long(currentRetryCount + 
1));
+            } else {
+                newJob.set("currentRetryCount", new Long(0));
+            }
             nextRecurrence = next;
             delegator.createSetNextSeqId(newJob);
             if (Debug.verboseOn()) Debug.logVerbose("Created next job entry: " 
+ newJob, module);
@@ -251,7 +264,7 @@ public class PersistedServiceJob extends
                 cal.add(Calendar.MINUTE, 
ServiceConfigUtil.getFailedRetryMin());
                 long next = cal.getTimeInMillis();
                 try {
-                    createRecurrence(job, next);
+                    createRecurrence(job, next, true);
                 } catch (GenericEntityException gee) {
                     Debug.logError(gee, "ERROR: Unable to re-schedule job [" + 
getJobId() + "] to re-run : " + job, module);
                 }
@@ -339,8 +352,7 @@ public class PersistedServiceJob extends
     }
 
     // returns the number of current retries
-    private long getRetries() throws InvalidJobException {
-        GenericValue job = this.getJob();
+    private static long getRetries(GenericValue job, Delegator delegator) {
         String pJobId = job.getString("parentJobId");
         if (pJobId == null) {
             return 0;
@@ -361,9 +373,6 @@ public class PersistedServiceJob extends
         if (maxRetry == -1) {
             return true;
         }
-        if (this.getRetries() < maxRetry) {
-            return true;
-        }
-        return false;
+        return currentRetryCount < maxRetry;
     }
 }


Reply via email to