[jboss-svn-commits] JBL Code SVN: r31283 - in labs/jbossesb/branches/JBESB_4_7_CP/product/services/jbpm/src/main/java/org/jboss/soa/esb/services/jbpm/integration: job and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Jan 28 10:54:53 EST 2010


Author: kevin.conner at jboss.com
Date: 2010-01-28 10:54:53 -0500 (Thu, 28 Jan 2010)
New Revision: 31283

Modified:
   labs/jbossesb/branches/JBESB_4_7_CP/product/services/jbpm/src/main/java/org/jboss/soa/esb/services/jbpm/integration/command/JobListener.java
   labs/jbossesb/branches/JBESB_4_7_CP/product/services/jbpm/src/main/java/org/jboss/soa/esb/services/jbpm/integration/job/ExecuteJobCommand.java
   labs/jbossesb/branches/JBESB_4_7_CP/product/services/jbpm/src/main/java/org/jboss/soa/esb/services/jbpm/integration/job/ExecuteTimerCommand.java
Log:
Catch job processing exceptions and rollback: JBESB-3159

Modified: labs/jbossesb/branches/JBESB_4_7_CP/product/services/jbpm/src/main/java/org/jboss/soa/esb/services/jbpm/integration/command/JobListener.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_7_CP/product/services/jbpm/src/main/java/org/jboss/soa/esb/services/jbpm/integration/command/JobListener.java	2010-01-28 15:48:29 UTC (rev 31282)
+++ labs/jbossesb/branches/JBESB_4_7_CP/product/services/jbpm/src/main/java/org/jboss/soa/esb/services/jbpm/integration/command/JobListener.java	2010-01-28 15:54:53 UTC (rev 31283)
@@ -33,14 +33,14 @@
             if (log.isDebugEnabled()) {
                 log.debug("retrieved jobId '"+jobId+"' via jms message");
             }
