- 浏览: 772818 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (208)
- Java (77)
- JavaScript (16)
- UML (1)
- Spring (24)
- Hibernate (11)
- J2EE部署 (18)
- 操作系统 (13)
- struts (11)
- jsp (3)
- J2EE (34)
- 数据库 (22)
- tomcat (4)
- apache (2)
- MyEclipse (13)
- Linux (14)
- Ext (6)
- Weblogic (2)
- 数据库 Oracle 空表导出 (1)
- Oracle (3)
- 编码 乱码 (1)
- 多线程 (5)
- jQuery (2)
- Apache Mina (1)
- ibatis (6)
- abator (1)
- svn (1)
- jvm (1)
- ERwin (2)
- mysql (2)
- ant (1)
- memcache (1)
- dubbo (1)
- PowerDesigner (1)
最新评论
-
di1984HIT:
Shallow heap & Retained heap -
tinguo002:
非常感谢 , 太棒了。
Spring注解方式,异常 'sessionFactory' or 'hibernateTemplate' is required的解决方法 -
白天看黑夜:
Apache Mina Server 2.0 中文参考手册(带 ...
Apache Mina – 简单的客户端/服务端应用示例 -
wumingxingzhe:
好文
Shallow heap & Retained heap -
di1984HIT:
学习了!!
工作流(Workflow)和BPM的不同
Activiti 5.6提供了子流程的实现,包括两种基于子流程的实现:
一种是内嵌子流程:子流程元素<subProcess>内嵌在主流程元素<process>之内,只能在该流程中使用该子流程,外部是无法访问到的。这种子流程一般作为局部通用逻辑处理,或者因为特定业务需要,使得比较复杂的单个主流程设计清晰直观;
另一种是调用子流程:首先实现一个流程,在另一个流程中可以调用该流程,通常可以定义一些通用的流程作为这种调用子流程,供其他多个流程定义复用。这种子流程使用<callActivity>元素来进行调用,间接地嵌入到主流程中,用起来比较方便。
内嵌子流程
实现的基于内嵌子流程的流程,示例如图所示:
对应的流程定义文件SubProcessTest.MySubprocess.bpmn20.xml,内容如下所示:
流程定义中,实现了3个TaskListener,对应的代码分别如下所示:
测试用例,代码如下所示:
运行结果信息,如下所示:
一种是内嵌子流程:子流程元素<subProcess>内嵌在主流程元素<process>之内,只能在该流程中使用该子流程,外部是无法访问到的。这种子流程一般作为局部通用逻辑处理,或者因为特定业务需要,使得比较复杂的单个主流程设计清晰直观;
另一种是调用子流程:首先实现一个流程,在另一个流程中可以调用该流程,通常可以定义一些通用的流程作为这种调用子流程,供其他多个流程定义复用。这种子流程使用<callActivity>元素来进行调用,间接地嵌入到主流程中,用起来比较方便。
内嵌子流程
实现的基于内嵌子流程的流程,示例如图所示:
对应的流程定义文件SubProcessTest.MySubprocess.bpmn20.xml,内容如下所示:
<?xml version="1.0" encoding="UTF-8"?> <definitions id="definitions" xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="Examples"> <process id="MySubprocess" name="My Subprocess"> <startEvent id="theStart" /> <sequenceFlow id="flow1" sourceRef="theStart" targetRef="subProcess" /> <subProcess id="subProcess"> <startEvent id="subProcessStart" /> <sequenceFlow id="flow2" sourceRef="subProcessStart" targetRef="subProcessFork" /> <parallelGateway id="subProcessFork" /> <sequenceFlow id="flow3" sourceRef="subProcessFork" targetRef="task1" /> <sequenceFlow id="flow4" sourceRef="subProcessFork" targetRef="task2" /> <userTask id="task1" name="Check bank" activiti:candidateGroups="engineering"> <extensionElements> <activiti:taskListener event="complete" class="org.shirdrn.workflow.activiti.subprocess.CheckBankTask" /> </extensionElements> </userTask> <sequenceFlow id="flow5" sourceRef="task1" targetRef="subProcessJoin" /> <userTask id="task2" name="Investigate software" activiti:candidateGroups="engineering" > <extensionElements> <activiti:taskListener event="complete" class="org.shirdrn.workflow.activiti.subprocess.CheckMerchantTask" /> </extensionElements> </userTask> <sequenceFlow id="flow6" sourceRef="task2" targetRef="subProcessJoin" /> <parallelGateway id="subProcessJoin" /> <sequenceFlow id="flow7" sourceRef="subProcessJoin" targetRef="subProcessEnd" /> <endEvent id="subProcessEnd" /> </subProcess> <sequenceFlow id="flow10" sourceRef="subProcess" targetRef="taskAfterSubProcess" /> <userTask id="taskAfterSubProcess" name="Collect message" activiti:candidateGroups="engineering" > <extensionElements> <activiti:taskListener event="complete" class="org.shirdrn.workflow.activiti.subprocess.CollectMessageTask" /> </extensionElements> </userTask> <sequenceFlow id="flow11" sourceRef="taskAfterSubProcess" targetRef="theEnd" /> <endEvent id="theEnd" /> </process> </definitions>
流程定义中,实现了3个TaskListener,对应的代码分别如下所示:
package org.shirdrn.workflow.activiti.subprocess; import java.util.HashMap; import java.util.logging.Logger; import org.activiti.engine.delegate.DelegateTask; import org.activiti.engine.impl.pvm.delegate.TaskListener; public class CheckBankTask implements TaskListener { private final Logger log = Logger.getLogger(CheckBankTask.class.getName()); @SuppressWarnings("unchecked") public void notify(DelegateTask delegateTask) { log.info("i am CheckBankTask."); System.out.println("in : " + delegateTask.getVariables()); ((HashMap<String, Object>)delegateTask.getVariables().get("in")).put("next", "CheckBankTask"); ((HashMap<String, Object>)delegateTask.getVariables().get("out")).put("reponse", "subprocess:CheckBankTask->CheckMerchantTask"); } }
package org.shirdrn.workflow.activiti.subprocess; import java.util.HashMap; public class CheckMerchantTask implements TaskListener { private final Logger log = Logger.getLogger(CheckMerchantTask.class.getName()); @SuppressWarnings("unchecked") public void notify(DelegateTask delegateTask) { log.info("i am CheckMerchantTask."); System.out.println("in : " + delegateTask.getVariables()); ((HashMap<String, Object>)delegateTask.getVariables().get("in")).put("previous", "CheckMerchantTask"); } }
package org.shirdrn.workflow.activiti.subprocess; import java.util.Map; public class CollectMessageTask implements TaskListener { private final Logger log = Logger.getLogger(CollectMessageTask.class.getName()); @SuppressWarnings("unchecked") public void notify(DelegateTask delegateTask) { log.info("i am CollectMessageTask."); System.out.println("out : " + (Map<String, Object>)delegateTask.getVariables().get("out")); System.out.println("all : " + delegateTask.getVariables()); } }
测试用例,代码如下所示:
package org.shirdrn.workflow.activiti.subprocess; import java.util.HashMap; import java.util.List; import java.util.Map; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.shirdrn.workflow.activiti.AbstractTest; public class MySubProcessTest extends AbstractTest { @Override protected void initialize() throws Exception { Deployment deployment = repositoryService .createDeployment() .addClasspathResource( "diagrams/SubProcessTest.MySubprocess.bpmn20.xml") .deploy(); deploymentId = deployment.getId(); } @Override protected void destroy() throws Exception { repositoryService.deleteDeployment(deploymentId, true); } public void testSubProcess() { // prepare data packet Map<String, Object> variables = new HashMap<String, Object>(); Map<String, Object> subVariables = new HashMap<String, Object>(); variables.put("maxTransCount", 1000000); variables.put("merchant", new Merchant("ICBC")); variables.put("protocol", "UM32"); variables.put("repository", "10.10.38.99:/home/shirdrn/repository"); variables.put("in", subVariables); variables.put("out", new HashMap<String, Object>()); // start process instance ProcessInstance pi = runtimeService.startProcessInstanceByKey("MySubprocess", variables); // enter subprocess List<Task> tasks = taskService.createTaskQuery().processInstanceId(pi.getId()).orderByTaskName().asc().list(); assertEquals(2, tasks.size()); for(Task task : tasks) { taskService.complete(task.getId()); } // leave subprocess Task collectTask = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult(); assertEquals("Collect message", collectTask.getName()); Map<String, Object> taskVariables = new HashMap<String, Object>(); taskVariables.put("att", "anything you need"); taskService.setVariable(collectTask.getId(), "oper", "shirdrn"); taskService.complete(collectTask.getId(), taskVariables); } }
运行结果信息,如下所示:
2011-3-24 17:36:36 org.shirdrn.workflow.activiti.subprocess.CheckBankTask notify 信息: i am CheckBankTask. in : {protocol=UM32, repository=10.10.38.99:/home/shirdrn/repository, merchant=Merchant[ICBC], maxTransCount=1000000, in={}, out={}} 2011-3-24 17:36:36 org.shirdrn.workflow.activiti.subprocess.CheckMerchantTask notify 信息: i am CheckMerchantTask. in : {protocol=UM32, repository=10.10.38.99:/home/shirdrn/repository, merchant=Merchant[ICBC], maxTransCount=1000000, in={next=CheckBankTask}, out={reponse=subprocess:CheckBankTask->CheckMerchantTask}} 2011-3-24 17:36:36 org.shirdrn.workflow.activiti.subprocess.CollectMessageTask notify 信息: i am CollectMessageTask. out : {reponse=subprocess:CheckBankTask->CheckMerchantTask} all : {protocol=UM32, repository=10.10.38.99:/home/shirdrn/repository, merchant=Merchant[ICBC], oper=shirdrn, att=anything you need, maxTransCount=1000000, in={previous=CheckMerchantTask, next=CheckBankTask}, out={reponse=subprocess:CheckBankTask->CheckMerchantTask}}
发表评论
-
Eclipse,javaw 通过Proxifile代理ipv6协议问题解决
2015-03-17 18:06 2798myeclipse2010升级到myeclipse2014之后 ... -
初始化EHcache CacheManager时报java.net.UnknownHostException
2014-11-13 11:45 12510工程启动时,报一下异常: [wdfportal] [201 ... -
tomcat7可能带来的问题
2013-06-27 00:31 9841、struts标签校验更加严格,如果struts标签中存在嵌 ... -
iBatis执行insert后返回主键
2013-01-18 23:55 1652iBatis插入数据后,返回主键。级联操作很有用。省去了一次的 ... -
Shallow heap & Retained heap
2012-05-16 17:09 49326所有包含Heap Profling功能的工具(MAT, You ... -
什么是两阶段提交协议
2012-05-08 16:58 1067两阶段提交协议 实现分布式事务的关键就是两阶段提交协议。在此 ... -
Abator —— IBatis 代码生成工具
2012-04-03 18:31 19351、在eclipse安装abator插件http://ibat ... -
使用Eclipse远程调试Tomcat
2012-03-23 22:56 1512有些时候,调试不得不用外网,比如说做支付宝的支付接口,服务器后 ... -
Java compiler level does not match the version of the installed Java project fac
2012-03-02 11:32 1321问题现象:项目图标报错“Java compiler level ... -
WebService的事务处理
2012-03-01 15:03 1562如果你只是要解决两个系统之间的事务同步问题,可以采用判断服务是 ... -
线程池(java.util.concurrent.ThreadPoolExecutor)的使用
2012-02-29 15:50 2509一、简介 线程池类为 j ... -
myeclipse 颜色设置(保护视力)
2012-02-28 09:29 20911.window -> Preferences -> ... -
Quartz表达式解析
2012-02-08 14:40 809字段 允许值 允许的特 ... -
使用iBatis中报 java.sql.SQLException: 无效的列类型异常
2011-12-15 14:46 2244<!--Content表 插入应的 ... -
非常有用的proxool属性详细解说
2011-12-13 16:19 1612Proxool连接池是sourceforge下的一个开源项目, ... -
在工程中查找自己修改的所有代码
2011-12-09 17:41 1049在工程中查找自己修改的所有代码的方法: 1.工程右键 -&g ... -
如何在Eclipse中安装和使用ibatis插件Abator
2011-12-01 21:26 49761、获得abator: http://ibatis. ... -
newCachedThreadPool线程池
2011-11-20 11:35 43036public static ExecutorService n ... -
Apache Mina – 简单的客户端/服务端应用示例
2011-11-19 23:49 5530转自http://javasight.net/2011/05/ ... -
Class.forName()、Class.forName().newInstance() 、New 三者区别!
2011-11-15 09:18 1263终于明白为什么加载数据库驱动只用Class.forName() ...
相关推荐
Activiti5.6 用户手册
Activiti 5.6是其历史版本之一,尽管现在有更新的版本,但5.6版本依然具有重要的学习价值,因为它包含了基本的流程引擎实现和丰富的API接口。 二、Activiti 5.6核心概念 1. 流程定义(Process Definition):使用...
通过对 Activiti 5.6 和 5.8 源代码的研究,开发者可以深入了解 BPM 引擎的内部工作机制,学习如何定制流程行为,以及如何利用 Activiti 提供的工具和API来构建高效的企业级流程管理系统。此外,通过对比不同版本的...
activiti5.6,想对activiti有所提高,进一步了解的朋友必备,对初学者也是必备文档
总结起来,Activiti 5.6与Spring 3.03的整合提供了一种高效的方式来建模和执行业务流程,如模拟程序员的面试过程。通过XML配置,我们可以定义复杂的流程逻辑,并结合Spring的特性进行灵活的控制和管理。这种整合使得...
Alfresco软件在2010年5月17日宣布Activiti业务流程管理(BPM)开源项目的正式启动,其首席架构师由业务流程管理BPM的专家 Tom Baeyens担任。 Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,...
### Activiti流程学习总结 #### 一、工作流的基本概念 在深入了解Activiti之前,我们需要先理解工作流的概念。工作流是一种将业务过程部分或全部自动化的方法,它可以帮助组织提高工作效率,减少错误,并且能够更...
Activiti是一款开源的工作流引擎,它基于模型驱动的架构(MDA),用于在企业级应用中实现业务流程自动化。在“Activiti学习笔记三:管理流程定义”中,我们将深入探讨如何使用Activiti来管理和操作流程定义。 首先...
这是一本深入讲解Activiti的书,这是一本干货书,不仅有源码的讲解,还有基于源码讲解基础之上的实战讲解,这是一本诚意十足的书,这是一本深入讲解Activiti内核的书,这是一本真正企业级实战的书。 Activiti权威...
Activiti 是一个开源的工作流和业务自动化引擎,广泛应用于企业级应用中,提供流程定义、执行、监控等全面的功能。本学习笔记将聚焦于流程执行的历史记录,这是理解流程运行情况、追踪问题以及优化流程的关键。 一...
struts2、sprint3、activiti5整合项目, 其中有很多帮助类,如:时间帮助类,数据库帮助类,string帮助类, excel操作帮助类,jfreechart帮助类,spring帮助类等等, 绝对物超所值!
activiti in action meap版 全本
【标题】"最简单的含单元测试的spring boot+activiti集成demo" 描述了一种将流行的Spring Boot框架与流程管理工具Activiti结合使用的实践案例。这个集成演示项目旨在帮助开发者快速理解和实现基于Spring Boot的...
5.6:ProcessDefinition 14 5.7:ProcessInstance 14 5.8:Execution 14 6:HelloWorld程序(模拟流程的执行) 16 6.1:流程图: 16 6.2:部署流程定义 16 6.3:启动流程实例 17 6.4:查看我的个人任务 17 6.5:完成...
Activiti 是一个开源的工作流和业务自动化引擎,它支持企业级的业务流程管理(BPM)和业务规则管理(BRM)。在这个主题中,我们主要关注如何在Activiti中进行流程图的部署以及如何操作流程图。 流程图的部署是...
工作流Activiti是一种开源的工作流引擎,用于在企业应用程序中实现业务流程自动化。它由Alfresco Software开发,旨在提供灵活、可扩展且易于使用的流程管理解决方案。在本"工作流Activiti学习代码"资源中,我们将...
Activiti 是一个开源的工作流引擎,它用于自动化业务流程。在 Activiti 中,流程变量是流程实例中的数据载体,它们可以被流程中的不同任务、事件或服务调用所使用。理解并熟练操作流程变量是深入学习 Activiti 的...
Activiti是一款开源的工作流引擎,它为业务流程自动化提供了强大的支持。这个"activiti jar包"包含了实现Activiti功能所需的各种库文件。在Java开发环境中,JAR(Java Archive)文件是将多个类文件打包在一起的容器...
web.xml 配置
Activiti 是一个开源的工作流和业务自动化引擎,它被广泛应用于企业级应用中,用于处理业务流程和工作流。这个“简单的activiti请假流程”项目是针对初学者或希望了解Activiti基本操作的一个实例,旨在展示如何在...