[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