-            command = new ExecuteJobCommand(jobId.longValue());
+            command = new ExecuteJobCommand(jobId.longValue(), message.getJMSRedelivered());
         } else {
             Long timerId = (Long) message.getObjectProperty("timerId");
             if (timerId != null) {
                 if (log.isDebugEnabled()) {
                     log.debug("retrieved timerId '"+timerId+"' via jms message");
                 }
-                command = new ExecuteTimerCommand(timerId.longValue());
+                command = new ExecuteTimerCommand(timerId.longValue(), message.getJMSRedelivered());
             } else {
                 log.warn("ignoring message '"+message+"' cause it doesn't have property jobId");
             }

Modified: labs/jbossesb/branches/JBESB_4_7_CP/product/services/jbpm/src/main/java/org/jboss/soa/esb/services/jbpm/integration/job/ExecuteJobCommand.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_7_CP/product/services/jbpm/src/main/java/org/jboss/soa/esb/services/jbpm/integration/job/ExecuteJobCommand.java	2010-01-28 15:48:29 UTC (rev 31282)
+++ labs/jbossesb/branches/JBESB_4_7_CP/product/services/jbpm/src/main/java/org/jboss/soa/esb/services/jbpm/integration/job/ExecuteJobCommand.java	2010-01-28 15:54:53 UTC (rev 31283)
@@ -21,18 +21,13 @@
  */
 package org.jboss.soa.esb.services.jbpm.integration.job;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.jboss.soa.esb.services.jbpm.integration.msg.RetryExecutor;
 import org.jbpm.JbpmContext;
-import org.jbpm.JbpmException;
 import org.jbpm.command.Command;
 import org.jbpm.graph.exe.ProcessInstance;
 import org.jbpm.job.Job;
-import org.jbpm.persistence.db.DbPersistenceService;
 
 /**
  * Individual job processing command.
@@ -44,15 +39,21 @@
    * The job id.
    */
   private final long jobId;
+  /**
+   * The redelivered flag.
+   */
+  private final boolean redelivered ;
 
   private static final long serialVersionUID = 1L;
 
   /**
    * Create the job command with a specified job id.
    * @param jobId The associated job id.
+   * @param redelivered The redelivered flag.
    */
-  public ExecuteJobCommand(long jobId) {
+  public ExecuteJobCommand(long jobId, final boolean redelivered) {
     this.jobId = jobId;
+    this.redelivered = redelivered ;
   }
 
   /**
@@ -75,6 +76,19 @@
       RetryExecutor.handleSuspendedJob(job) ;
       return null ;
     }
+    if (redelivered) {
+        if (job.getRetries() > 0) {
+            job.setRetries(job.getRetries() - 1);
+            if (log.isDebugEnabled()) {
+              log.debug("Rescheduling job " + job.getId());
+            }
+            job.setLockOwner(null) ;
+            jbpmContext.getServices().getMessageService().send(job) ;
+        } else {
+            log.error("Job retry count exceeded for job " + job.getId());
+        }
+        return null ;
+    }
     executeJob(job, jbpmContext);
     return job;
   }
@@ -112,31 +126,10 @@
       }
     }
     catch (Exception e) {
-      // This is supposed to be recoverable and, under the DB executor, would be retried.
-      // The state of the process will be uncertain but we refire here to be consistent.
       if (log.isDebugEnabled()) {
         log.debug("exception while executing " + job, e);
       }
-      if (!DbPersistenceService.isPersistenceException(e)) {
-        if (job.getRetries() > 0) {
-          // save data about recoverable error condition
-          StringWriter memoryWriter = new StringWriter();
-          e.printStackTrace(new PrintWriter(memoryWriter));
-          job.setException(memoryWriter.toString());
-          job.setRetries(job.getRetries() - 1);
-          if (log.isDebugEnabled()) {
-            log.debug("Rescheduling job " + job.getId() + " on error", e);
-          }
-          job.setLockOwner(null) ;
-          jbpmContext.getServices().getMessageService().send(job) ;
-          return ;
-        } else {
-            log.error("Job retry count exceeded", e) ;
-        }
-      }
-      // allowing a transaction to proceed after a persistence exception is unsafe
-      throw e instanceof RuntimeException ? (RuntimeException) e :
-              new JbpmException("failed to execute " + job, e);
+      jbpmContext.setRollbackOnly();
     }
   }
 

Modified: labs/jbossesb/branches/JBESB_4_7_CP/product/services/jbpm/src/main/java/org/jboss/soa/esb/services/jbpm/integration/job/ExecuteTimerCommand.java
===================================================================
--- labs/jbossesb/branches/JBESB_4_7_CP/product/services/jbpm/src/main/java/org/jboss/soa/esb/services/jbpm/integration/job/ExecuteTimerCommand.java	2010-01-28 15:48:29 UTC (rev 31282)
+++ labs/jbossesb/branches/JBESB_4_7_CP/product/services/jbpm/src/main/java/org/jboss/soa/esb/services/jbpm/integration/job/ExecuteTimerCommand.java	2010-01-28 15:54:53 UTC (rev 31283)
@@ -21,9 +21,6 @@
  */
 package org.jboss.soa.esb.services.jbpm.integration.job;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.jboss.soa.esb.services.jbpm.integration.msg.RetryExecutor;
@@ -40,15 +37,21 @@
      * The timer id.
      */
     private final long timerId;
+    /**
+     * The redelivered flag.
+     */
+    private final boolean redelivered ;
 
     private static final long serialVersionUID = 1L;
 
     /**
      * Create the timer command with a specified timer id.
      * @param timerId The associated timer id.
+     * @param redelivered The redelivered flag.
      */
-    public ExecuteTimerCommand(long timerId) {
+    public ExecuteTimerCommand(long timerId, final boolean redelivered) {
       this.timerId = timerId;
+      this.redelivered = redelivered ;
     }
 
     /**
@@ -71,6 +74,18 @@
         RetryExecutor.handleSuspendedTimer(timer) ;
         return null ;
       }
+      if (redelivered) {
+          if (timer.getRetries() > 0) {
+              timer.setRetries(timer.getRetries() - 1);
+              if (log.isDebugEnabled()) {
+                log.debug("Rescheduling timer " + timer.getId() + ", " + timer.getDueDate());
+              }
+              jbpmContext.getServices().getSchedulerService().createTimer(timer);
+          } else {
+              log.error("Timer retry count exceeded for timer " + timer.getId());
+          }
+          return null ;
+      }
       timer.setLockOwner(getClass().getName()); // prevent others from removing timer
       log.debug("executing " + timer);
       try {
@@ -83,29 +98,11 @@
             jbpmContext.getServices().getSchedulerService().createTimer(timer);
         }
       }
-      catch (RuntimeException e) {
-        // nothing to do but clean up and exit
-        throw e;
-      }
       catch (Exception e) {
-        // This is supposed to be recoverable and, under the DB executor, would be retried.
-        // The state of the process will be uncertain but we refire here to be consistent.
-        // How does the retry count get reset?
-        if (timer.getRetries() > 1) {
-          // save data about recoverable error condition
-          StringWriter memoryWriter = new StringWriter();
-          e.printStackTrace(new PrintWriter(memoryWriter));
-          timer.setException(memoryWriter.toString());
-          timer.setRetries(timer.getRetries() - 1);
-          
-          if (log.isDebugEnabled()) {
-            log.debug("Rescheduling timer " + timer.getId() + " on error " + timer.getDueDate(), e);
-          }
-          timer.setLockOwner(null) ;
-          jbpmContext.getServices().getSchedulerService().createTimer(timer);
-        } else {
-          log.warn("Timer retry count exceeded", e) ;
+        if (log.isDebugEnabled()) {
+          log.debug("exception while executing " + timer, e);
         }
+        jbpmContext.setRollbackOnly();
       }
       return null;
     }



More information about the jboss-svn-commits mailing list