[jboss-user] [JBoss jBPM] - Problems with deleting a process instance of a complex proce

jits_1998 do-not-reply at jboss.com
Wed Nov 8 01:28:33 EST 2006


Hi,

We have a complex process with multiple sub-processes, tasks and multiple child tokens in the subprocesses.

We found that GraphSession.deleteProcessInstance() method is unable to delete the process instance.
It falls short on following points:
1) It is not deleting the taskinstances, though it creates the query but it is never executed.
2) It is not deleting the sub-process and their child tokens, which are not refered by "token.getSubProcessInstance".

Here is an updated version of deleteProcessInstance() that works for us:

  | public void deleteProcessInstance(ProcessInstance processInstance, boolean includeTasks, boolean includeJobs) {
  | 	    if (processInstance==null) throw new JbpmException("processInstance is null in JbpmSession.deleteProcessInstance()");
  | 	    try {
  | 	      // find the tokens
  | 	      Query query = session.getNamedQuery("GraphSession.findTokensForProcessInstance");
  | 	      query.setEntity("processInstance", processInstance);
  | 	      List tokens = query.list();
  | 	      
  | 	      // deleteSubProcesses
  | 	      Iterator iter = tokens.iterator();
  | 	      while (iter.hasNext()) {
  | 	        Token token = (Token) iter.next();
  | 	        deleteSubProcesses(token);
  | 
  | 	      }
  | 
  | 	      // jobs
  | 	      if (includeJobs) {
  | 	        query = session.getNamedQuery("GraphSession.deleteJobsForProcessInstance");
  | 	        query.setEntity("processInstance", processInstance);
  | 	        query.executeUpdate();
  | 	      }
  | 	      
  | 	      // tasks
  | 	      if (includeTasks) {
  | 	        query = session.getNamedQuery("GraphSession.findTaskInstanceIdsForProcessInstance");
  | 	        query.setEntity("processInstance", processInstance);
  | 	        List taskInstances = query.list();
  | 	        if(taskInstances.size()>0){
  | 	        	List<Long> taskInstancesId = new ArrayList<Long>();
  | 	        	for(Object ti: taskInstances)
  | 	        	{
  | 	        		taskInstancesId.add(((TaskInstance)ti).getId());
  | 	        	}
  | 	        	query = session.getNamedQuery("GraphSession.deleteTaskInstancesById");
  | 	        	query.setParameterList("taskInstanceIds",taskInstancesId);
  | 	        	query.executeUpdate();
  | 	        }
  | 	        
  | 	        
  | 	      }
  | 	       
  | 	      // delete the logs for all the process instance's tokens
  | 	      query = session.getNamedQuery("GraphSession.selectLogsForTokens");
  | 	      query.setParameterList("tokens", tokens);
  | 	      List logs = query.list();
  | 	      iter = logs.iterator();
  | 	      while (iter.hasNext()) {
  | 	        session.delete(iter.next());
  | 	      }
  | 	      
  | 	      iter = tokens.iterator();
  | 	      while(iter.hasNext()){
  | 	    	  Token token = (Token)iter.next();
  | 	    	  if(processInstance.getRootToken().getId()!= token.getId())
  | 	    	  session.delete(token);
  | 	      }
  |               
  | 
  | 
  | 	      // then delete the process instance
  | 	      session.delete(processInstance);
  | 	      
  | 	    } catch (Exception e) {
  | 	      e.printStackTrace(); 
  | 	      log.error(e);
  | 	      throw new JbpmException("couldn't delete process instance '" + processInstance.getId() + "'", e);
  | 	    } 
  | 	  }
  | 

The "ProcessSession.findSubprocessByToken" query is as follows:

  |  select pi
  |       from org.jbpm.graph.exe.ProcessInstance as pi
  |       where pi.superProcessToken = :token
  | 

Hope it helps... I have not checked Jira for any such known issues, please let me know if I need to raise this ticket.

Regards,
Jitendra

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

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



More information about the jboss-user mailing list