一、 JBPM4的结构特点
1.嵌入式的工作流引擎,不需要依赖特定的中间件或服务器,减少了硬件和软件的绑定,完全支持嵌入式应用的
业务流程开发框架,可以在事务处理、数据持久化等各个方面与业务应用程序进行灵活的集成。
2.可拔插的体系架构,采用模块化的架构设计,采用了IOC的设计理念,各模块之间可以比较方便地解除耦合或
替换不同的实现,例如持久化、事务处理、身份认证、日志服务等,都由可选模块实现。
3. 易扩展的流程语言。
二、 Jbpm4的安装配置
1.下载地址:http://sourceforge.net/projects/jbpm/
2.解压资源包,进入目录install,在控制台下运行脚本:ant demo.setup.tomcat。会执行如下操作:
1)下载安装Tomcat.
2)安装HSQLDB,并创建数据表结构。
3)启动Tomcat,创建examples.bar业务流程归档,并发布到JBPM数据库中,初始化相关用户和组。
4)下载安装Eclipse,并启动Eclipse.
5)安装JBPM Web控制台。
6)安装Signavio Web 设计器。
3.在Eclipse中安装GPD插件,利用eclipse的软件升级指定GPD安装文件,文件为
下载资源包中install/src/gpd/jbpm-gpd-site.zip。
4.添加jbdl4 Schema检验,在eclipse中配置schema,指定jbpm4安装目录下src文件夹中jpdl.xsd文件。
步骤为:Window->Preferences->XML->XML CataLog->Add->File System。
三、 Jbpm流程API
1.流程相关概念
流程定义:对业务过程步骤的描述,表现为若干"活动"节点通过"转移"线条串联。
流程实例:表示流程定义在运行时特有的执行例程。
流程执行:流程实例在其生命周期中,指向当前执行活动的指针。
2.流程的6个Service API,可通过流程引擎对象的接口方法获取。
ProcessEngine processEngine = Configuration.getProcessEngine();
1)RepositoryService,流程资源服务的接口。提供对流程定义的部署、查询、删除等操作。
2)ExecutionService,流程执行服务的接口。提供启动流程实例、“执行”推进、设置流程变量等操作。
3)TaskService,人工任务服务的接口。提供对任务的创建、提交、查询、保存、删除等操作。
4)HistoryService,流程历史服务的接口。提供对流程历史库中历史流程实例、历史活动实例等记录的查询操作。
5)IdentityService,身份认证服务的接口。提供对流程用户、用户组以及组成员关系的相关服务。
6)ManagementService,流程管理控制服务的接口。提供异步工作(Job)相关的执行和查询操作。
3.流程的布署和删除
1)流程的布署
String deploymentId = repositoryService.createDeployment()
.addResourceFromClasspath("org/jbpm/examples/task/assignee/process.jpdl.xml") .deploy();
// 可多次调用addResourceFromClasspath方法部署其它流程定义
2)流程的删除
repositoryService.deleteDeploymentCascade(deploymentId);
4.发起流程实例
1)流程Key
ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL");
2)流程Id
ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL-1");
3)根据业务键指定流程实例ID
ProcessInstance processInstance = executionService.startProcessInstanceByKey ("ICL",“Order09278”);
4)传入流程变量
ProcessInstance processInstance = executionService.startProcessInstanceByKey ("ICL", variablesMap);
5.唤醒等待状态的执行
executionService.signalExecutionById(executionId);
6.获得用户的任务列表
List<Task> taskList = taskService.findPersonalTasks("johndoe");
7.任务的完成提交
1)将用户界面的任务表单内容存入任务
taskService.setVariables(taskId,variablesMap);
2)根据任务ID完成任务
taskService.completeTask(taskId);
3)根据任务ID完成任务,同时设入变量
taskService.completeTask(taskId, variablesMap);
4)根据任务ID完成任务,并指定下一步的转移路径
taskService.completeTask(taskId, outcome);
8.流程历史实例获取
1)获得流程定义的所有历史流程实例,返回结果按开始时间排序
List<HistoryProcessInstance> historyProcessInstances = historyService
.createHistoryProcessInstanceQuery() .processDefinitionId("ICL-1")
.orderAsc(HistoryProcessInstanceQuery.PROPERTY_STARTTIME).list();
2)获得流程的历史活动实例,可指定具体名称的活动实例
List<HistoryActivityInstance> historyActivityInstances = historyService
.createHistoryActivityInstanceQuery().processDefinitionId("ICL-1").list();
9.查询结果分页
1)流程实例查询分页
List<ProcessInstance> results = executionService.createProcessInstanceQuery()
.processDefinitionId("ICL-1").page(0, 50).list();
2)流程任务查询的分页
List<Task> myTasks = taskService.createTaskQuery()
.processInstanceId("ICL.Order09278") .assignee("Alex")
.page(10, 20).list();
四、 流程定义
1.流程控制活动
1)start,开始活动
2)state,状态活动
3)decision,判断活动
4)fork,分支活动
5)join,聚合活动
6)end,结束活动
2.State活动
Jpdl定义:
<state name="wait for response">
<transition name="accept" to="submit document" />
<transition name="reject" to="try again"/>
</state>
<state name="submit document"/>
<state name="try again"/>
// 获取流程实例ID
String executionId = processInstance.findActiveExecutionIn("wait for response").getId();
// 触发accept流向
processInstance = executionService.signalExecutionById(executionId, "accept");
3.decision活动
1)使用condition元素判断decision活动
Jpdl:
<!-- decision 中会运行并判断每一个transition 里的判断条件。
当遇到一个嵌套条件是true 或者没有设置判断条件的转移,
那么转移就会被运行 -->
<decision name="evaluate document" >
<transition to="submit document" >
<condition expr="#{content==’good’}" />
</transition>
<transition to="try again">
<condition expr="#{content==’bad’}" />
</transition>
<transition to="give up"/>
</decision>
<state name="submit document"/>
<state name="try again"/>
<state name="give up"/>
Map<String, Object> variables = new HashMap<String, Object>(); variables.put("content", "good");
// 由于传入变量为good,流向了submit document活动
ProcessInstance processInstance = executionService
.startProcessInstanceByKey("DecisionConditions", variables);
2)使用decision的expr属性判断decision活动。
<!--可选择的状态结点,expr指定将被运行的指定脚本 -->
<decision name="evaluate document" expr="#{content}" >
<transition name="good" to="submit document"/>
<transition name="bad" to="try again"/>
<transition name="ugly" to="give up"/>
</decision>
流程执行操作同上面condition元素的操作。
3)使用decision活动的handler元素判断decision活动。
<!-- decision handler决定处理器继承了DecisionHandler 接口的java 类,
决定处理器负责选择向外转移 -->
<decision name="evaluate document" g="96,102,48,48">
<handler class="org.jbpm.examples.decision.handler.ContentEvaluation"/>
<transition name="good" to="submit document"/>
<transition name="bad" to="try again"/>
<transition name="ugly" to="give up"/>
</decision>
ContentEvaluation类如下:
public class ContentEvaluation implements DecisionHandler {
public String decide(OpenExecution execution) {
String content = (String) execution.getVariable("content");
return content; }
}
流程执行操作同上面condition元素的操作。
Decision活动和state活动都可以实现条件流转,但二者的主要区别如下:
如果decision活动定义的流转条件没有任何一个得到满足,那么流程实例将无法进行下去,抛出异常。
而state活动在没有条件满足的条件下将流向state活动定义的第一条流出转移,从而往下流转。
因此decision活动具有更加严格的条件判断特性。
4.fork-join活动
Jpdl:
<!-- fork活动在此产生3个并行分支,这些流程分支可以同步执行。 -->
<fork name="fork">
<transition to="send invoice"/>
<transition to="load truck"/>
<transition to="print shipping documents"/>
</fork>
<state name="send invoice">
<transition to="final join"/>
</state>
<state name="load truck">
<transition to="shipping join"/>
</state>
<state name="print shipping documents">
<transition g="378,213:" to="shipping join"/>
</state>
<!--join活动为流程的合并,load truck和print shipping documents在此聚合 -->
<join name="shipping join">
<transition to="drive truck to destination"/>
</join>
<state name="drive truck to destination">
<transition to="final join"/>
</state>
<!-- drive truck to destination活动和send invoice活动在此完成最终的聚合 -->
<join name="final join">
<transition to="end"/>
</join>
Fork活动可以使流程在一条主干上出现并行的分支,join活动则可以使流程的并行分支聚合成一条主干。
部分执行测试代码如下:
ProcessInstance processInstance = executionService
.startProcessInstanceByKey("ConcurrencyGraphBased");
// 当前活动为产生的3个分支活动
assertNotNull(processInstance.findActiveExecutionIn("send invoice"));
assertNotNull(processInstance.findActiveExecutionIn("load truck"));
assertNotNull(processInstance.findActiveExecutionIn("print shipping documents"));
// 执行send invoice活动,流程会在聚合活动上等待其它分支的到来
String sendInvoiceExecutionId = processInstance
.findActiveExecutionIn("send invoice").getId();
processInstance = executionService.signalExecutionById(sendInvoiceExecutionId);
- 大小: 10.2 KB
- 大小: 8.4 KB
- 大小: 25.7 KB
- 大小: 4 KB
- 大小: 8.4 KB
- 大小: 5.2 KB
分享到:
相关推荐
- **jBPM4工作流应用开发指南:** 表明这是一个专注于jBPM4版本的工作流应用开发的指南,由胡奇编写。 - **胡奇:** 该标签重复提及胡奇,强化了指南作者的身份和该作品的关联性。 ### 部分内容知识点: 由于提供...
51CTO下载的《jBPM4工作流应用开发指南》PDF文件是其中的一份详细的学习资料,涵盖了从基础概念到高级用法的全面指导。 通过学习和实践jBPM4,开发者能够构建出灵活、可扩展且易于维护的工作流应用,以满足企业复杂...
虽然无法直接了解具体内容,但根据以上知识,可以认为“jBPM4工作流应用开发指南完整版带书签”是一份全面的文档,覆盖了jBPM4工作流的构建和运行所需的关键步骤和实践。开发者可通过这份指南获得在不同业务场景中...
jBPM4工作流应用开发指南最新版_01 JBPM4详细指南,非常实用,我就是通过这个文档学习起来的,相当受益
jBPM4工作流应用开发指南,很详细很全面,高清带书签的,适合新手入门
jbpm4工作流应用开发指南,很不错的一本书.也很清晰,希望大家喜欢
JBPM4工作流应用开发指南.pdf
《jBPM工作流应用开发指南》是一本面向初学者的文档,旨在帮助开发者快速掌握jBPM工作流系统的开发技巧。jBMP,全称Java Business Process Management,是开源组织JBoss提供的一款用于业务流程管理(BPM)的框架,它...
《jBPM4工作流应用开发指南》是一本深度探讨工作流管理系统的专业书籍,尤其聚焦于jBPM4这一开源工作流引擎的使用与开发。工作流技术,作为企业管理信息化的重要工具,能够自动化和规范业务流程,提高企业效率。本书...
jBPM4工作流应用指南和实例(含全jar包)包太大,分卷了,下载的时候注意是四个分卷包。 注意:只收一卷的金币。其他都免费
JBPM4工作流介绍 本篇文章将对JBPM4工作流进行详细的介绍,涵盖工作流的概念、工作流引擎、工作流管理系统等...JBPM4工作流是一个功能强大且灵活的工作流管理系统,能够满足多变的业务需求,提高工作效率和降低成本。
JBPM4是一款强大的工作流管理系统,专为JavaEE开发人员设计,旨在解决复杂流程管理和变更需求。本课程适合对JavaEE开发有经验的技术人员以及流程分析师。JBPM4提供了广泛的应用场景,涵盖了关键业务流程,如订单处理...
BPM4工作流应用开发指南 《jBPM4工作流应用开发指南》是2010年电子工业出版社出版的图书,作者是胡奇。 完全解析jBPM4应用开发技术 9位工作流业内专家联袂推荐 随着在现代企业管理中对于信息化、流程化的深度挖掘,...
jBPM4是一款强大的开源工作流管理系统,它提供了流程建模、执行以及监控等功能,广泛应用于企业业务流程自动化。在这个示例中,jbpmDemo通过Canvas动画生动地展示了工作流的运行过程,使得理解工作流变得更加直观和...
JBPM4教程+jBPM4工作流应用开发指南 要想学习jbpm的话 这是不错的文档