[jboss-user] [JBoss jBPM] - Re: is it possible to force the token jump from one node to

rossputin do-not-reply at jboss.com
Thu May 8 06:52:24 EDT 2008


Hi dleerob,

me again.. hope you can help.  I put together a little test class, pretty much lifted from yours, in order to reverse a process, (go back a couple of tasks) to sort out an issue documented in another post on this forum - topic 4149385.


  |   protected final Log logger = LogFactory.getLog(getClass());
  |   
  |   JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
  |   DbPersistenceServiceFactory dbPersistenceServiceFactory = (DbPersistenceServiceFactory) jbpmConfiguration.getServiceFactory(Services.SERVICENAME_PERSISTENCE);
  | 
  |   JbpmContext jbpmContext;
  |   
  |   ProcessInstance processInstance;
  | 
  |   public ProcessRouter() {
  |   	logger.info("Constructing ProcessRouter");
  |   	
  |   	// Grab a handle on to the jbpmContext
  |   	jbpmContext = jbpmConfiguration.createJbpmContext();
  |   }
  | 
  |   protected void reroute (long processInstanceId, Long tokenId, String nodeName) {
  |         logger.info("Rerouting token : " + tokenId + ", to node : " + nodeName + " on process : " + processInstanceId);
  |   	
  |   	// Grab the process we want to operate on
  |   	processInstance = jbpmContext.getProcessInstance(processInstanceId);
  |   	
  |         // Grab the token we want to reroute
  |   	Token token = jbpmContext.getToken(tokenId);
  |   	
  |   	// Grab the node we want to reroute to
  |   	Node newNode = processInstance.getProcessDefinition().getNode(nodeName);
  |   	
  |   	logger.debug("successfully grabbed process instance : " + processInstance.getId() + ", token : " + token.getId() + " and node : " + newNode.getName());
  |   	
  |   	// Cancel current incomplete task instances
  |   	logger.debug("cancelling task instances found at token : " + tokenId);
  |   	List deleteTaskInstanceList = new ArrayList();
  |         //create a separate list of those task instances to delete. If deleting them
  | 		//straight from iterator, a ConcurrentModificationException will occur when calling it.next(); 
  | 		for(Iterator it = processInstance.getTaskMgmtInstance().getTaskInstances().iterator(); it.hasNext();) {
  | 			TaskInstance taskInstance = (TaskInstance)it.next();
  | 			if(tokenId.equals(taskInstance.getToken().getId() + "")) {
  | 				if (taskInstance.getEnd() == null) { //not complete task
  | 					deleteTaskInstanceList.add(taskInstance);
  | 				}
  | 			}
  | 		}
  |   	
  | 		for (int x = 0; x < deleteTaskInstanceList.size(); x++) {
  | 			TaskInstance taskInstance = (TaskInstance)deleteTaskInstanceList.get(x);
  | 			//Clear local variables
  | 			//We must clear local variables, or task instance will save variables
  | 			//from previous instance. We must not delete them, but rather set them
  | 			//to blank, or an exception will be thrown if the variables were 
  | 			//set to 'required' in the process definition.
  | 			Map localVariables = taskInstance.getVariablesLocally();
  | 			for (Iterator it = localVariables.keySet().iterator(); it.hasNext();) {
  | 				String variableName = (String)it.next();
  | 				taskInstance.setVariableLocally(variableName, "");
  | 			}
  | 			
  | 			logger.info("cancelling task instance with ID : '"+taskInstance.getId()+"'");
  | 			boolean overwriteSwimlane = false; //don't overwrite swimlane actor
  | 			taskInstance.setActorId("[rerouted by pctadmin]", overwriteSwimlane);
  | 			taskInstance.setSignalling(false);
  | 			//Workaround to stop task-end event from firing when we cancel a task instance. 
  | 			//Remove event, cancel task instance, add event again
  | 			Task task = taskInstance.getTask();
  | 			Event endTaskEvent = task.getEvent(Event.EVENTTYPE_TASK_END);
  | 			if (endTaskEvent != null) {
  | 				task.removeEvent(endTaskEvent);					
  | 			}
  | 			taskInstance.cancel();
  | 			if (endTaskEvent != null) {
  | 				task.addEvent(endTaskEvent);					
  | 			}
  | }
  | 		
  | 		// Perform the reroute step
  | 		newNode.enter(new ExecutionContext(token));
  | 		
  | 		logger.info("Token with ID : " + token.getId() + " was rerouted to node : " + nodeName);
  |   	
  |   	// Perform some tidying up
  |   	jbpmContext.close();
  |     dbPersistenceServiceFactory.dropSchema();
  |     jbpmContext = null;
  |   }
  | 
  |   public static void main (String args[]) {  	
  |   	// Create a ProcessRouter
  |   	ProcessRouter pRouter = new ProcessRouter();
  |   	
  |   	// For now hardcode the parameters in the main method
  |   	long processInstanceId = 787;
  |   	Long tokenId = new Long(920);
  |   	String nodeName = "sm allocate dm";
  |   	
  |   	pRouter.reroute(processInstanceId, tokenId, nodeName);
  |   }
  | 

