[jboss-user] [JBoss jBPM] - jumping to a new task node

akriel do-not-reply at jboss.com
Fri Apr 17 15:22:38 EDT 2009


For various reasons within my app that is using JBPM I need to be able to abort all current tasks and jump to a different location in the process under certain circumstances (specifically if at any time the underlying data is updated). I have written a tag to do this though it isn't quite working the way I expected.

The code will create the task I specify, but it sometimes create two of them, and sometimes will also create an additional task form my startnode. I know I must be missing something but I can't see what.

Any help is greatly appreciated.


  | public class RestartToNodeActionListener implements JbpmActionListener 
  | {
  | 	private final ValueExpression processInstanceExpression;
  | 	private final ValueExpression toNodeExpression;
  | 	
  | 	public RestartToNodeActionListener( final ValueExpression processInstance, final ValueExpression toNode )
  | 	{
  | 		processInstanceExpression = processInstance;
  | 		toNodeExpression = toNode;
  | 	}
  | 	
  | 	public String getName() 
  | 	{
  | 		return "restartToNodeActionListener";
  | 	}
  | 
  | 	public void handleAction( JbpmJsfContext context, ActionEvent event ) 
  | 	{
  | 	       try 
  | 	       {
  | 	            final FacesContext facesContext = FacesContext.getCurrentInstance();
  | 	            final ELContext elContext = facesContext.getELContext();
  | 	            ProcessInstance processInstance = ( ProcessInstance ) processInstanceExpression.getValue( elContext );
  | 			String toNodeName = ( String ) toNodeExpression.getValue( elContext );
  | 	            
  | 	            // get the task manager
  | 	            TaskMgmtInstance taskManager = processInstance.getTaskMgmtInstance();
  | 	            
  | 	            // get the old root token
  | 	            Token oldRoot = processInstance.getRootToken();
  | 	            	            
  | 	            // get the def so we can find the start node
  | 	            ProcessDefinition processDefinition = processInstance.getProcessDefinition();
  | 	            
  | 	            // get the start node to create the new root token
  | 	            Node startNode = processDefinition.getStartState();
  | 	            
  | 	            // get all tasks for the current instance
  | 	            List<TaskInstance> tasks = new ArrayList<TaskInstance>( taskManager.getTaskInstances() );
  | 	            
  | 	            int taskCount = tasks.size();
  | 	            for ( int i = 0; i < taskCount; i++ )
  | 	            {
  | 	            	TaskInstance taskInstance = tasks.get( i );
  | 	            	
  | 	            	if ( taskInstance != null )
  | 	            	{
  | 		            	// remove each task instance
  | 		            	taskManager.removeTaskInstance( taskInstance );
  | 		            	
  | 					// if the task is active cancel it
  | 		            	if ( taskInstance.isOpen() && !taskInstance.isCancelled() )
  | 		            	{
  | 			            	// try to cancel the task instance
  | 			            	taskInstance.cancel();
  | 		            	}
  | 	            	}
  | 	            }
  | 	            
  | 			// added this because not all tasks were being canceled and was hoping it would be a catch all.
  | 	            taskManager.endAll();
  | 	            
  | 			// get the task definition manager
  | 	            TaskMgmtDefinition taskManagerDefinition = taskManager.getTaskMgmtDefinition();
  | 	            
  | 			// set the node we want to jump to
  | 	            Task startTask = taskManagerDefinition.getTask( toNodeName );
  | 
  | 			// get the node to move the root token to
  | 			Node startingNode = taskManagerDefinition.getProcessDefinition().getNode( toNodeName );
  | 
  | 			// set the root token to point to the node 
  | 	            oldRoot.setNode( startingNode );
  | 
  | 			// create the new task instance
  | 	            TaskInstance newStartInstance = taskManager.createTaskInstance( startTask, oldRoot );
  | 	            
  | 	            // add in a start task
  | 	            taskManager.addTaskInstance( newStartInstance );
  | 	           	            
  | 	            
  | 	            context.selectOutcome("success");
  | 	        } 
  | 	        catch ( Exception ex ) 
  | 	        {
  | 	            context.setError( "Error clearing tasks and resetting to task", ex );
  | 	            return;
  | 	        }
  | 	}
  | 
  | }
  | 

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

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



More information about the jboss-user mailing list