工作流框架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);
    }
}
foreign key references用法
财务处理子流程的任务分配方法没有写,与主流程的是一样的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。