You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by mr...@apache.org on 2008/08/20 02:19:00 UTC

svn commit: r687205 - in /ode/branches/APACHE_ODE_1.X: bpel-runtime/src/main/java/org/apache/ode/bpel/engine/ scheduler-simple/src/main/java/org/apache/ode/scheduler/simple/ scheduler-simple/src/test/java/org/apache/ode/scheduler/simple/

Author: mriou
Date: Tue Aug 19 17:18:59 2008
New Revision: 687205

URL: http://svn.apache.org/viewvc?rev=687205&view=rev
Log:
Keep retrying instead of creating bad-job-XXX.ser

Modified:
    ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelEngineImpl.java
    ode/branches/APACHE_ODE_1.X/scheduler-simple/src/main/java/org/apache/ode/scheduler/simple/SimpleScheduler.java
    ode/branches/APACHE_ODE_1.X/scheduler-simple/src/test/java/org/apache/ode/scheduler/simple/RetriesTest.java

Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelEngineImpl.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelEngineImpl.java?rev=687205&r1=687204&r2=687205&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelEngineImpl.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelEngineImpl.java Tue Aug 19 17:18:59 2008
@@ -287,7 +287,6 @@
         // ALSO we have to release the lock obtained above (IMPORTANT), lest the whole system come
         // to a grinding halt.
         try {
-
             BpelProcess process;
             if (we.getProcessId() != null) {
                 process = _activeProcesses.get(we.getProcessId());
@@ -347,50 +346,8 @@
     }
 
     private boolean checkRetry(final JobInfo jobInfo, Throwable t) {
-        // TODO, better handling of failed jobs (put them in the DB perhaps?)
-        if (jobInfo.retryCount < MAX_RETRIES)
-            return true;
-
-        __log.error("Job could not be completed after " + MAX_RETRIES + ": " + jobInfo, t);
-
-        boolean saveToDisk = false;
-        if (jobInfo.jobDetail.get("final") == null) {
-            __log.error("Rescheduling problematic job for a bit later: " + jobInfo, t);
-
-            try {
-                if (jobInfo.jobDetail.get("inmem") != null)
-                    _contexts.scheduler.scheduleVolatileJob(true, jobInfo.jobDetail);
-                else
-                    _contexts.scheduler.execIsolatedTransaction(new Callable<Void>() {
-                        public Void call() throws Exception {
-                            jobInfo.jobDetail.put("final", true);
-                            _contexts.scheduler.schedulePersistedJob(jobInfo.jobDetail,
-                                    new Date(System.currentTimeMillis() + 60 * 1000));
-                            return null;
-                        }
-                    });
-            } catch (Exception ex) {
-                __log.error("Error rescheduling problematic job: " + jobInfo,ex);
-                saveToDisk = true;
-            }
-        } else {
-            saveToDisk = true;
-        }
-
-        if (saveToDisk)
-            try {
-                File f = File.createTempFile("ode-bad-job", ".ser", new File(""));
-                ObjectOutputStream fos = new ObjectOutputStream(new FileOutputStream(f));
-                fos.writeObject(jobInfo);
-                fos.close();
-                __log.error("Saved problematic job to disk (last resort): " + jobInfo +" in file " + f);
-            } catch (Exception ex) {
-                __log.error("Could not save bad job; it will be lost: " + jobInfo, ex);
-            }
-
-
-        // No more retries.
-        return false;
+        __log.error("Job could not be completed after " + jobInfo.retryCount + " retries: " + jobInfo, t);
+        return jobInfo.jobDetail.get("inmem") == null;
     }
 
     /**

Modified: ode/branches/APACHE_ODE_1.X/scheduler-simple/src/main/java/org/apache/ode/scheduler/simple/SimpleScheduler.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/scheduler-simple/src/main/java/org/apache/ode/scheduler/simple/SimpleScheduler.java?rev=687205&r1=687204&r2=687205&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/scheduler-simple/src/main/java/org/apache/ode/scheduler/simple/SimpleScheduler.java (original)
+++ ode/branches/APACHE_ODE_1.X/scheduler-simple/src/main/java/org/apache/ode/scheduler/simple/SimpleScheduler.java Tue Aug 19 17:18:59 2008
@@ -354,12 +354,10 @@
                         // it the synchronization is a best-effort but not perfect.
                         __log.debug("job no longer in db forced rollback.");
                     } catch (JobProcessorException jpe) {
-                        if (jpe.retry) {
-                            __log.error("Error while processing transaction, retrying.", jpe);
-                            doRetry(job);
-                        } else {
+                        if (jpe.retry)
+                            __log.error("Error while processing transaction, retrying in " + doRetry(job) + "s");
+                        else
                             __log.error("Error while processing transaction, no retry.", jpe);
-                        }
                     } catch (Exception ex) {
                         __log.error("Error while executing transaction", ex);
                     }
@@ -508,12 +506,15 @@
 
     }
 
-    private void doRetry(Job job) throws DatabaseException {
-        Calendar retryTime = Calendar.getInstance();
-        retryTime.add(Calendar.SECOND, 2);
-        job.detail.put("retry", job.detail.get("retry") != null ? (((Integer)job.detail.get("retry")) + 1) : 1);
-        Job jobRetry = new Job(retryTime.getTime().getTime(), true, job.detail);
+    private long doRetry(Job job) throws DatabaseException {
+        int retry = job.detail.get("retry") != null ? (((Integer)job.detail.get("retry")) + 1) : 0;
+        job.detail.put("retry", retry);
+        long delay = (long)(Math.pow(5, retry));
+        // Don't want to go further than a day
+        if (delay > 24*60*60) delay = 24*60*60;
+        Job jobRetry = new Job(System.currentTimeMillis() + delay*1000, true, job.detail);
         _db.insertJob(jobRetry, _nodeId, false);
+        return delay;
     }
 
     private abstract class SchedulerTask extends Task implements Runnable {

Modified: ode/branches/APACHE_ODE_1.X/scheduler-simple/src/test/java/org/apache/ode/scheduler/simple/RetriesTest.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/scheduler-simple/src/test/java/org/apache/ode/scheduler/simple/RetriesTest.java?rev=687205&r1=687204&r2=687205&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/scheduler-simple/src/test/java/org/apache/ode/scheduler/simple/RetriesTest.java (original)
+++ ode/branches/APACHE_ODE_1.X/scheduler-simple/src/test/java/org/apache/ode/scheduler/simple/RetriesTest.java Tue Aug 19 17:18:59 2008
@@ -44,14 +44,14 @@
             _txm.commit();
         }
 
-        Thread.sleep(5000);
+        Thread.sleep(10000);
         assertEquals(3, _tried);
     }
 
 
     public void onScheduledJob(Scheduler.JobInfo jobInfo) throws Scheduler.JobProcessorException {
         _tried++;
-        throw new Scheduler.JobProcessorException(jobInfo.retryCount < 2);
+        throw new Scheduler.JobProcessorException(jobInfo.retryCount < 3);
     }
 
     Map<String, Object> newDetail(String x) {