免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2624 | 回复: 1
打印 上一主题 下一主题

关于JBPM4.4无法删除历史数据的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-05 17:18 |只看该作者 |倒序浏览

关于JBPM4.4无法删除历史数据的问题








JBPM无疑是业界最好的开源工作流引擎,但是从4.0到4.4这几个版本使用过来,还是存在不少的bug。

由于为了解决fork join节点的汇聚条件设置的bug,我们升级到了4.4,但是同时发现出现另外的问题,就是在删除一个已经关闭的流程时,会报错:Can't delete processInstance,no processInstance found for the given id。

这个问题在早期版本里不会出现。

看了下源码,原因是在关闭一个工单(流程结束)时,jbpm会自动调用deleteProcessInstance方法,删除jbpm_task表里的数据。

而此后再调用executionService.deleteProcessInstanceCascade()方法,按照源码的写法,显然是不成功的:

修改源码DbSessionImpl.java里的deleteProcessInstance方法即可:




[java] view plaincopy
  1. 01.public void deleteProcessInstance(String processInstanceId, boolean deleteHistory) {  
  2. 02.        if (processInstanceId == null) {  
  3. 03.            throw new JbpmException("processInstanceId is null");  
  4. 04.        }  
  5. 05.        // if history should be deleted  
  6. 06.        if (deleteHistory && (isHistoryEnabled())) {  
  7. 07.            // try to get the history  
  8. 08.            HistoryProcessInstanceImpl historyProcessInstance = findHistoryProcessInstanceById(processInstanceId);  
  9. 09.            // if there is a history process instance in the db  
  10. 10.            if (historyProcessInstance != null) {  
  11. 11.                if (log.isDebugEnabled()) {  
  12. 12.                    log.debug("deleting history process instance " + processInstanceId);  
  13. 13.                }  
  14. 14.                session.delete(historyProcessInstance);  
  15. 15.            }  
  16. 16.        <span style="color:#FF6666;"><span style="background-color: rgb(255, 255, 255);">} else {</span></span>  
  17. 17.            ExecutionImpl processInstance = (ExecutionImpl) findProcessInstanceByIdIgnoreSuspended(processInstanceId);  
  18. 18.            if (processInstance != null) {  
  19. 19.                deleteSubProcesses(processInstance, deleteHistory);  
  20. 20.                // delete remaining tasks for this process instance  
  21. 21.                List<TaskImpl> tasks = findTasks(processInstanceId);  
  22. 22.                for (TaskImpl task : tasks) {  
  23. 23.                    session.delete(task);  
  24. 24.                }  
  25. 25.                // delete remaining jobs for this process instance  
  26. 26.                JobImpl currentJob = EnvironmentImpl.getFromCurrent(JobImpl.class, false);  
  27. 27.                List<JobImpl> jobs = findJobs(processInstanceId);  
  28. 28.                for (JobImpl job : jobs) {  
  29. 29.                    if (job != currentJob) {  
  30. 30.                        session.delete(job);  
  31. 31.                    }  
  32. 32.                }  
  33. 33.                if (log.isDebugEnabled()) {  
  34. 34.                    log.debug("Deleting process instance " + processInstanceId);  
  35. 35.                }  
  36. 36.                session.delete(processInstance);  
  37. 37.            } else {  
  38. 38.                throw new JbpmException("Can't delete processInstance " + processInstanceId + ": no processInstance found for the given id");  
  39. 39.            }  
  40. 40.        <span style="color:#FF6666;">}</span>  
  41. 41.    }  
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-03-05 17:19 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP