[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