从源码看jbpm
- 格式:doc
- 大小:36.50 KB
- 文档页数:3
JBPM4.4应用开发——入门篇2010-10-27 20:38:24标签:JBPM工作流工作流程入门原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。
否则将追究法律责任。
/1931202/411612首先简单说说JBPM——java Business Process Management (java 业务流程管理)jBPM是一个框架、一堆开放的源代码。
而非一套“应用程序”。
jBPM的流程引擎可以看做是一个java工程——若干java类、依赖库和配置文件;使用和学习jBPM需要如下条件:1.jBPM的流程定义和运行时的上下文需要被存储到关系型数据库中——可以是基于调试目的的内存数据库HSQLDB,也可以是真正的持久化数据库(MySql,Oracle,PostgreSql,Sybase等等);2.jBPM的流程设计一般都需要一个基于客户端的图形化流程设计器软件,当然在jBPM4版本以后可以支持在web上做流程设计(这要归功于Sigvio项目)3.最终,基于jBPM开发出来的应用程序一般都会被部署到一台应用服务器中,以便服务于来自web的访问、监控和管理等。
注意:在jBPM4.3以后,几乎所有的准备工作(安装数据库,建表,安装应用服务器,安装图形化设计器插件等)jBPM软件包的发布者都帮我们做好了。
只要通过Ant脚本“一键获取”所需要的jBPM4整套开发、运行和管理环境。
在安装jBPM之前首先要安装JDK和Ant。
快速开始--------------------------------------------------------一、1.打开cmd命令控制台:进入到${jbpm.home}/install2.运行脚本:ant demo.setup.tomcat或ant.demo.setup.jboss使用这两个服务器都可以。
具体这个命令做了上面事:请查看install目录下的build.xml文件中的目标。
第一章绪论这是Jboss 的jBPM3.12框架的用户指南的中文翻译。
其中第一章的译文,是我在网上找到的。
其他几章都是我自己做的翻译。
我的翻译是中英文对照,只翻译部分我认为重要的,不翻译简单的英文,以免浪费你我的时间。
同时,对于其中的部分内容,我会在翻译中做出解释。
下面是从网络上找到的第一章,这是jBPM3.0的用户指南的译文。
但是第一章,3.0和3.1内容相差不大,我就不做翻译了。
直接使用这一篇。
目录第一章绪论JBoss jBPM 是一个灵活的,易扩展的工作流管理系统。
JBoss jBPM有一套直观的流程建模语言,这套语言能用任务(task),异步通信的等待状态(wait state ),定时器(timer),自动化的动作(automated action)等来图形化的表示业务流程。
为了把这些操作集成在一起,JBoss jBPM拥有强大的,易扩展的控制流程机制。
JBoss jBPM对外依赖程度很小,你完全可以像用java的类库一样用它。
并且它也可以被部署在高性能的J2EE集群应用服务器上。
JBoss jBPM能配置在任何数据库上,并且能被部署在任何的应用服务器上。
1.1 总览工作流和业务流程处理功能的核心部分被打包成一个简单的java类库。
这个类库包括了这样一个服务:流程信息的存储,更新,和从数据库中重新取回。
图1.1:JBoss jBPM组成模块的概略图1.2 JBoss jBPM starter kitstarter kit是一个包含jbpm所有模块的下载包。
这个下载包中包括以下模块:jbpm-server, 一个预选配置好的jboss应用服务器。
jbpm-designer, 图形化定制流程的eclipse插件。
jbpm-db, jBPM的数据库兼容包 (见后边论述)。
jbpm, jbpm的核心模块,其中包括libs文件夹和这个用户说明。
jbpm-bpel, JBoss jBPM对BPEL扩展的一些参考资料预先配置好的JBoss应用服务器具有如下组成部分:jBPM核心模块,被打包成一个用于提供服务的存档文件带有jbpm表的集成数据库:默认的hypersonic数据库拥有jbpm表,并且这个表已经拥有一个流程了。
Myeclipse8.6搭建jbpm4.4的开发环境jbpm版本:4.4IDE:myeclipse8.6DB:mysql-5.0.261、Myeclipse中安装jbpm1)、解压jbpm4.42)、打开myeclipse8.6---->选择Help菜单---->选择Myeclipse Configuration Center------>打开第三个选项卡SoftWare----->选择右上角add site---->选折add form archive file-----》找到${jbpm_home}\install\src\gpd 目录下找到jbpm-gpd-site.zip即可!name随便输入即可(比如我输入jbpm)!这样下面就看到多一个jbpm(部分过程看下图)选择“add site”,弹出如下对话框:选择“Add from Archive File”,弹出如下对话框:选择“打开”,弹出如下对话框:选择“OK”,出现如下对话框:3)、一个一个选中jpd下面的文件,点击右击“add to profile”即可!4)、点击右下角“apply change”按钮即可!安装完成后会重启Myeclipse,重启后在新建项目里会多出一项“JBoss jBPM”,如下图所示:2、生成jbpm数据库表(这里以安装mysql为列)a)、先打开mysql数据库新建一个数据库比如jbpm(create database jbpm);b)、打开${jbpm_home}\install\src\db\create 下面,找到mysql的表脚本!c)、全部复制过来粘贴到mysql命令行上(当然也可以source ***.sql方式),3、搭建JBPM4运行环境一、下载JBPM4.3可以到官方下载,然后直接解压就可以了doc: 用户手册,javadoc和开发指南examples: 用户手册中用到的示例流程install: 安装脚本lib: 第三方库和一些特定的jBPM依赖库src: 源代码jbpm.jar: jBPM主库归档二、搭建JBPM4运行环境1、新建一个Java Project项目2、添加依赖库jar包a)jbpm.jar包b)JBPM目录/lib下的所有的jar包,当然了,这里有些是可选的。
jbpm 流程设计(原创实用版)目录1.JBPM 简介2.JBPM 流程设计概念3.JBPM 流程设计步骤4.JBPM 流程设计实例5.总结正文一、JBPM 简介JBPM(Java Business Process Management)是一款开源的业务流程管理系统,它提供了一种以规范化、自动化的方式来管理企业的业务流程。
JBPM 遵循 BPMN(Business Process Model and Notation)标准,支持从 BPMN 建模到部署执行的端到端业务流程管理。
二、JBPM 流程设计概念在 JBPM 中,流程设计是指通过图形化界面创建、编辑和部署业务流程模型的过程。
流程模型描述了企业业务流程的执行过程,包括流程的启动、流转、结束等各个环节。
流程设计主要包括以下几个元素:1.流程定义:描述流程的启动条件、执行顺序、分支、合并、结束条件等。
2.流程参与者:定义参与流程执行的角色和人员。
3.流程任务:描述流程中需要完成的任务,以及任务之间的依赖关系。
4.流程事件:描述在流程执行过程中触发的事件,例如错误、警告等。
三、JBPM 流程设计步骤1.安装和配置 JBPM:首先需要下载并安装 JBPM,然后进行相应的配置,如数据库连接、用户权限等。
2.登录 JBPM:使用管理员账号登录 JBPM,进入流程设计界面。
3.创建流程定义:在流程设计界面创建新流程,或者导入现有的 BPMN 模型。
4.编辑流程定义:通过拖拽和放置的方式,修改流程的执行顺序、分支、合并等。
5.添加流程参与者:为流程定义参与者,并设置其角色和权限。
6.添加流程任务:为流程添加任务,并设置任务之间的关系。
7.测试和调试流程:在测试环境中运行流程,检查其执行结果,并进行调试。
8.部署流程:将设计好的流程部署到生产环境中,供实际业务使用。
四、JBPM 流程设计实例以一个简单的请假流程为例,介绍 JBPM 流程设计的具体步骤:1.创建流程定义:在流程设计界面创建一个新流程,设置流程名称为“请假流程”。
JBPM源码解读之:ForkFork节点在整个JBPM流程运转过程中配合Join使用提供使多于一个的节点如:TaskNode、State等并行运行的作用,很可惜我们不能利用 Fork提供的现有机制实现需求中经常遇到的并发子流程的效果,当然虽然JBPM并不支持并发子流程的机制,并不代表我们不能变通的实现,我将在另一篇文章中详细说明我的并发子流程的实现方式。
Fork类的注释中说:if this fork behaviour is not sufficient for your needs, consider writing your own custom TokenHandler.看来连JBPM开发小组也意识到Fork可能不能满足某些特殊的需求。
注释中还说Fork节点有三种配置方式,我很奇怪为什么代码中只能找到两种:1、without configuration : in that case the fork will launch one new sub-token over each of the leaving tranisions of the fork node.2、a script : can be used to calculate a collection of transition names at runtime. ifa script is configured, the script must have exactly one variable with 'write' access. that variable should be assigned a java.util.Collection in the script expression.Fork类继承自Node并实现了Parsable接口。
Fork类相对简单,他的私有成员变量只有一个:1/**2 * a script that calculates the transitionNames at runtime.3 */4 Script script = null;Fork中的Script可以在运行时对Fork节点选择Transition,所以在实际应用中可以使用Fork+Script的方式进行多路路由选择. 但是有一点要特别注意:JBBM User Guide文档中说:the script in a fork is not persisted. script in fork might be removed in later versions of jPDL,原本以为这句话的前半句是说Script不会被持久化进数据库,实验了才知道其实Script还是被存进了数据库,这半句的意思应该是说"fork 中的script不被坚持",JBPM开发小组要在新版本中放弃Script,我相信他们一定会提供更好的解决方案,让我们拭目以待。
JBPM源码浅析关键字: jbpm workflow 工作流离职啦,工作交接中,记录一下。
就如同了解Servlet规范、Servlet容器设计和实现一样,学会一种workflow 的建模、引擎设计和实现也是必备的。
工作流这东西是业务系统的一个核心模块,现在的大多数企业业务系统大多数是业务驱动的,如新闻行业采编发、制造业的采供销、金融保险的审批等,协同OA就不用说了。
BPM、ESB、SOA现在很火啊!下面的总结肯定欠成熟,70%合理就不错啦,看到这篇blog的朋友,一定要批判接受哦。
当前我指的JBPM是3.2版本,因为从JBPM2.0到3.0,其API从package到class 都完全重新设计了,以及其背后的建模思想和架构。
在2.0版本里,是按照Spring+Hibernate那种Transaction Script方式组织的,OO的概念比较弱,里面是大量的interface、impl、service。
而3.0版本,完全按Domain Model方式组织,Hibernate透明持久化,它是我见到的O/R Mapping最优雅的应用。
在当前的3.2版本里,其整体架构可以这么去理解:领域对象,如ProcessDefinition、ProcessInstance、Node、Token、Transition等,都是Rich Model,里面的方法主要是处理业务,以及建立领域对象之间的关联,持久化则完全放在XXXSession中,如TaskMgmtSession,GraphSession等,也可以认为这些XXXSession是DAO,负责处理持久化。
另外,org.jbpm.persistence.db.DbPersistenceService这些类相当于最底层的数据库Helper类。
总之,JBPM的技术架构非常清晰易懂,也是非常典型的Domain Driven Design,在这种架构中,分层的概念被弱化了。
jsp管理系统源码JSP管理系统源码是一项用于构建和管理动态网页的技术。
它允许开发人员在Java中嵌入HTML代码,并通过在服务器上运行Java代码生成动态内容。
通过结合JSP和Java代码,可以构建强大且功能丰富的管理系统。
JSP管理系统源码的开发过程需要一定的技术知识和经验。
首先,开发人员需要掌握Java编程语言和JavaWeb开发的基本概念。
其次,他们需要了解JSP的语法和标签,以及如何在JSP文件中嵌入Java代码。
此外,他们还需要学习如何与数据库进行交互,以便存储和检索数据。
JSP管理系统源码通常由多个组件组成,包括前端界面、后端逻辑和数据库。
前端界面是用户与系统进行交互的地方,它呈现数据和提供操作选项。
开发人员可以使用HTML和CSS来设计和布局前端界面,通过JSP标签嵌入动态内容。
后端逻辑是处理用户请求并执行相应操作的地方,例如验证用户身份、查询数据库和生成动态页面。
开发人员可以使用Java编写后端逻辑,并通过JSP标签将其嵌入到JSP文件中。
数据库用于存储和检索数据,开发人员可以使用SQL语句与数据库进行交互。
在开发JSP管理系统源码时,开发人员应遵循良好的编程实践和安全性原则。
他们应该对用户输入进行验证和过滤,以防止潜在的安全漏洞,如SQL注入和跨站脚本攻击。
此外,他们还应使用适当的身份验证和授权机制来保护系统的敏感功能和数据。
JSP管理系统源码可以用于各种各样的应用,例如学生管理系统、图书管理系统、库存管理系统等。
根据具体的需求和功能,开发人员可以进一步扩展和定制源码,以满足特定的业务需求。
总之,JSP管理系统源码是一种强大而灵活的技术,用于构建和管理动态网页。
开发人员可以利用JSP的特性和Java的功能,创建功能丰富且安全可靠的管理系统。
但是,为了开发出高质量的源码,开发人员需要具备相关的技术知识和经验,并遵循编程实践和安全性原则。
只有这样,我们才能开发出满足用户需求的优秀JSP管理系统源码。
JBPM源码浅析
研究jBPM已有一段时刻了,今天终于决定拿点器械出来,但请大年夜家谅解不克不及分享源码。
之因此拿出来,欲望经由过程交换熟悉到更多技巧一线的同志们,结点分缘。
本人不才只念完了高中,求职路屡战屡败,只好扎实地弄点器械出来撑下门面,欲望有所赞助,找到一份知足的工作。
大年夜多研究JBPM的,对其引擎的扩大开创都不曾忧?,但说起其可视化设计对象都欲望能有一款WEB版设计器。
忧?过后,便有了开创设计器的冲动。
起首经由过程网上找到的WEB流程设计对象,多半长短流程研究人员的产品,拿来用要经由大年夜量的修改,不太可取,也不轻易修改,参考倒是有些价值,在此谢过;别的因为刚学会了JavaScript在页面实现的拖曳功能。
鉴于此便开端了行动,现在想想还有些大年夜胆。
因为一向没抽出时刻来,拖了两个多月,终于写下了这篇文章。
以下以贴图方法介绍jBPM3 web designer。
2、图形编辑,节点及流程转换,应用vml标签获得优胜的视觉后果(推敲兼容其它扫瞄器,能够开创基于svg、canvas或纯js的图形模型)。
网格
节点选中(节点选中后,能够经由过程鼠标按下拖动节点,改节点显示地位,也能够经由过程键w、a、s、d或up、left、dowm、rigth来移动节点,选中的节点能够或许经由过程delete键进行删除,连同其所有的form及to转换将一路被删除。
当两个节点重叠时,选中节点始终显示于最上面)。
jBPM4.4一、什么是jBPMJBPM是一个扩展性很强的工作流系统,百分百用JAVA语言开发,持久层采用Hibernate实现,理论上说,只要Hibernate支持的数据库JBPM都支持。
同时它还能被部署在任何一款JAVA应用服务器上。
java Business Process Management :工作流,工作流引擎注:记得j小写,因为j代表java,与Log4j中j一样工作流管理系统不止一中,如还有Intaliol BPMS …但JBoss jBPM灵活性且扩展性高。
jBPM项目于2002.3由Tom Baeyens 发起,2003.12发布1.0版本,2004年10.18发布2.0,并在这天加入了JBOSS组织-→被RedHat公司二、能干什么提供工作流的实现,帮助更好的进行BPM三、jBPM有什么,简介jBPM的Service API 各种服务1:ProcessEngine:流程引擎。
并不负责具体的业务,而是用于获取各种Service。
2:RepositoryService:流程资源服务的接口,如流程定义发布、查询、删除等。
3:ExecutionService:用于操作流程实例的服务,可以进行流程实例发布、查询、流程推进、设置流程变量等操作。
4:TaskService:用于操作人工任务的服务,可以进行任务创建、查询、获取、提交完成、保存、删除等操作。
5:HistoryService:用于操作流程历史的服务,提供对流程历史库(就是已经完成的流程实例)的操作。
比如:历史流程实例,历史活动实例等。
6:IdentityService:用于操作用户、用户组以及成员关系的服务7:ManagementService:流程管理控制服务的接口,只提供异步工作(Job)相关的执行和查询操作。
四、Myeclipse8.5 搭配开发环境1.jbpm-4.4.zip 下载完2.myeclipse→help→Myeclipse Configuration Center →add…….3.找到\jbpm-4.4\install\src\gpd\jbpm-gpd-site.zip 安装这个插件4.记得不要联网安装,不要选source文件5.安装完后window→JBoss jBPM→runtime Location→add 添加jbpm的路径6.添加lib下所有jar包,如果你使用的是tomcat6.0则:要把Juel-api.jar ,juel-impl.jar,juel-engine.jar 拷到tomcat lib 下并把原来的el-api.jar删掉项目中就不要再导上面三个包五、修改配置文件1、将example中的下列配置文件拷贝到java项目的src目录下:jBPM.cfg.xml、jBPM.hibernate.cfg.xml、jBPM.mail.properties、jBPM.mail.templates.xml、process_forms.css2、在以上配置文件中的jBPM.hibernate.cfg.xml,实际上就是我们熟悉的hibernate.cfg.xml,这里,要修改为连接我们的数据库。
1.org.jbpm.ant包未阅读,是用于ant命令吧?2.org.jbpm.bytes包主要是ByteArray类,它对应的hbm文件为ByteArray.hbm.xml,ByteArray类中共有三个属性,对应hmb文件中的相同name的属性,其中byteBlocks 对应list属性中的byteBlocks,如下所示:<list name="byteBlocks"table="JBPM_BYTEBLOCK"cascade="all"><key column="PROCESSFILE_" foreign-key="FK_BYTEBLOCK_FILE" /><list-index column="INDEX_" /><element type="binary" length="1024" column="BYTES_" /></list>这里用List是因为List维持集合内元素顺序的持久化。
list-index表明INDEX_是key值,查看表JBPM_BYTEBLOCK可知PROCESSFILE_ 和INDEX_是复合主键,而且是由hibernate自己维护INDEX_的指。
byteBlocks是一个List,它里面的每一个元素在保存时就保存在element元素BYTES_字段中。
包中另外一个类ByteBlockChopper用于对字节数组进行分块和合并,其中分块的标准是jbpm.cfg.xml中的属性jbpm.byte.block.size的值确定;这个包的用途如下:ByteArray is a persistable array of bytes. While there is no generic way of storing blobs that is supported by many databases, all databases are able to handle small chunksof bytes properly. It is the responsibility of this class to chop the large bytearray into small chunks of 1K (and combine the chunks again in the reverse way).Hibernate will persist the list of byte-chunks in the database。
Jbpm,他是jboss下的一个开源项目,是个基于petri net理论为基础的工作流引擎。
本文主要通过jbpm源代码分析下jbpm引擎内核工作原理。
Jbpm是基于微内核引擎的基础上扩展开发出来的工作流平台,其运行的核心包是在org.jbpm.graph下,在该包下又分有action、def、exe、log、node几个包,jbpm内核引擎实现逻辑主要存放在def、exe这两个包下,其他的包是基于此内核扩展出来的动作、模型和日志。
下面我们通过一个简单的例子来逐步的分析jbpm是如何工作的。
看下面jbpm自带演示的一个hello流程(视乎大家都喜欢从hello实现开始^_^),代码如下:
public void testHelloWorldProcess() {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
"<process-definition>" +
" <start-state>" +
" <transition to='s' />" +
" </start-state>" +
" <state name='s'>" +
" <transition to='end' />" +
" </state>" +
" <end-state name='end' />" +
"</process-definition>"
);
ProcessInstance processInstance =new ProcessInstance(processDefinition); Token token = processInstance.getRootToken();
assertSame(processDefinition.getStartState(), token.getNode());
token.signal();
assertSame(processDefinition.getNode("s"), token.getNode());
token.signal();
assertSame(processDefinition.getNode("end"), token.getNode());
}
首先,我们定义个流程模板(ProcessDefinition),就是上面代码的ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(….);这段,在括号中是jbpm定义的流程,其中包括三个环节,分别是starts-state、state和end-state。
parseXmlString()方法的主要功能是解析这段xml语言返回个流程模板对象(processDefinition)。
接着,通过流程实例类(ProcessInstance)来实例化个流程实例,通过传进来的流程模板对象创建ProcessInstance processInstance =new
ProcessInstance(processDefinition)。
我们来看看new ProcessInstance(processDefinition)到底做了什么,通过查看ProcessInstance的源代码,可以看到其中主要的一段是
public ProcessInstance( ProcessDefinition processDefinition ) {
//略去其他代码
this.processDefinition = processDefinition; //将流程模板对象付给流程实例
this.rootToken = new Token(this); //创建跟令牌
//略去其他代码
}
我们继续跟进Token这个类
public Token(ProcessInstance processInstance) {
//主要一句如下
this.node = processInstance.getProcessDefinition().getStartState();
}
这样就实现了令牌绑定到开始节点。
至此,一个流程实例就创建起来了,并且该流程实例走到了开始节点,即令牌所处的位置。
我们接着往下走token.signal()
public void signal() {
signal(node.getDefaultLeavingTransition(), new ExecutionContext(this));
//这里的getDefaultLeavingTransition()如果有多条路径,则去第一条路径}
void signal(Transition transition, ExecutionContext executionContext) { //省略其他代码
node.leave(executionContext, transition);
//省略其他代码
}
这里的node就是刚才令牌所在的开始节点,我们来看看jbpm是如何将令牌从开始节点移到下个节点的。
public void leave(ExecutionContext executionContext, Transition transition) { Token token = executionContext.getToken();
token.setNode(this);//此时令牌还在开始节点
executionContext.setTransition(transition);
//略去部分代码
executionContext.setTransitionSource(this);
transition.take(executionContext);//实现令牌的转移
}
我们来看看transition.take(..)方法做了什么
public void take(ExecutionContext executionContext) {
//略去部分代码
to.enter(executionContext);//离开开始节点,进入到下个节点
}
大家可能会有点疑问,这个to节点是什么是否初始化的?其实在signal时有句node.getDefaultLeavingTransition(),这句返回Transition对象,该对象就已经初始化了to 节点的对象。
我们在跟进to.enter(..)
public void enter(ExecutionContext executionContext) {
Token token = executionContext.getToken();
token.setNode(this);//此时令牌就到了名字为“s”的state节点
token.setNodeEnter(new Date());
executionContext.setTransition(null);
executionContext.setTransitionSource(null);
execute(executionContext);
}
在这段代码中的注释这句,真正实现了令牌从开始节点到下个节点了。
至此,jbpm工作流引擎的内部工作原理就介绍完了,其实这就是工作流引擎最核心的部分了,就是如何从一个环节转移到另一个环节。
或许你会说“这么简单,我马上就可以写一个”,其实不然,上面我们所用的例子是十分简单的例子,其实在工作流联盟规范中还有其他复杂的节点模型,如split,join,subflow等。
不过幸运的是这些复杂的节点模型jbpm 都为我们提供了他自己的默认的实现,这些节点模型都在org.jbpm.graph.node包下。
jbpm 引擎中很好的抽象了节点模型Node类,大部分的复杂节点模型都继承自Node,我们也可以定制自己的节点,只要实现Node类的execute()方法即可方便的实现。
其实从上面分析的代码可以看出,Node类主要的逻辑处理是在leave()、enter()和execute()三个方法,大家可以看下ProcessState,join,fork这些节点模型是如何实现的。
以上简单介绍了jbpm引擎内核的工作原理,如有不对的地方还望指正。