首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

物流ERP Activiti5.8 的使用一 - 排他网关和流程的ReceiveTask的应用

2012-08-09 
物流ERP Activiti5.8 的应用一 -- 排他网关和流程的ReceiveTask的应用先上流程实例: ?BPMN 排他网关(那个X

物流ERP Activiti5.8 的应用一 -- 排他网关和流程的ReceiveTask的应用

先上流程实例: 物流ERP Activiti5.8 的使用一 - 排他网关和流程的ReceiveTask的应用

?

BPMN 排他网关(那个X状符号)是指分支的执行路径不可以并行,只能走一条执行路径

?

ReceiveTask 是一个特殊的任务节点,他不能用taskService.complete驱动,流程执行至此就“中断”了,需外来的消息来驱动流程执行执行
所有有一个标识符。

测试代码如下:

?

package com.annto;import static org.junit.Assert.*;import java.io.BufferedInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.HashMap;import java.util.List;import org.activiti.engine.HistoryService;import org.activiti.engine.ProcessEngine;import org.activiti.engine.RepositoryService;import org.activiti.engine.RuntimeService;import org.activiti.engine.TaskService;import org.activiti.engine.history.HistoricActivityInstance;import org.activiti.engine.history.HistoricProcessInstance;import org.activiti.engine.impl.RepositoryServiceImpl;import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;import org.activiti.engine.impl.pvm.process.ActivityImpl;import org.activiti.engine.impl.task.TaskDefinition;import org.activiti.engine.repository.Deployment;import org.activiti.engine.runtime.ProcessInstance;import org.activiti.engine.task.Task;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:com/annto/SpringTransactionIntegrationTest-context.xml")public class MyProcessTest {@Autowiredprivate ProcessEngine processEngine;@Autowiredprivate RuntimeService runtimeService;@Autowiredprivate TaskService taskService;@AutowiredRepositoryService repositoryService;@Testpublic void simpleProcessTest() throws Exception {Deployment deployment = repositoryService.createDeployment().addClasspathResource("test/付款申请签字审批流程.bpmn20.xml").deploy();System.out.println("deploymentId:" + deployment.getId());// 获取流程定义ProcessDefinitionEntity processDefEn = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).createProcessDefinitionQuery().processDefinitionName("付款申请签字审批流程").singleResult();System.out.println("definitionId : " + processDefEn.getId());processDefEn = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(processDefEn.getId());assertNotNull(processDefEn.getTaskDefinitions());assert (processDefEn.getTaskDefinitions().size() > 0);// 通过流程实例获取printProcessTasks(processDefEn);System.out.println("find process def " + processDefEn.getTaskDefinitions());HashMap map = new HashMap();map.put("price", 5000);map.put("this_出纳_财务经理", "herist");map.put("区域成本", "herist");map.put("this_出纳_财务经理", "herist");// 启动流程ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("付款申请签字审批流程", map);System.out.println("Started Process instance id " + processInstance.getProcessInstanceId());Task task = null;do {task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult();if (task != null) {System.out.print("\n--找到-- " + task.getName());taskService.complete(task.getId());System.out.print("  完成  \n" + processInstance.isEnded());renderStatusImg(processInstance);}} while (task != null);HistoryService historySvc = processEngine.getHistoryService();HistoricProcessInstance hisProcInst = historySvc.createHistoricProcessInstanceQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult();System.err.println("ended " + hisProcInst.getEndTime() + " . " + hisProcInst.getEndActivityId());HistoricActivityInstance hisActInst = historySvc.createHistoricActivityInstanceQuery().processInstanceId(processInstance.getProcessInstanceId()).unfinished().singleResult();System.err.println("alive act " + hisActInst.getActivityName());renderStatusImg(processInstance);//signal 驱动节点到完成状态this.runtimeService.signal(processInstance.getProcessInstanceId());hisProcInst = historySvc.createHistoricProcessInstanceQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult();System.err.println("ended " + hisProcInst.getEndTime() + " . " + hisProcInst.getEndActivityId());}/** * 绘制状态图 和 审批活动的状态图 *  * @param processInstance * @throws IOException */private void renderStatusImg(ProcessInstance processInstance) throws IOException {processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult();if (processInstance == null || processInstance.isEnded()) {System.err.println("流程结束");return;}String definitionId = processInstance.getProcessDefinitionId();ProcessDefinitionEntity processDefEn = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(definitionId);// 获得当前活动,并绘制状态图List<String> activeIds = runtimeService.getActiveActivityIds(processInstance.getId());String actName = processEngine.getHistoryService().createHistoricActivityInstanceQuery().activityId(activeIds.get(0)).singleResult().getActivityName();InputStream inputStream = ProcessDiagramGenerator.generateDiagram(processDefEn, "png", activeIds);saveToFile(actName + ".png", inputStream);}/** * 获取流程定义的所有任务,打印之 */public void printProcessTasks(ProcessDefinitionEntity processDefEn) throws Exception {for (String taskKey : processDefEn.getTaskDefinitions().keySet()) {TaskDefinition taskDef = processDefEn.getTaskDefinitions().get(taskKey);System.out.println(taskKey + ": " + taskDef.getNameExpression());}for (ActivityImpl actvity : processDefEn.getActivities()) {if(processDefEn.getTaskDefinitions().containsKey(actvity.getId()))System.out.println( "actvity: " + processDefEn.getTaskDefinitions().get(actvity.getId()).getAssigneeExpression());elseSystem.out.println( "actvity: " + actvity.getId());}}public void saveToFile(String fileName, InputStream in) throws IOException {FileOutputStream fos = null;BufferedInputStream bis = null;// URL url = null;int BUFFER_SIZE = 1024;byte[] buf = new byte[BUFFER_SIZE];int size = 0;bis = new BufferedInputStream(in);// //建立文件fos = new FileOutputStream(fileName);//// //保存文件while ((size = bis.read(buf)) != -1)fos.write(buf, 0, size);//fos.close();bis.close();}}

?

执行过程的图片:

?
物流ERP Activiti5.8 的使用一 - 排他网关和流程的ReceiveTask的应用

?



物流ERP Activiti5.8 的使用一 - 排他网关和流程的ReceiveTask的应用
?

?


?流程执行结束:
ended Mon Jun 18 21:12:48 CST 2012 . endevent1
?

?

应用场景:

?

在物流ERP中做业务流程整合,有部分流程是历史模块的应用,一个业务执行逻辑可能包括n个人工维护系统数据 + 系统后台的Job处理过程,如:报销流程的最后一个环节为系统的付款操作(需要人工执行批量支付,然后Job负责定时往Oracle ERP中记账,再通过Job把付款状态回写到本系统中来,再继续执行网银的付款,所以短时间内,未能把每个业务操作都整合到流程节点来,所以可以用一个Receive Task节点来表示一个这个付款业务,在这个节点结束之后,流程才真正完成!

热点排行