This code is running from Eclipse, talking to mysql 5, version 3.2.1 of the JBPM.  It seems to more or less do what I expect, generating the node requested, however, I seem to lose several of my tables sometimes when I run it.  I lost jbpm_taskinstance on one occasion, jbpm_id_user on another, and several others.

My hibernate.cfg.xml used locally within the project is listed below.


  | <?xml version='1.0' encoding='utf-8'?>
  | 
  | <!DOCTYPE hibernate-configuration PUBLIC
  |           "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  |           "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  | 
  | <hibernate-configuration>
  |   <session-factory>
  | 
  |     <!-- hibernate dialect -->
  |     <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
  | 
  |     <!-- JDBC connection properties (begin) ===-->
  |     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  |     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/jbpmtest</property>
  |     <property name="hibernate.connection.username">someuser</property>
  |     <property name="hibernate.connection.password">somepassword</property>
  |     <!--==== JDBC connection properties (end) -->
  |     
  |     <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
  |     
  |     <!-- DataSource properties (begin) 
  |     <property name="hibernate.connection.datasource">java:/JbpmDS</property>
  |     DataSource properties (end) -->
  |     
  |     <!-- JTA transaction properties (begin) === -->
  |     <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
  |     <!--<property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>-->
  |     <!--==== JTA transaction properties (end) -->
  | 
  |     <!-- CMT transaction properties (begin) ===
  |     <property name="hibernate.transaction.factory_class">org.hibernate.transaction.CMTTransactionFactory</property>
  |     <property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>
  |     ==== CMT transaction properties (end) -->
  | 
  |     <!-- logging properties (begin) ===
  |     <property name="hibernate.show_sql">true</property>
  |     <property name="hibernate.format_sql">true</property>
  |     <property name="hibernate.use_sql_comments">true</property>
  |     ==== logging properties (end) -->
  |     
  |     <!-- ############################################ -->
  |     <!-- # mapping files with external dependencies # -->
  |     <!-- ############################################ -->
  | 
  |     <!-- following mapping file has a dependendy on   -->
  |     <!-- 'bsh-{version}.jar'.                         -->
  |     <!-- uncomment this if you don't have bsh on your -->
  |     <!-- classpath.  you won't be able to use the     -->
  |     <!-- script element in process definition files   -->
  |     <mapping resource="org/jbpm/graph/action/Script.hbm.xml"/>
  | 
  |     <!-- following mapping files have a dependendy on  -->
  |     <!-- 'jbpm-identity.jar', mapping files            -->
  |     <!-- of the pluggable jbpm identity component.     -->
  |     <!-- Uncomment the following 3 lines if you        -->
  |     <!-- want to use the jBPM identity mgmgt           -->
  |     <!-- component.                                    -->
  |     <!-- identity mappings (begin) -->
  |     <mapping resource="org/jbpm/identity/User.hbm.xml"/>
  |     <mapping resource="org/jbpm/identity/Group.hbm.xml"/>
  |     <mapping resource="org/jbpm/identity/Membership.hbm.xml"/>
  |     <!-- identity mappings (end) -->
  |     
  |     <!-- following mapping files have a dependendy on  -->
  |     <!-- the JCR API                                   -->
  |     <!-- jcr mappings (begin) ===
  |     <mapping resource="org/jbpm/context/exe/variableinstance/JcrNodeInstance.hbm.xml"/>
  |     ==== jcr mappings (end) -->
  | 
  | 
  |     <!-- ###################### -->
  |     <!-- # jbpm mapping files # -->
  |     <!-- ###################### -->
  | 
  |     <!-- hql queries and type defs -->
  |     <mapping resource="org/jbpm/db/hibernate.queries.hbm.xml" />
  | 
  |     <!-- graph.action mapping files -->
  |     <mapping resource="org/jbpm/graph/action/MailAction.hbm.xml"/>
  |     
  |     <!-- graph.def mapping files -->
  |     <mapping resource="org/jbpm/graph/def/ProcessDefinition.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/def/Node.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/def/Transition.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/def/Event.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/def/Action.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/def/SuperState.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/def/ExceptionHandler.hbm.xml"/>
  |     <mapping resource="org/jbpm/instantiation/Delegation.hbm.xml"/>
  | 
  |     <!-- graph.node mapping files -->
  |     <mapping resource="org/jbpm/graph/node/StartState.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/node/EndState.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/node/ProcessState.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/node/Decision.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/node/Fork.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/node/Join.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/node/MailNode.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/node/State.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/node/TaskNode.hbm.xml"/>
  | 
  |     <!-- context.def mapping files -->
  |     <mapping resource="org/jbpm/context/def/ContextDefinition.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/def/VariableAccess.hbm.xml"/>
  | 
  |     <!-- taskmgmt.def mapping files -->
  |     <mapping resource="org/jbpm/taskmgmt/def/TaskMgmtDefinition.hbm.xml"/>
  |     <mapping resource="org/jbpm/taskmgmt/def/Swimlane.hbm.xml"/>
  |     <mapping resource="org/jbpm/taskmgmt/def/Task.hbm.xml"/>
  |     <mapping resource="org/jbpm/taskmgmt/def/TaskController.hbm.xml"/>
  | 
  |     <!-- module.def mapping files -->
  |     <mapping resource="org/jbpm/module/def/ModuleDefinition.hbm.xml"/>
  | 
  |     <!-- bytes mapping files -->
  |     <mapping resource="org/jbpm/bytes/ByteArray.hbm.xml"/>
  | 
  |     <!-- file.def mapping files -->
  |     <mapping resource="org/jbpm/file/def/FileDefinition.hbm.xml"/>
  | 
  |     <!-- scheduler.def mapping files -->
  |     <mapping resource="org/jbpm/scheduler/def/CreateTimerAction.hbm.xml"/>
  |     <mapping resource="org/jbpm/scheduler/def/CancelTimerAction.hbm.xml"/>
  | 
  |     <!-- graph.exe mapping files -->
  |     <mapping resource="org/jbpm/graph/exe/Comment.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/exe/ProcessInstance.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/exe/Token.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/exe/RuntimeAction.hbm.xml"/>
  | 
  |     <!-- module.exe mapping files -->
  |     <mapping resource="org/jbpm/module/exe/ModuleInstance.hbm.xml"/>
  |         
  |     <!-- context.exe mapping files -->
  |     <mapping resource="org/jbpm/context/exe/ContextInstance.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/exe/TokenVariableMap.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/exe/VariableInstance.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/exe/variableinstance/ByteArrayInstance.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/exe/variableinstance/DateInstance.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/exe/variableinstance/DoubleInstance.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/exe/variableinstance/HibernateLongInstance.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/exe/variableinstance/HibernateStringInstance.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/exe/variableinstance/LongInstance.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/exe/variableinstance/NullInstance.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/exe/variableinstance/StringInstance.hbm.xml"/>
  | 
  |     <!-- job mapping files -->
  |     <mapping resource="org/jbpm/job/Job.hbm.xml"/>
  |     <mapping resource="org/jbpm/job/Timer.hbm.xml"/>
  |     <mapping resource="org/jbpm/job/ExecuteNodeJob.hbm.xml"/>
  |     <mapping resource="org/jbpm/job/ExecuteActionJob.hbm.xml"/>
  | 
  |     <!-- taskmgmt.exe mapping files -->
  |     <mapping resource="org/jbpm/taskmgmt/exe/TaskMgmtInstance.hbm.xml"/>
  |     <mapping resource="org/jbpm/taskmgmt/exe/TaskInstance.hbm.xml"/>
  |     <mapping resource="org/jbpm/taskmgmt/exe/PooledActor.hbm.xml"/>
  |     <mapping resource="org/jbpm/taskmgmt/exe/SwimlaneInstance.hbm.xml"/>
  | 
  |     <!-- logging mapping files -->
  |     <mapping resource="org/jbpm/logging/log/ProcessLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/logging/log/MessageLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/logging/log/CompositeLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/log/ActionLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/log/NodeLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/log/ProcessInstanceCreateLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/log/ProcessInstanceEndLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/log/ProcessStateLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/log/SignalLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/log/TokenCreateLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/log/TokenEndLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/graph/log/TransitionLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/log/VariableLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/log/VariableCreateLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/log/VariableDeleteLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/log/VariableUpdateLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/log/variableinstance/ByteArrayUpdateLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/log/variableinstance/DateUpdateLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/log/variableinstance/DoubleUpdateLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/log/variableinstance/HibernateLongUpdateLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/log/variableinstance/HibernateStringUpdateLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/log/variableinstance/LongUpdateLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/context/log/variableinstance/StringUpdateLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/taskmgmt/log/TaskLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/taskmgmt/log/TaskCreateLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/taskmgmt/log/TaskAssignLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/taskmgmt/log/TaskEndLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/taskmgmt/log/SwimlaneLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/taskmgmt/log/SwimlaneCreateLog.hbm.xml"/>
  |     <mapping resource="org/jbpm/taskmgmt/log/SwimlaneAssignLog.hbm.xml"/>
  |     
  |     <!--  Custom Task -->
  |     <mapping resource="com/somepackage/workflow/taskinstance/CustomTaskInstance.hbm.xml"/>
  |     
  |   </session-factory>
  | </hibernate-configuration>
  | 

I feel I am close to being able to move backwards within the process, but unfortunately parts of the database are destroyed in the process.  I suppose I am missing something glaringly obvious here.  Do you have any ideas?

Thanks in advance for your help,

regards

Ross



View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4149389#4149389

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4149389



More information about the jboss-user mailing list