[jboss-user] [jBPM] New message: "Re: Problem retrieving running process instance"
Oliver Schneider
do-not-reply at jboss.com
Fri Jan 8 06:06:03 EST 2010
User development,
A new message was posted in the thread "Problem retrieving running process instance":
http://community.jboss.org/message/518922#518922
Author : Oliver Schneider
Profile : http://community.jboss.org/people/Masipulami
Message:
--------------------------------------------------------------
With JBPM 3 it worked as shown in the example below. But this way does not work any more with JBPM 4.
What am I doing wrong?
package org.jbpm.tutorial.db;
import java.util.List;
import junit.framework.TestCase;
import org.jbpm.db.GraphSession;
import org.jbpm.db.JbpmSession;
import org.jbpm.db.JbpmSessionFactory;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;
public class HelloWorldDbTest extends TestCase {
// We need one JbpmSessionFactory per application. So we put it in
// a static variable. The JbpmSessionFactory will be used in the
// test methods to create JbpmSession's.
static JbpmSessionFactory jbpmSessionFactory =
JbpmSessionFactory.buildJbpmSessionFactory();
static {
// Since the hypersonic in-memory database is a new, fresh database,
// we need to create the schema at runtime before we start the tests.
// The next line creates the database tables and foreign key
// constraints.
jbpmSessionFactory.getJbpmSchema().createSchema();
}
public void testSimplePersistence() {
// Between the 3 method calls below, all data is passed via the
// database. Here, in this unit test, these 3 methods are executed
// right after each other because we want to test a complete process
// scenario. But in reality, these methods represent different
// requests to a server.
// Since we start with a clean, empty in-memory database, we have to
// deploy the process first. In reality, this is done once by the
// process developer.
deployProcessDefinition();
// Suppose we want to start a process instance (=process execution)
// when a user submits a form in a web application...
processInstanceIsCreatedWhenUserSubmitsWebappForm();
// Then, the arrival of an asynchronous message will continue
// execution.
theProcessInstanceContinuesWhenAnAsyncMessageIsReceived();
}
public void deployProcessDefinition() {
// This test shows a process definition and one execution
// of the process definition. The process definition has
// 3 nodes: an unnamed start-state, a state 's' and an
// end-state named 'end'.
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
"<process-definition name='hello world'>" +
" <start-state name='start'>" +
" <transition to='s' />" +
" </start-state>" +
" <state name='s'>" +
" <transition to='end' />" +
" </state>" +
" <end-state name='end' />" +
"</process-definition>"
);
// Let's open a new persistence session
JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
// ... and begin a transaction on the persistence session
jbpmSession.beginTransaction();
// Save the process definition in the database
jbpmSession
.getGraphSession()
.saveProcessDefinition(processDefinition);
// Commit the transaction
jbpmSession.commitTransaction();
// And close the jbpmSession.
jbpmSession.close();
}
public void processInstanceIsCreatedWhenUserSubmitsWebappForm() {
// The code in this method could be inside a struts-action
// or a JSF managed bean.
// Let's open a new persistence session
JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
// ... and begin a transaction on the persistence session.
jbpmSession.beginTransaction();
// Now we can query the database for the process definition that we
// deployed above.
ProcessDefinition processDefinition =
jbpmSession
.getGraphSession()
.findLatestProcessDefinition("hello world");
// With the processDefinition that we retrieved from the database, we
// can create an execution of the process definition just like in the
// hello world example (which was without persistence).
ProcessInstance processInstance =
new ProcessInstance(processDefinition);
Token token = processInstance.getRootToken();
assertEquals("start", token.getNode().getName());
// Let's start the process execution
token.signal();
// Now the process is in the state 's'.
assertEquals("s", token.getNode().getName());
// Now the processInstance is saved in the database. So the
// current state of the execution of the process is stored in the
// database.
jbpmSession
.getGraphSession()
.saveProcessInstance(processInstance);
// The method below will get the process instance back out
// of the database and resume execution by providing another
// external signal.
// At the end of the webapp action, the transaction is committed.
jbpmSession.commitTransaction();
// And close the jbpmSession.
jbpmSession.close();
}
public void theProcessInstanceContinuesWhenAnAsyncMessageIsReceived() {
// The code in this method could be the content of a message driven bean.
// Let's open a new persistence session.
JbpmSession jbpmSession = jbpmSessionFactory.openJbpmSession();
// ... and begin a transaction on the persistence session
// note that it's also possible to use a jdbc connection from a
// DataSource in your application server.
jbpmSession.beginTransaction();
GraphSession graphSession = jbpmSession.getGraphSession();
// First, we need to get the process instance back out of the database.
// There are several options to know what process instance we are dealing
// with here. The easiest in this simple test case is just to look for
// the full list of process instances. That should give us only one
// result. So let's look up the process definition.
ProcessDefinition processDefinition =
graphSession.findLatestProcessDefinition("hello world");
// Now, we search for all process instances of this process definition.
List processInstances =
graphSession.findProcessInstances(processDefinition.getId());
// Because we know that in the context of this unit test, there is
// only one execution. In real life, the processInstanceId can be
// extracted from the content of the message that arrived or from
// the user making a choice.
ProcessInstance processInstance =
(ProcessInstance) processInstances.get(0);
// Now we can continue the execution. Note that the processInstance
// delegates signals to the main path of execution (=the root token).
processInstance.signal();
// After this signal, we know the process execution should have
// arrived in the end-state.
assertTrue(processInstance.hasEnded());
// Now we can update the state of the execution in the database
graphSession.saveProcessInstance(processInstance);
// At the end of the MDB, the transaction is committed.
jbpmSession.commitTransaction();
// And the jbpmSession is closed.
jbpmSession.close();
}
}
--------------------------------------------------------------
To reply to this message visit the message page: http://community.jboss.org/message/518922#518922
More information about the jboss-user
mailing list