[jbpm-commits] JBoss JBPM SVN: r5999 - in jbpm3/branches/jbpm-3.2-soa/modules/core/src: main/java/org/jbpm/job/executor and 6 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Fri Dec 18 16:13:45 EST 2009
Author: alex.guizar at jboss.com
Date: 2009-12-18 16:13:44 -0500 (Fri, 18 Dec 2009)
New Revision: 5999
Added:
jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/jbpm2691/
jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/jbpm2691/BombAction.java
jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/jbpm2691/JBPM2691Test.java
jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/resources/org/jbpm/jbpm2691/
jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/resources/org/jbpm/jbpm2691/gpd.xml
jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/resources/org/jbpm/jbpm2691/processdefinition.xml
Modified:
jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/db/AbstractDbTestCase.java
jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/job/executor/JobExecutorThread.java
jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml
jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/resources/org/jbpm/jbpm2574/processdefinition.xml
Log:
JBPM-2691: Save exceptions thrown while executing a job in a separate transaction
Modified: jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/db/AbstractDbTestCase.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/db/AbstractDbTestCase.java 2009-12-18 19:00:53 UTC (rev 5998)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/db/AbstractDbTestCase.java 2009-12-18 21:13:44 UTC (rev 5999)
@@ -79,7 +79,8 @@
}
private void ensureCleanDatabase() {
- DbPersistenceServiceFactory persistenceServiceFactory = (DbPersistenceServiceFactory) getJbpmConfiguration().getServiceFactory("persistence");
+ DbPersistenceServiceFactory persistenceServiceFactory =
+ (DbPersistenceServiceFactory) getJbpmConfiguration().getServiceFactory("persistence");
if (persistenceServiceFactory == null) return;
boolean hasLeftOvers = false;
@@ -91,8 +92,8 @@
Long count = (Long) entry.getValue();
if (count.intValue() != 0) {
hasLeftOvers = true;
- System.err.println("FIXME: " + getClass().getName() + "." + getName() + " left "
- + count + " records in " + entry.getKey());
+ System.err.println("FIXME: " + getClass().getName() + "." + getName()
+ + " left " + count + " records in " + entry.getKey());
}
}
@@ -102,8 +103,10 @@
}
protected String getHibernateDialect() {
- DbPersistenceServiceFactory persistenceServiceFactory = (DbPersistenceServiceFactory) jbpmContext.getServiceFactory(Services.SERVICENAME_PERSISTENCE);
- return persistenceServiceFactory.getConfiguration().getProperty(Environment.DIALECT);
+ DbPersistenceServiceFactory persistenceServiceFactory =
+ (DbPersistenceServiceFactory) jbpmContext.getServiceFactory(Services.SERVICENAME_PERSISTENCE);
+ return persistenceServiceFactory.getConfiguration()
+ .getProperty(Environment.DIALECT);
}
protected void beginSessionTransaction() {
@@ -130,7 +133,8 @@
protected TaskInstance saveAndReload(TaskInstance taskInstance) {
jbpmContext.save(taskInstance);
newTransaction();
- return (TaskInstance) session.load(TaskInstance.class, new Long(taskInstance.getId()));
+ return (TaskInstance) session.load(TaskInstance.class, new Long(
+ taskInstance.getId()));
}
protected ProcessDefinition saveAndReload(ProcessDefinition pd) {
@@ -186,7 +190,7 @@
}
protected void waitForJobs(final long timeout) {
- final long startTime = System.currentTimeMillis();
+ long startTime = System.currentTimeMillis();
int previousCount = 0;
long previousTime = 0L;
@@ -194,9 +198,9 @@
long waitPeriod = 500;
for (int currentCount; (currentCount = getNbrOfJobsAvailable()) > 0;) {
- final long currentTime = System.currentTimeMillis();
+ long currentTime = System.currentTimeMillis();
- final long elapsedTime = currentTime - startTime;
+ long elapsedTime = currentTime - startTime;
if (elapsedTime > timeout) {
fail("test execution exceeded threshold of " + timeout + " ms");
}
@@ -214,11 +218,12 @@
waitPeriod = 5000;
}
else {
- final long remainingTime = timeout - elapsedTime;
+ long remainingTime = timeout - elapsedTime;
if (waitPeriod > remainingTime) waitPeriod = remainingTime;
}
- log.debug("waiting " + waitPeriod + " ms for " + currentCount + " jobs to be executed");
+ log.debug("waiting " + waitPeriod + " ms for " + currentCount
+ + " jobs to be executed");
try {
Thread.sleep(waitPeriod);
}
@@ -233,12 +238,12 @@
protected int getNbrOfJobsAvailable() {
if (session != null) {
- return getNbrOfJobsAvailable(session);
+ return getJobCount(session);
}
else {
beginSessionTransaction();
try {
- return getNbrOfJobsAvailable(session);
+ return getJobCount(session);
}
finally {
commitAndCloseSession();
@@ -246,16 +251,15 @@
}
}
- private int getNbrOfJobsAvailable(Session session) {
- Number jobs = (Number) session.createQuery("select count(*) from org.jbpm.job.Job")
- .uniqueResult();
- return jobs.intValue();
+ private int getJobCount(Session session) {
+ Number jobCount = (Number) session.createQuery("select count(*) "
+ + "from org.jbpm.job.Job where retries > 0").uniqueResult();
+ return jobCount.intValue();
}
protected int getTimerCount() {
- Number timerCount = (Number) session.createQuery("select count(*) from org.jbpm.job.Timer")
- .uniqueResult();
- log.debug("there are " + timerCount + " timers in the database");
+ Number timerCount = (Number) session.createQuery("select count(*) "
+ + "from org.jbpm.job.Timer where retries > 0").uniqueResult();
return timerCount.intValue();
}
Modified: jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/job/executor/JobExecutorThread.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/job/executor/JobExecutorThread.java 2009-12-18 19:00:53 UTC (rev 5998)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/java/org/jbpm/job/executor/JobExecutorThread.java 2009-12-18 21:13:44 UTC (rev 5999)
@@ -43,8 +43,8 @@
* @deprecated use {@link #JobExecutorThread(String, JobExecutor)} instead
*/
public JobExecutorThread(String name, JobExecutor jobExecutor,
- JbpmConfiguration jbpmConfiguration, int idleInterval, int maxIdleInterval,
- long maxLockTime, int maxHistory) {
+ JbpmConfiguration jbpmConfiguration, int idleInterval,
+ int maxIdleInterval, long maxLockTime, int maxHistory) {
super(name);
this.jobExecutor = jobExecutor;
this.jbpmConfiguration = jbpmConfiguration;
@@ -60,7 +60,12 @@
Collection acquiredJobs = acquireJobs();
for (Iterator i = acquiredJobs.iterator(); i.hasNext() && isActive;) {
Job job = (Job) i.next();
- executeJob(job);
+ try {
+ executeJob(job);
+ }
+ catch (Exception e) {
+ saveJobException(job, e);
+ }
}
if (isActive) {
long waitPeriod = getWaitPeriod(currentIdleInterval);
@@ -75,21 +80,23 @@
}
catch (RuntimeException e) {
if (isActive) {
- log.error("exception in " + getName() + ", waiting " + currentIdleInterval + " ms", e);
+ log.error("exception in " + getName() + ", waiting "
+ + currentIdleInterval + " ms", e);
try {
synchronized (jobExecutor) {
jobExecutor.wait(currentIdleInterval);
}
+ // after an exception, double the current idle interval to avoid
+ // throwing exceptions continuously during anomalous conditions
+ currentIdleInterval *= 2;
+ if (currentIdleInterval > maxIdleInterval
+ || currentIdleInterval < 0) {
+ currentIdleInterval = maxIdleInterval;
+ }
}
catch (InterruptedException ie) {
log.debug(getName() + " got interrupted: " + e.getMessage());
}
- // after an exception, double the current idle interval to prevent
- // continuous exception throwing while an anomalous condition prevails
- currentIdleInterval *= 2;
- if (currentIdleInterval > maxIdleInterval || currentIdleInterval < 0) {
- currentIdleInterval = maxIdleInterval;
- }
}
}
catch (InterruptedException e) {
@@ -115,7 +122,8 @@
if (job.isExclusive()) {
ProcessInstance processInstance = job.getProcessInstance();
log.debug("finding exclusive jobs for " + processInstance);
- jobsToLock = jobSession.findExclusiveJobs(lockOwner, processInstance);
+ jobsToLock =
+ jobSession.findExclusiveJobs(lockOwner, processInstance);
log.debug("acquiring " + jobsToLock + " for " + processInstance);
}
else {
@@ -157,7 +165,7 @@
return acquiredJobs;
}
- protected void executeJob(Job job) {
+ protected void executeJob(Job job) throws Exception {
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
JobSession jobSession = jbpmContext.getJobSession();
@@ -174,17 +182,13 @@
}
}
catch (Exception e) {
- log.debug("exception while executing " + job, e);
- if (!DbPersistenceService.isPersistenceException(e)) {
- StringWriter memoryWriter = new StringWriter();
- e.printStackTrace(new PrintWriter(memoryWriter));
- job.setException(memoryWriter.toString());
- job.setRetries(job.getRetries() - 1);
- }
- else {
- // prevent unsafe use of the session after an exception occurs
- jbpmContext.setRollbackOnly();
- }
+ // prevent unsafe use of the session after an exception occurs
+ jbpmContext.setRollbackOnly();
+
+ if (!DbPersistenceService.isLockingException(e)) throw e;
+ // if this is a locking exception, keep it quiet
+ StaleObjectLogConfigurer.getStaleObjectExceptionsLog()
+ .error("failed to complete " + job);
}
catch (Error e) {
jbpmContext.setRollbackOnly();
@@ -192,7 +196,8 @@
}
// if this job is locked too long
- long totalLockTimeInMillis = System.currentTimeMillis() - job.getLockTime().getTime();
+ long totalLockTimeInMillis =
+ System.currentTimeMillis() - job.getLockTime().getTime();
if (totalLockTimeInMillis > maxLockTime) {
jbpmContext.setRollbackOnly();
}
@@ -204,12 +209,39 @@
catch (RuntimeException e) {
if (!DbPersistenceService.isLockingException(e)) throw e;
// if this is a locking exception, keep it quiet
- StaleObjectLogConfigurer.getStaleObjectExceptionsLog().error("failed to complete job "
- + job);
+ StaleObjectLogConfigurer.getStaleObjectExceptionsLog()
+ .error("failed to complete " + job);
}
}
}
+ private void saveJobException(Job job, Exception exception) {
+ JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
+ try {
+ JobSession jobSession = jbpmContext.getJobSession();
+ // not reattaching existing job as it may contain updates
+ job = jobSession.loadJob(job.getId());
+
+ StringWriter out = new StringWriter();
+ exception.printStackTrace(new PrintWriter(out));
+ job.setException(out.toString());
+ job.setRetries(job.getRetries() - 1);
+ }
+ catch (RuntimeException e) {
+ jbpmContext.setRollbackOnly();
+ log.error("failed to save job exception", exception);
+ throw e;
+ }
+ catch (Error e) {
+ jbpmContext.setRollbackOnly();
+ log.error("failed to save job exception", exception);
+ throw e;
+ }
+ finally {
+ jbpmContext.close();
+ }
+ }
+
protected long getWaitPeriod(int currentIdleInterval) {
long waitPeriod = currentIdleInterval;
@@ -255,7 +287,7 @@
if (!DbPersistenceService.isLockingException(e)) throw e;
// if this is a locking exception, keep it quiet
StaleObjectLogConfigurer.getStaleObjectExceptionsLog()
- .error("failed to determine next due date for job executor thread " + lockOwner);
+ .error("failed to determine next due date");
nextDueDate = null;
}
}
@@ -270,7 +302,8 @@
}
/**
- * Indicates that this thread should stop running. Execution will cease shortly afterwards.
+ * Indicates that this thread should stop running. Execution will cease
+ * shortly afterwards.
*/
public void deactivate() {
if (isActive) {
Modified: jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml 2009-12-18 19:00:53 UTC (rev 5998)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml 2009-12-18 21:13:44 UTC (rev 5999)
@@ -265,7 +265,7 @@
<![CDATA[
select job
from org.jbpm.job.Job as job
- where ( (job.lockOwner is null) or (job.lockOwner = :lockOwner) )
+ where (job.lockOwner is null or job.lockOwner = :lockOwner)
and job.retries > 0
and job.dueDate <= :now
and job.isSuspended = false
@@ -277,7 +277,7 @@
<![CDATA[
select job
from org.jbpm.job.Job as job
- where ( (job.lockOwner is null) or (job.lockOwner = :lockOwner) )
+ where (job.lockOwner is null or job.lockOwner = :lockOwner)
and job.retries > 0
and job.dueDate <= :now
and job.processInstance = :processInstance
@@ -291,7 +291,7 @@
<![CDATA[
select job
from org.jbpm.job.Job as job
- where ( (job.lockOwner is null) or (job.lockOwner = :lockOwner) )
+ where (job.lockOwner is null or job.lockOwner = :lockOwner)
and job.retries > 0
and job.isSuspended = false
order by job.dueDate asc
@@ -302,8 +302,8 @@
<![CDATA[
select job
from org.jbpm.job.Job as job
- where ( (job.lockOwner is null) or (job.lockOwner = :lockOwner) )
- and job.id not in ( :monitoredJobIds )
+ where (job.lockOwner is null or job.lockOwner = :lockOwner)
+ and job.id not in (:monitoredJobIds)
and job.retries > 0
and job.isSuspended = false
order by job.dueDate asc
@@ -406,7 +406,7 @@
<![CDATA[
select ti
from org.jbpm.taskmgmt.exe.TaskInstance as ti
- where ti.actorId in ( :actorIds )
+ where ti.actorId in (:actorIds)
and ti.isSuspended = false
and ti.isOpen = true
]]>
@@ -429,7 +429,7 @@
select distinct ti.id
from org.jbpm.taskmgmt.exe.TaskInstance ti
join ti.pooledActors pooledActor
- where pooledActor.actorId in ( :actorIds )
+ where pooledActor.actorId in (:actorIds)
and ti.actorId is null
and ti.isSuspended = false
and ti.isOpen = true
@@ -460,7 +460,7 @@
<![CDATA[
select ti
from org.jbpm.taskmgmt.exe.TaskInstance ti
- where ti.id in ( :taskInstanceIds )
+ where ti.id in (:taskInstanceIds)
]]>
</query>
Added: jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/jbpm2691/BombAction.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/jbpm2691/BombAction.java (rev 0)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/jbpm2691/BombAction.java 2009-12-18 21:13:44 UTC (rev 5999)
@@ -0,0 +1,14 @@
+package org.jbpm.jbpm2691;
+
+import org.jbpm.graph.def.ActionHandler;
+import org.jbpm.graph.exe.ExecutionContext;
+
+public class BombAction implements ActionHandler {
+
+ private static final long serialVersionUID = 1L;
+
+ public void execute(ExecutionContext executionContext) throws Exception {
+ throw new Exception("boom");
+ }
+
+}
Property changes on: jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/jbpm2691/BombAction.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ native
Added: jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/jbpm2691/JBPM2691Test.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/jbpm2691/JBPM2691Test.java (rev 0)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/jbpm2691/JBPM2691Test.java 2009-12-18 21:13:44 UTC (rev 5999)
@@ -0,0 +1,74 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jbpm.jbpm2691;
+
+import java.util.List;
+
+import org.jbpm.db.AbstractDbTestCase;
+import org.jbpm.graph.def.ProcessDefinition;
+import org.jbpm.graph.exe.ProcessInstance;
+import org.jbpm.graph.exe.Token;
+import org.jbpm.job.Job;
+
+/**
+ * Save exceptions thrown while executing a job in a separate transaction.
+ *
+ * @see <a href="https://jira.jboss.org/jira/browse/JBPM-2691">JBPM-2691</a>
+ * @author Alejandro Guizar
+ */
+public class JBPM2691Test extends AbstractDbTestCase {
+
+ private long processDefinitionId;
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("org/jbpm/jbpm2691/processdefinition.xml");
+ jbpmContext.deployProcessDefinition(processDefinition);
+ processDefinitionId = processDefinition.getId();
+
+ newTransaction();
+ }
+
+ protected void tearDown() throws Exception {
+ graphSession.deleteProcessDefinition(processDefinitionId);
+ super.tearDown();
+ }
+
+ public void testSaveExceptionInSeparateTx() {
+ ProcessInstance processInstance = jbpmContext.newProcessInstance("jobex");
+ processInstance.signal();
+
+ processJobs(60 * 1000);
+ processInstance = jbpmContext.getProcessInstance(processInstance.getId());
+ Token rootToken = processInstance.getRootToken();
+ List jobs = jobSession.findJobsByToken(rootToken);
+ assertEquals(1, jobs.size());
+
+ Job job = (Job) jobs.get(0);
+ String exception = job.getException();
+ assertNotNull(exception);
+ assert exception.indexOf("boom") != -1 : exception;
+
+ // exception should leave job in its original state
+ assertEquals("async", rootToken.getNode().getName());
+ }
+}
Property changes on: jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/jbpm2691/JBPM2691Test.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ native
Modified: jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/resources/org/jbpm/jbpm2574/processdefinition.xml
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/resources/org/jbpm/jbpm2574/processdefinition.xml 2009-12-18 19:00:53 UTC (rev 5998)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/resources/org/jbpm/jbpm2574/processdefinition.xml 2009-12-18 21:13:44 UTC (rev 5999)
@@ -1,32 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
-<process-definition xmlns="" name="scripted">
+<process-definition name="scripted" xmlns="urn:jbpm.org:jpdl-3.2">
+ <start-state name="start">
+ <transition to="esb" />
+ </start-state>
- <start-state name="start">
- <transition to="esb"></transition>
- </start-state>
+ <node name="esb">
+ <action class="org.jbpm.mock.EsbActionHandler">
+ <esbServiceName>paybills</esbServiceName>
+ <esbCategoryName>annoyances</esbCategoryName>
+ </action>
+ <transition to="end" />
+ </node>
+ <end-state name="end" />
- <node name="esb">
- <action class="org.jbpm.mock.EsbActionHandler">
- <esbServiceName>
- paybills
- </esbServiceName>
- <esbCategoryName>
- annoyances
- </esbCategoryName>
- </action>
- <transition to="end"></transition>
- </node>
+ <event type="node-enter">
+ <action class="org.jbpm.no.such.Class" />
+ </event>
-
- <end-state name="end"></end-state>
-
-
- <event type="node-enter">
- <action class="org.jbpm.no.such.Class"></action>
- </event>
-
-
</process-definition>
\ No newline at end of file
Added: jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/resources/org/jbpm/jbpm2691/gpd.xml
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/resources/org/jbpm/jbpm2691/gpd.xml (rev 0)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/resources/org/jbpm/jbpm2691/gpd.xml 2009-12-18 21:13:44 UTC (rev 5999)
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<root-container name="jobex" width="862" height="591">
+ <node name="start" x="172" y="42" width="132" height="36">
+ <edge>
+ <label x="5" y="-10"/>
+ </edge>
+ </node>
+ <node name="async" x="172" y="111" width="132" height="36">
+ <edge>
+ <label x="5" y="-10"/>
+ </edge>
+ </node>
+ <node name="bomb" x="172" y="180" width="132" height="36">
+ <edge>
+ <label x="5" y="-10"/>
+ </edge>
+ </node>
+ <node name="end" x="172" y="256" width="132" height="36"/>
+</root-container>
Property changes on: jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/resources/org/jbpm/jbpm2691/gpd.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ native
Added: jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/resources/org/jbpm/jbpm2691/processdefinition.xml
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/resources/org/jbpm/jbpm2691/processdefinition.xml (rev 0)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/resources/org/jbpm/jbpm2691/processdefinition.xml 2009-12-18 21:13:44 UTC (rev 5999)
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<process-definition name="jobex" xmlns="urn:jbpm.org:jpdl-3.2">
+ <start-state name="start">
+ <transition to="async" />
+ </start-state>
+
+ <node name="async" async="true">
+ <transition to="bomb" />
+ </node>
+
+ <node name="bomb">
+ <action class="org.jbpm.jbpm2691.BombAction" />
+ <transition to="end" />
+ </node>
+
+ <end-state name="end" />
+</process-definition>
\ No newline at end of file
Property changes on: jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/resources/org/jbpm/jbpm2691/processdefinition.xml
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ native
More information about the jbpm-commits
mailing list