工作流框架JBPM使用说明书
(V1.0)
长城计算机软件与系统有限公司
目录
1 引言 2
1.1 简介 2
1.2 使用版本 2
1.3 使用环境 2
2 使用说明 3
2.1 建立数据库 3
2.2 建立项目 6
2.3 建立工作流定义 6
2.4 工作流的发布 8
2.5 工作流中定义的类 9
1 引言
1.1 简介
JBoss JBPM是一个灵活、可扩展的流程语言框架。JPDL是建立在这个通用框架之上的一个流程语言。它使用直观的流程语言以图形化的方式来表示业务流程,使用术语任务、异步通讯等待状态、定时器、自动操作等。为了将这些操作绑定在一起,JPDL提供了强有力的、可扩展的流程控制机制。
JBoss jBPM有一个具有最小的依赖性和尽可能简单易用的java库。当然它也可以用在吞吐量极为关键的J2EE集应用服务器环境中。
持久层采用Hibernate实现,理论上说,只要Hibernate支持的数据库JBPM都支持。
1.2 使用版本
本例中使用的是JBPM-3.2-GA版本,需要JDK 1.4.2及以上版本,下载地址为:/jbossjbpm/jbpm_downloads/,建议下载完整包。在jbpm安装路径\designer\eclipse中有支持图形化设计的插件,将其加到eclipse中,在eclipse的窗口-首选项中如果有jboss jbpm选项,则安装成功。
1.3 使用环境
本说明书中用到的软件环境如下:
操作系统:Window XP sp3
JDK:1.4.2_08
IDE:MyEclipse 5.5
应用服务器:Weblogic 8.1 Tomcat 5.0
数据库:oracle 9i
2 使用说明
该示例演示的是一个公司报销流程。普通员工可以填写报销单,然后提交主管审批;主管审批可以有三种可能:一是主管可以驳回请求,那么报销人需要重填报销单,或者取消报销操作;二是主管不同意请求,请求直接结束;三是主管同意请求,那又存在两种情况,一是如果报销总费用大于1000的话那么会自动转到老板那里,如果小于1000就直接进入财务处理子流程,老板审批的话有两种可能,一是同意进入财务处理子流程,二是不同意请求直接结束。
2.1 建立数据库
以下是使用JBPM需要的建库脚本:jbpm-jpdl-3.2.GA\db\acle.sql,运行后,数据库中会建立28张以JBPM_开头的表。例子所用的其他表的建表语句如下,此为sql server版本,oracle下稍加修改便可。
--用户表 create table tb_user( user_id int primary key identity(1,1),--用户ID user_name varchar(30),--用户名 user_password varchar(30),--密码 user_type int --用户类型(0为普通用户,1为主管,2为老板,3为财务人员) ) go --报销表 create table tb_baoxiao( baoxiao_id int primary key identity(1,1), baoxiao_title varchar(30),--报销主题 baoxiao_memo varchar(30),--备注 user_id int,--报销人 baoxiao_date datetime, --报销时间 baoxiao_flag bit --报销状态(0为未处理,1为已处理) ) go --报销项目表 create table tb_baoxiao_item( item_id int primary key identity(1,1), item_name varchar(30),--项目名称 item_money varchar(100),--项目金额 baoxiao_id int --报销表ID ) go --审核意见表 create table tb_approve( approve_id int primary key identity(1,1), user_id int,--审核人ID baoxiao_id int,--报销表ID approve_result varchar(30),--审核结果 approve_memo varchar(30),--审核意见 approve_date datetime --审核日期 ) go --为报销表添加外键 alter table tb_baoxiao add CONSTRAINT baoxiao_foreign_key foreign key (user_id) references tb_user(user_id) go --为报销项目表添加外键 alter table tb_baoxiao_item add CONSTRAINT baoxiao_item_foreign_key foreign key (baoxiao_id) references tb_baoxiao(baoxiao_id) go --为审核意见表添加外键 alter table tb_approve add CONSTRAINT approve_user_foreign_key foreign key (user_id) references tb_user(user_id) go alter table tb_approve add CONSTRAINT approve_baoxiao_foreign_key foreign key (baoxiao_id) references tb_baoxiao(baoxiao_id) go |
以下是用户的初始化数据:
user tb_user go insert into tb_user(user_name,user_password,user_type) values('test','123',0) insert into tb_user(user_name,user_password,user_type) values('manager1','123',1) insert into tb_user(user_name,user_password,user_type) values('manager2','123',1) insert into tb_user(user_name,user_password,user_type) values('boss','123',2) insert into tb_user(user_name,user_password,user_type) values('caiwu','123',2) |
2.2 建立项目
在eclipse中新建一个web项目,构建路径导入jbpm路径下的jbpm-identity.jar、jbpm-jpdl.jar两个包,以及jbpm安装路径\lib下的所有jar包(使用weblogic不要导入servlet-api.jar这个包)。在项目的src下复制jbpm安装路径\config下的4个配置文件,并修改hibernate中的相应配置。
2.3 建立工作流定义
在eclipse中右键点击包,点新建一个jboss jbpm-process definition,然后进行流程图的设计,本例的财务报销流程图如下:
对应的l文件内容如下:
<?xml version="1.0" encoding="utf-8"?> <process-definition xmlns="" name="baoxiao"> <start-state name="start"> <task name="填写报销单"> <controller> <variable name="baixiaoId" access="read,write,required" mapped-name="报销ID"></variable> </controller> <assignment class="com.workflow.assignment.UserAssignment" /> </task> <transition name="提交到部门主管" to="部门主管审核"></transition> </start-state> <task-node name="部门主管审核"> <task name="主管审核"> <controller> <variable name="baixiaoId" access="read" mapped-name="报销ID"></variable> </controller> <assignment class="com.workflow.assignment.ManagerAssignment" /> </task> <transition name="要求修改" to="申请人修改报销单"></transition> <transition name="主管同意" to="判断走向"></transition> </task-node> <task-node name="申请人修改报销单"> <task name="修改报销单"> <controller> <variable name="baixiaoId" access="read,write,required" mapped-name="报销ID"></variable> </controller> <assignment class="com.workflow.assignment.UserAssignment" /> </task> <transition name="提交重审" to="部门主管审核"></transition> <transition name="放弃申请" to="end1"></transition> </task-node> <decision name="判断走向"> <handler class="com.workflow.decision.ProcessDecision" /> <transition name="大于10000" to="老板审核申请"></transition> <transition name="小于10000" to="财务处理流程"></transition> <transition name="主管不同意" to="自动处理申请结果"></transition> </decision> <task-node name="老板审核申请"> <task name="老板审核"> <controller> <variable name="baixiaoId" access="read" mapped-name="报销ID"></variable> </controller> <assignment class="com.workflow.assignment.BossAssignment" /> </task> <transition name="老板同意" to="财务处理流程"></transition> <transition name="老板不同意" to="自动处理申请结果"></transition> </task-node> <process-state name="财务处理流程"> <sub-process name="caiwu" binding = "late"/> <variable name="baixiaoId" access="read" mapped-name="报销ID"></variable> <transition name="" to="自动处理申请结果"></transition> </process-state> <node name="自动处理申请结果"> <event type="node-enter"> <action name="action1" class="com.workflow.action.ProcessResult" /> </event> <transition name="" to="end1"></transition> </node> <end-state name="end1"></end-state> </process-definition> |
财务处理的子流程图如下:
相应的l文件如下:
<?xml version="1.0" encoding="UTF-8"?> <process-definition xmlns="" name="caiwu"> <start-state name="start"> <transition name="" to="自动财务处理"></transition> </start-state> <end-state name="end1"></end-state> <node name="自动财务处理"> <event type="node-enter"> <action name="cai" class="com.workflow.action.CaiwuProcessAction" /> </event> <transition name="" to="end1"></transition> </node> </process-definition> |
2.4 工作流的发布
这里使用一个简单的struts action类,当用户在页面出发此类时,发布流程。因为本例中有子流程,所以必须先发布子流程,再发布父路程。
public class ReleaseAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { try { InputStream is = new FileInputStream(request.getRealPath("/") + "/WEB-INF/classes/" + "com/workflow/flowchart/l"); ProcessDefinition processDefinition = ProcessDefinition .parseXmlInputStream(is); InputStream is1 = new FileInputStream(request.getRealPath("/") + "/WEB-INF/classes/" + "com/workflow/flowchart/l"); ProcessDefinition processDefinition1 = ProcessDefinition .parseXmlInputStream(is1); // 从 l 取得 jbpm 的配置 JbpmConfiguration config = JbpmConfiguration.getInstance(); // 创建一个 jbpm 容器 JbpmContext jbpmContext = ateJbpmContext(); jbpmContext.deployProcessDefinition(processDefinition); jbpmContext.deployProcessDefinition(processDefinition1); jbpmContext.close(); return mapping.findForward("success"); } catch (Exception e) { e.printStackTrace(); return mapping.findForward("fail"); } } } |
至此,如果用户在页面中出发此action,工作流就会发布,在数据库中可以看到多了很多数据,JBPM_PROCESSDEFINITION表中有刚发布的两个流程的信息。
2.5 工作流中定义的类
主流程中的用于普通员工的任务分配类代码如下:
public class UserAssignment implements AssignmentHandler { public void assign(Assignable arg0, ExecutionContext arg1) throws Exception { String issueUser=(String) ContextInstance().getVariable("issueUser"); arg0.setActorId(issueUser); } } |
主流程中用于主管审批的任务分配类代码如下:
public class ManagerAssignment implements AssignmentHandler { public void assign(Assignable arg0, ExecutionContext arg1) throws Exception { TbUserDAO tbUserDAO = new TbUserDAO(); List list=tbUserDAO.findByUserType(new Long(1)); String [] manager=new String[list.size()]; int i=0; for (Iterator iter = list.iterator(); iter.hasNext();) { TbUser el = (TbUser) (); manager[i++]=el.getUserId().toString(); } arg0.setPooledActors(manager); } } |
主流程中老板审批的任务分配类的代码如下:
public class BossAssignment implements AssignmentHandler{ public void assign(Assignable arg0, ExecutionContext arg1) throws Exception { TbUserDAO tbUserDAO = new TbUserDAO(); List list=tbUserDAO.findByUserType(new Long(2)); String [] boss=new String[list.size()]; int i=0; for (Iterator iter = list.iterator(); iter.hasNext();) { TbUser el = (TbUser) (); boss[i++]=el.getUserId().toString(); } arg0.setPooledActors(boss); } } |
财务处理子流程的任务分配方法没有写,与主流程的是一样的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论