[jbpm-commits] JBoss JBPM SVN: r1938 - in jbpm3/trunk/modules/jpdl/core/src: main/java/org/jbpm/graph/def and 7 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Wed Aug 20 07:24:43 EDT 2008
Author: alex.guizar at jboss.com
Date: 2008-08-20 07:24:43 -0400 (Wed, 20 Aug 2008)
New Revision: 1938
Modified:
jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/db/JobSession.java
jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/def/Event.java
jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/def/GraphElement.java
jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java
jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/job/Timer.java
jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/scheduler/def/CreateTimerAction.java
jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/taskmgmt/exe/TaskInstance.java
jbpm3/trunk/modules/jpdl/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml
jbpm3/trunk/modules/jpdl/core/src/test/java/org/jbpm/job/executor/NoJobExecutorDbTest.java
jbpm3/trunk/modules/jpdl/core/src/test/java/org/jbpm/job/executor/TimerOnTimerDbTest.java
jbpm3/trunk/modules/jpdl/core/src/test/resources/org/jbpm/job/executor/timerOnTimer.jpdl.xml
Log:
eliminated stale state exception by excluding locked jobs from query "JobSession.getTimersByName": JBPM-1135
rewrote timer test in terms of monitors instead of thread sleeps
improved toString() for Timer, TaskInstance and ProcessInstance
extracted "timer" event type constant from CreateTimerAction to Event
Modified: jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/db/JobSession.java
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/db/JobSession.java 2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/db/JobSession.java 2008-08-20 11:24:43 UTC (rev 1938)
@@ -165,14 +165,14 @@
Iterator iter = results.iterator();
while (iter.hasNext()) {
Timer timer = (Timer) iter.next();
- log.debug("deleting timer "+timer+" by name "+name);
+ log.debug("deleting "+timer+" for '"+token+"'");
session.delete(timer);
}
}
} catch (Exception e) {
log.error(e);
- throw new JbpmException("couldn't cancel timers '"+name+"' for '"+token+"'", e);
+ throw new JbpmException("couldn't cancel timers by name '"+name+"' for '"+token+"'", e);
}
}
@@ -189,22 +189,22 @@
public void save(ProcessInstance processInstance, JbpmContext jbpmContext) {
// avoid deleting jobs for process instances that did not request job deletion
if (!targetProcessInstance.equals(processInstance)) {
- log.debug("forgiving " + processInstance + ", it isn't the target of this operation");
+ log.debug("forgiving " + processInstance + ", it is not the target of this operation");
return;
}
- log.debug("deleting timers for process instance "+processInstance);
+ log.debug("deleting timers for "+processInstance);
Session session = jbpmContext.getSession();
Query query = session.getNamedQuery("JobSession.deleteTimersForProcessInstance");
query.setParameter("processInstance", processInstance);
int entityCount = query.executeUpdate();
- log.debug(entityCount+" remaining timers for '"+processInstance+"' were deleted");
+ log.debug(entityCount+" remaining timers for "+processInstance+" were deleted");
- log.debug("deleting execute-node-jobs for process instance "+processInstance);
+ log.debug("deleting execute-node-jobs for "+processInstance);
query = session.getNamedQuery("JobSession.deleteExecuteNodeJobsForProcessInstance");
query.setParameter("processInstance", processInstance);
entityCount = query.executeUpdate();
- log.debug(entityCount+" remaining execute-node-jobs for '"+processInstance+"' are deleted");
+ log.debug(entityCount+" remaining execute-node-jobs for "+processInstance+" were deleted");
}
}
Modified: jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/def/Event.java
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/def/Event.java 2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/def/Event.java 2008-08-20 11:24:43 UTC (rev 1938)
@@ -46,6 +46,7 @@
public static final String EVENTTYPE_TASK_ASSIGN = "task-assign";
public static final String EVENTTYPE_TASK_START = "task-start";
public static final String EVENTTYPE_TASK_END = "task-end";
+ public static final String EVENTTYPE_TIMER_CREATE = "timer-create";
public static final String EVENTTYPE_TIMER = "timer";
long id = 0;
Modified: jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/def/GraphElement.java
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/def/GraphElement.java 2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/def/GraphElement.java 2008-08-20 11:24:43 UTC (rev 1938)
@@ -160,10 +160,7 @@
// event handling ///////////////////////////////////////////////////////////
public void fireEvent(String eventType, ExecutionContext executionContext) {
- Token token = executionContext.getToken();
-
- log.debug( "event '"+eventType+"' on '"+this+"' for '"+token+"'" );
-
+ log.debug( "event '"+eventType+"' on '"+this+"' for '"+executionContext.getToken()+"'" );
try {
executionContext.setEventSource(this);
fireAndPropagateEvent(eventType, executionContext);
Modified: jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java 2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java 2008-08-20 11:24:43 UTC (rev 1938)
@@ -448,6 +448,10 @@
return EqualsUtil.equals(this, o);
}
+ public String toString() {
+ return "ProcessInstance" + (key != null ? '(' + key + ')' : "@" + Integer.toHexString(hashCode()));
+ }
+
// getters and setters //////////////////////////////////////////////////////
public long getId() {
Modified: jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/job/Timer.java
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/job/Timer.java 2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/job/Timer.java 2008-08-20 11:24:43 UTC (rev 1938)
@@ -120,11 +120,11 @@
buffer.append(formatDueDate(dueDate)).append(",");
}
if (taskInstance!=null)
- buffer.append("TaskInstance: ").append(taskInstance.getId()).append(",");
+ buffer.append(taskInstance).append(",");
if (token!=null)
- buffer.append("Token: ").append(token.getId());
+ buffer.append(token);
else if (processInstance!=null)
- buffer.append("ProcessInstance: ").append(processInstance.getId());
+ buffer.append(processInstance);
buffer.append(")");
}
Modified: jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/scheduler/def/CreateTimerAction.java
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/scheduler/def/CreateTimerAction.java 2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/scheduler/def/CreateTimerAction.java 2008-08-20 11:24:43 UTC (rev 1938)
@@ -29,6 +29,7 @@
import org.jbpm.calendar.BusinessCalendar;
import org.jbpm.calendar.Duration;
import org.jbpm.graph.def.Action;
+import org.jbpm.graph.def.Event;
import org.jbpm.graph.def.GraphElement;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.job.Timer;
@@ -133,7 +134,7 @@
try {
executionContext.setTimer(timer);
// fire the create timer event on the same graph element
- graphElement.fireEvent("timer-create", executionContext);
+ graphElement.fireEvent(Event.EVENTTYPE_TIMER_CREATE, executionContext);
} finally {
executionContext.setTimer(null);
}
Modified: jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/taskmgmt/exe/TaskInstance.java
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/taskmgmt/exe/TaskInstance.java 2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/taskmgmt/exe/TaskInstance.java 2008-08-20 11:24:43 UTC (rev 1938)
@@ -41,7 +41,6 @@
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;
-import org.jbpm.graph.node.TaskNode;
import org.jbpm.security.SecurityHelper;
import org.jbpm.taskmgmt.def.Swimlane;
import org.jbpm.taskmgmt.def.Task;
@@ -555,7 +554,7 @@
}
public String toString() {
- return "TaskInstance"+(name!=null ? "["+name+"]" : Integer.toHexString(System.identityHashCode(this)));
+ return "TaskInstance"+(name!=null ? "("+name+")" : "@"+Integer.toHexString(hashCode()));
}
// private //////////////////////////////////////////////////////////////////
Modified: jbpm3/trunk/modules/jpdl/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml 2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml 2008-08-20 11:24:43 UTC (rev 1938)
@@ -311,6 +311,7 @@
from org.jbpm.job.Timer timer
where timer.token = :token
and timer.name = :name
+ and timer.lockOwner is null
]]>
</query>
Modified: jbpm3/trunk/modules/jpdl/core/src/test/java/org/jbpm/job/executor/NoJobExecutorDbTest.java
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/test/java/org/jbpm/job/executor/NoJobExecutorDbTest.java 2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/test/java/org/jbpm/job/executor/NoJobExecutorDbTest.java 2008-08-20 11:24:43 UTC (rev 1938)
@@ -37,24 +37,24 @@
private JbpmContext jbpmContext;
private static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.parseXmlString(
- "<jbpm-configuration>" +
- " <null name='jbpm.job.executor' />" +
- "</jbpm-configuration>");
+ "<jbpm-configuration>" +
+ " <null name='jbpm.job.executor' />" +
+ "</jbpm-configuration>");
public void setUp() throws Exception {
- jbpmContext = jbpmConfiguration.createJbpmContext();
+ jbpmContext = jbpmConfiguration.createJbpmContext();
}
public void tearDown() throws Exception {
- jbpmContext.close();
+ jbpmContext.close();
}
public void testJobExecutorDoesNotExist() {
- // check the job executor is properly nullified
+ // check the job executor is properly nullified
assertNull(jbpmContext.getObjectFactory().createObject("jbpm.job.executor"));
// start and end a process instance, confirm no exception gets thrown
- jbpmContext.deployProcessDefinition(new ProcessDefinition("Audit"));
- ProcessInstance processInstance = jbpmContext.newProcessInstanceForUpdate("Audit");
- processInstance.end();
+ jbpmContext.deployProcessDefinition(new ProcessDefinition("Audit"));
+ ProcessInstance processInstance = jbpmContext.newProcessInstanceForUpdate("Audit");
+ processInstance.end();
}
}
Modified: jbpm3/trunk/modules/jpdl/core/src/test/java/org/jbpm/job/executor/TimerOnTimerDbTest.java
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/test/java/org/jbpm/job/executor/TimerOnTimerDbTest.java 2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/test/java/org/jbpm/job/executor/TimerOnTimerDbTest.java 2008-08-20 11:24:43 UTC (rev 1938)
@@ -23,9 +23,8 @@
import java.io.Serializable;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
import org.jbpm.db.AbstractDbTestCase;
+import org.jbpm.graph.def.Event;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
@@ -35,71 +34,99 @@
*/
public class TimerOnTimerDbTest extends AbstractDbTestCase {
- private static final Log log = LogFactory.getLog(TimerOnTimerDbTest.class);
-
public void testTimerOnTimer() {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("org/jbpm/job/executor/timerOnTimer.jpdl.xml");
jbpmContext.deployProcessDefinition(processDefinition);
ProcessInstance processInstance = jbpmContext.newProcessInstanceForUpdate("timerTest");
- processInstance.getContextInstance().setVariable("timerTestWorkflow", new WorkflowLogger());
+ processInstance.getContextInstance().setVariable("testCallback", new TestCallback());
processInstance.signal();
+ long tokenId = processInstance.getRootToken().getId();
commitAndCloseSession();
- long tokenId = processInstance.getRootToken().getId();
startJobExecutor();
try {
- sleep(500);
+ TestCallback.waitForEvent(Event.EVENTTYPE_NODE_ENTER);
beginSessionTransaction();
- assertEquals("timerTest", jbpmContext.loadToken(tokenId).getNode().getName());
+ assertEquals("firstNode", jbpmContext.loadToken(tokenId).getNode().getName());
commitAndCloseSession();
- sleep(1000);
+ TestCallback.waitForEvent(Event.EVENTTYPE_NODE_ENTER);
beginSessionTransaction();
- assertEquals("secondTimerTest", jbpmContext.loadToken(tokenId).getNode().getName());
+ assertEquals("secondNode", jbpmContext.loadToken(tokenId).getNode().getName());
commitAndCloseSession();
- sleep(1000);
+ TestCallback.waitForEvent(Event.EVENTTYPE_PROCESS_END);
beginSessionTransaction();
- assertTrue(jbpmContext.loadToken(tokenId).getProcessInstance().hasEnded());
+ assertTrue(jbpmContext.loadToken(tokenId).hasEnded());
}
finally {
stopJobExecutor();
}
}
- private void sleep(long millis) {
- try {
- Thread.sleep(millis);
- }
- catch (InterruptedException e) {
- // reassert interruption
- Thread.currentThread().interrupt();
- }
- }
+ public static class TestCallback implements Serializable {
- public static final class WorkflowLogger implements Serializable {
-
private static final long serialVersionUID = 1L;
-
- public void logNodeEnter() {
- log.info("entered node");
+
+ public void processStart() {
+ synchronized (Event.EVENTTYPE_PROCESS_START) {
+ Event.EVENTTYPE_PROCESS_START.notify();
+ }
}
-
- public void logNodeLeave() {
- log.info("left node");
+
+ public void processEnd() {
+ synchronized (Event.EVENTTYPE_PROCESS_END) {
+ Event.EVENTTYPE_PROCESS_END.notify();
+ }
}
-
- public void logTaskCreate() {
- log.info("created task");
+
+ public void nodeEnter() {
+ synchronized (Event.EVENTTYPE_NODE_ENTER) {
+ Event.EVENTTYPE_NODE_ENTER.notify();
+ }
}
-
- public void logTimerCreate() {
- log.info("created timer");
+
+ public void nodeLeave() {
+ synchronized (Event.EVENTTYPE_NODE_LEAVE) {
+ Event.EVENTTYPE_NODE_LEAVE.notify();
+ }
}
-
- public void logTimerFired() {
- log.info("fired timer");
+
+ public void taskCreate() {
+ synchronized (Event.EVENTTYPE_TASK_CREATE) {
+ Event.EVENTTYPE_TASK_CREATE.notify();
+ }
}
+
+ public void taskEnd() {
+ synchronized (Event.EVENTTYPE_TASK_END) {
+ Event.EVENTTYPE_TASK_END.notify();
+ }
+ }
+
+ public void timerCreate() {
+ synchronized (Event.EVENTTYPE_TIMER_CREATE) {
+ Event.EVENTTYPE_TIMER_CREATE.notify();
+ }
+ }
+
+ public void timer() {
+ synchronized (Event.EVENTTYPE_TIMER) {
+ Event.EVENTTYPE_TIMER.notify();
+ }
+ }
+
+ public static void waitForEvent(String event) {
+ synchronized (event) {
+ try {
+ event.wait(60000);
+ }
+ catch (InterruptedException e) {
+ // reassert interruption
+ Thread.currentThread().interrupt();
+ }
+ }
+ }
}
}
Modified: jbpm3/trunk/modules/jpdl/core/src/test/resources/org/jbpm/job/executor/timerOnTimer.jpdl.xml
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/test/resources/org/jbpm/job/executor/timerOnTimer.jpdl.xml 2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/test/resources/org/jbpm/job/executor/timerOnTimer.jpdl.xml 2008-08-20 11:24:43 UTC (rev 1938)
@@ -3,44 +3,47 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:jbpm.org:jpdl-3.2 http://jbpm.org/xsd/jpdl-3.2.xsd">
+ <event type="process-start">
+ <action expression="#{testCallback.processStart}"/>
+ </event>
+ <event type="process-end">
+ <action expression="#{testCallback.processEnd}"/>
+ </event>
+ <event type="node-enter">
+ <action expression="#{testCallback.nodeEnter}" />
+ </event>
+ <event type="node-leave">
+ <action expression="#{testCallback.nodeLeave}" />
+ </event>
+ <event type="task-create">
+ <action expression="#{testCallback.taskCreate}" />
+ </event>
+ <event type="task-end">
+ <action expression="#{testCallback.taskEnd}" />
+ </event>
+ <event type="timer-create">
+ <action expression="#{testCallback.timerCreate}" />
+ </event>
+ <event type="timer">
+ <action expression="#{testCallback.timer}"/>
+ </event>
+
<start-state name="start">
- <transition name="" to="timerTest" />
+ <transition name="doneStart" to="firstNode" />
</start-state>
- <task-node name="timerTest" end-tasks="true">
- <event type="node-enter">
- <action expression="#{timerTestWorkflow.logNodeEnter}" />
- </event>
- <event type="node-leave">
- <action expression="#{timerTestWorkflow.logNodeLeave}" />
- </event>
- <transition name="doneFirst" to="secondTimerTest" />
- <task name="timerTestTask" description="TimerTestTask">
+ <task-node name="firstNode" end-tasks="yes">
+ <task name="firstTask">
<assignment actor-id="admin" />
- <event type="task-create">
- <action expression="#{timerTestWorkflow.logTaskCreate}" />
- </event>
- <event type="timer-create">
- <action expression="#{timerTestWorkflow.logTimerCreate}" />
- </event>
- <timer duedate="1 second" transition="doneFirst">
- <action expression="#{timerTestWorkflow.logTimerFired}" />
- </timer>
+ <timer duedate="1 second" transition="doneFirst" />
</task>
+ <transition name="doneFirst" to="secondNode" />
</task-node>
- <task-node name="secondTimerTest">
- <task name="secondTimerTestTask" description="SecondTimerTestTask">
+ <task-node name="secondNode" end-tasks="yes">
+ <task name="secondTask">
<assignment actor-id="admin" />
- <event type="task-create">
- <action expression="#{timerTestWorkflow.logTaskCreate}" />
- </event>
- <event type="timer-create">
- <action expression="#{timerTestWorkflow.logTimerCreate}" />
- </event>
- <timer duedate="1 second" transition="doneSecond">
- <action expression="#{timerTestWorkflow.logTimerFired}" />
- </timer>
+ <timer duedate="1 second" transition="doneSecond" />
</task>
<transition name="doneSecond" to="end" />
</task-node>
More information about the jbpm-commits
mailing list