Hi Ronald, I'm posting here the code.
Web service
| @WebService(name = "ProcessTestService", targetNamespace =
"http://test/ws", serviceName = "ProcessTestService")
| @SOAPBinding(style = SOAPBinding.Style.RPC)
| public class ProcessTestService {
|
| public String testInTransaction(String param1) throws Exception {
| Map request = new HashMap();
| StatelessEngine engine = new StatelessEngine();
| Object o = engine.executeProcessInstance("test-som-process",
request);
| return "result";
| }
|
| @WebMethod
| public String test(String param1) throws Exception {
| String retValue = null;
| UserTransaction tx = getUserTransaction();
| tx.begin();
| try {
| retValue = testInTransaction(param1);
| tx.commit();
| } catch (Exception e) {
| tx.rollback();
| throw e;
| }
| return retValue;
| }
|
| private UserTransaction getUserTransaction() {
| UserTransaction ut = null;
| try {
| InitialContext ctx = new InitialContext();
| ut = (UserTransaction) ctx.lookup("UserTransaction");
| } catch (NamingException e) {
| appLog.error("Error obtaining the UserTransaction", e);
| }
| return ut;
| }
| }
|
The engine
| import java.util.Map;
| import org.jbpm.JbpmContext;
| import org.jbpm.graph.def.ProcessDefinition;
| import org.jbpm.graph.exe.ProcessInstance;
| import org.jbpm.graph.node.EndState;
| import com.hp.som.bpm.SomJbpmEngineConfigurationMBean;
| import javax.naming.Context;
| import javax.naming.InitialContext;
| import org.jbpm.JbpmConfiguration;
|
| public class StatelessEngine{
|
| public Object executeProcessInstance(String processName, Map request) throws
Exception{
| JbpmContext ctx = null;
| try{
| ctx = getJbpmConfiguration().createJbpmContext();
|
| // Get process definition
| ProcessDefinition processDefiniton =
ctx.getGraphSession().findLatestProcessDefinition(processName);
| if (processDefiniton == null) {
| throw new Exception("Process definition not found");
| }
|
| ProcessInstance instance = new ProcessInstance(processDefiniton);
| instance.getContextInstance().setTransientVariable("REQUEST",
request);
|
| // Execute process
| do{
| instance.getRootToken().signal();
| }while (!instance.getRootToken().hasEnded());
|
| // Check that execution is on a end state. if not, throw exception
| if (!EndState.class.isAssignableFrom(instance.getRootToken()
| .getNode().getClass())) {
| throw new Exception("Process finished not in an End Node");
| }
|
| Object response =
instance.getContextInstance().getTransientVariable("RESPONSE");
| return response;
| } finally {
| if (ctx != null) ctx.close();
| }
| }
|
|
| private static JbpmConfiguration conf = null;
|
| protected JbpmConfiguration getJbpmConfiguration() throws Exception {
| if (this.conf == null){
| JbpmConfiguration config = null;
| String jndiName = null;
| Context ctx = new InitialContext();
|
| // Get jndi name for jbpm configuration
| jndiName = "java:/jbpm/JbpmConfiguration";
| config = (JbpmConfiguration)ctx.lookup(jndiName);
| this.conf = config;
| }
| return this.conf;
| }
|
| }
|
The test process
| <process-definition
| xmlns=""
| name="test-som-process">
| <start-state name="start">
| <transition name="" to="node1"></transition>
| </start-state>
| <end-state name="end">
| </end-state>
| <node name="node1">
| <action
class="com.hp.som.test.TestActionHandler"></action>
| <transition name="" to="node3"></transition>
| </node>
| <node name="node3">
| <action
class="com.hp.som.test.TestActionHandler"></action>
| <transition name="" to="node4"></transition>
| </node>
| <node name="node4">
| <action
class="com.hp.som.test.TestActionHandler"></action>
| <transition name="" to="node5"></transition>
| </node>
| <node name="node5">
| <action
class="com.hp.som.test.TestActionHandler"></action>
| <transition name="" to="node6"></transition>
| </node>
| <node name="node6">
| <action
class="com.hp.som.test.TestActionHandler"></action>
| <transition name="" to="node8"></transition>
| </node>
| <node name="node8">
| <action
class="com.hp.som.test.TestActionHandler"></action>
| <transition name="" to="end"></transition>
| </node>
| </process-definition>
|
And finally test handler
| public class TestActionHandler implements ActionHandler {
| public void execute(ExecutionContext context) throws Exception {
| try {
| // Create a process logger whith process name
| customExecute(context);
| // The action have been executed correctly
| context.getToken().signal();
| } catch (Exception e) {
| e.printStackTrace();
| throw e;
| }
| }
|
| protected void customExecute(ExecutionContext context) throws Exception {
| String param = "Do nothing important";
| }
|
| }
|
When you load test the web service, you can see how response time doubles as client
doubles, but cpu stays low.
View the original post :
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4024414#...
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&a...