继上篇博客:【整合篇】JBPM4.4业务与流程整合之查询 应用第二种方式:申请实体中加入需要的相应的工作流的属性
在真正应用之前我们先来简单介绍一下在Activiti中比JBPM4.4的一处优化。
在activiti中,它为我们提供了一个businessKey字段。
在启动流程时,流程实例中会添加一条记录,而且流程实例表中会有一个businessKey字段,String
businessKey = leave.getId().toString();这样我们的流程表中就始终拥有业务的id,当我们再次需要的时候可以重新查询。
下面举例说明:
- /**
- * 任务列表ERROR [stderr] (http-localhost/127.0.0.1:8080-3) ScriptEngineManager providers.next(): javax.script.ScriptEngineFactory: Provider com.sun.script.javascript.RhinoScriptEngineFactory not found
- *
- * @param leave
- */
- @RequestMapping(value = "list/task")
- public ModelAndView taskList(HttpSession session, HttpServletRequest request) {
- List<Leave> results = new ArrayList<Leave>();
- String userId = UserUtil.getUserFromSession(session).getId();
- results=abstractTaskList(userId);
- return new ModelAndView("/oa/leave/taskList","results",results);
-
- }
- /**
- * 抽象出来的查看任务列表,与基本业务无关
- *
- * @param userId 用户id
- * @return
- */
- public List<Leave> abstractTaskList(String userId){
- List<Leave> results = new ArrayList<Leave>();
- // 根据当前人的ID查询
- TaskQuery taskQuery = taskService.createTaskQuery().taskCandidateOrAssigned(userId);
- List<Task> tasks = taskQuery.list();
- int i=0;
-
- // 根据流程的业务ID查询实体并关联
- for (Task task : tasks) {
- String processInstanceId = task.getProcessInstanceId();
- ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).active().singleResult();
- String businessKey = processInstance.getBusinessKey();
- if (businessKey == null) {
- continue;
- }
- Leave leave=updateEntity(processInstance,task,businessKey);
- results.add(leave);
- i=i+1;
- }
- return results;
- }
- //更新实体
- public Leave updateEntity(ProcessInstance processInstance,Task task,String businessKey){
- Leave leave = leaveBean.findEntityById(businessKey);
- leave.setProcessInstance(processInstance);
- leave.setProcessDefinition(getProcessDefinition(processInstance.getProcessDefinitionId()));
- leave.setTask(task);
- return leave;
- }
对比:
之前的JBPM的操作方式,启动流程时将业务数据存储到流程变量中,在需要查询时,将数据从流程变量中取出,然后将取出的值赋给我们的组合实体即可。这样做的弊端在于数据可能会出现不同步的情况,但是应该并不多见。
其实使用这种方式呢,即使在实体层添加了工作流的属性,但是并不需要在真正的数据库表中添加相应的字段,那么这样做的便利在哪里呢?其实这样做主要是使得我们在返回前台数据时更加方便,我们只需要返回一个实体即可。但是弊端是什么呢,就是业务的实体中需要知道一些工作流的属性。
而且弊端不仅如此,在大型系统中,相当于实体层需要加入所有的依赖工作流的jar包,如果这个实体还需要被其他系统所依赖,那么所有的系统都会有工作流的依赖,我们曾遇到的问题就是,当我们在当前系统的实体项目中加入工作流的依赖时,由于其他系统也依赖我们本实体,导致所有的系统均瘫痪jboss不能正常启动,报不识别工作流的类。这种影响就是深远的,所以我们要实现的还是解耦。
下篇继续
|