JBPM:为工作流的一个框架,java业务流程管理系统
JBPM入门:
工作流:就是业务过程的部分或整体在计算机应用环境下的自动化,主要解决:多个人在一起工作完成某件事的步骤
将JBPM控制台部署到tomcat中:
将项目jbpm-console导入到myeclipse中,并修改jbpm.hibernate.cfg.xml中的数据库用户名和密码
1:定义工作流,执行工作流
流程:首先需要一个人-----》定义流程,png图片为用户查看,xml文档:为计算机程序提供------》执行流程:由用户参与执行(eg员工,经理)
注意:创建流程图时,要定义每个任务的流程分配eg:提交申请--->员工 审批--->部门经理
JBPM所有的操作都是通过service完成的
//创建流程引擎,加载类路径下的文件jbpm.cfg.xml
private ProcessEngine processEngine=new org.jbpm.api.Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();
//创建数据库18张表:
public void testCreate18Table(){
  new Configuration().configure("jbpm.hibernate.cfg.xml").buildSessionFactory();
 }
//部署流程定义
 @Test
 public void deployProcessDefination(){
  String deploymentID=processEngine.getRepositoryService()//管理部署对象和流程定义的service
  .createDeployment()//部署对象
  .addResourceFromClasspath("helloWorld/helloWorld.jpdl.xml")
  .addResourceFromClasspath("helloWorld/helloWorld.png")
  .deploy();//部署
  System.out.println("部署流程定义ID:"+deploymentID);
 }
//启动流程实例
 @Test
 public void startProcessDefination(){
  String processDefinationKey="helloWorld";(流程定义的Key即为流程图中的key属性,若不写莫认为name属性的值)
  ProcessInstance pi=processEngine.getExecutionService()//管理执行的service
  .startProcessInstanceByKey(processDefinationKey);//按照流程定义的key启动流程实例
  System.out.println("流程ID:"+pi.getId());
  System.out.println("流程定义的id:"+pi.getProcessDefinitionId());
 }
//查看我的个人任务列表
 @Test
 public void findMyPersonTaskList(){
  //String userId="员工";
  //String userId="部门经理";
  String userId="总经理";
  List<Task> list=processEngine.getTaskService()//调用管理任务的service
  .findPersonalTasks(userId);//
  if(list!=null&&list.size()>0){
   for (Task task : list) {
    System.out.println(task.getId());
    System.out.println(task.getName());//任务名称
    System.out.println(task.getAssignee());//任务办理人
    System.out.println(task.getCreateTime());//创建时间
    System.out.println(task.getExecutionId());//执行ID
   }
//办理个人任务
 @Test
 public void banliTask(){
  String taskId="40001";
  processEngine.getTaskService()
  .completeTask(taskId);//指定任务的ID完成任务
  System.out.println("完成任务");
 }

JBPM的工作流程:
部署流程定义(加载流程图)---》启动流程实例(执行流程)-----》查看我的个人任务列表-----》办理个人任务
按照流程定义的key属性进行查询,返回一个集合,List<processDefinition> list=processengine.getRepositoryService
创建流程引擎的三种方式:
//加载流程引擎的三种方式
 //第一种方式:加载类路径下的jbpm.cfg.xml
 //private ProcessEngine processEngine=new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();
 //第二种方式:默认的方式,自动加载类路径下的jbpm.cfg.xml
 //private ProcessEngine processEngine =new Configuration().buildProcessEngine();
 //第三种方式:单例模式
private ProcessEngine processEngine =Configuration.getProcessEngine();
JBPM没有提供修改的功能
使用版本号来确定当前执行的是哪一个流程
部署对象:一次部署一个或者多个文件信息
流程定义:解析流程定义的XML,得到的流程定义规则的信息,JBPM就是按照解析出来流程定义的规则执行工作流
流程实例和任务:
#与流程实例、执行对象、任务相关的表
SELECT * FROM jbpm4_execution  #正在执行流程实例表

SELECT * FROM jbpm4_hist_procinst #流程实例的历史表

SELECT * FROM jbpm4_task #正在执行任务信息表

SELECT * FROM jbpm4_hist_task #任务历史表


与流程实例,执行对象任务相关的表jbpm_execution:流程实例表  jbpm4_hist_procinst:流程实例的历史表  jbpm4_task:任务
执行对象:表示流程执行一次的过程
流程实例:表示流程执行一次的过程
任务:当活动节点是任务的时候,要执行的操作
活动节点:任务活动,指定办理人完成任务;状态活动:使当前活动处于等待状态;
执行对象和流程实例的区别:
执行对象为流程的一次执行过程
流程实例为从开始到结束最大的流程分支,就是流程实例
什么情况下,流程实例就是执行对象?
只有一个流程的时候,此时流程实例就是执行对象
流程变量:
使用流程变量,用于在活动环节设置变量值,并可以在下一个环节获得变量值,方便在各个环节中查看流程变量
涉及到的表:jbpm4_variable
连线(transition):
    1:部署流程定义利用addResourceFromUrl   this.getclass().getResouce();
    2:启动流程实例
    3:查看个人任务(以流程实例的ID进行查看,获取唯一值)
    4:完成我的个人任务(按照指定的连线名称完成任务)
连线的特点:
1、一个活动中可以指定一个或多个Transition(Start中只能有一个,End中没有)。
  * 开始活动中只能有一个Transition。
  * 结束活动中没有Transition。
  * 其他活动中有1条或多条Transition
2、如果只有一个,则可以不指定名称(名称是null);
     如果有多个,则要分别指定唯一的名称。

判断(decision):
 1:部署流程定义利用addResourceFromUrl   this.getclass().getResouce();
    2:启动流程实例,同时设置流程变量:Map<String,Object> variables=new haskMap<>;
variables.put("报销金额",500),1000元以下流程直接结束,1000元以上流程要经过总经理执行
    3:查看个人任务(以流程实例的ID进行查看,获取唯一值)
    4:完成我的个人任务
创建一个类实现decisionhandler,覆盖方法decide,参数表示与流程相关的对象,返回值为:表示返回指定连线的名字
在方法中:Interger value=execition.getVARIABLE("报销金额"),如果value不为null并且小于1000
分签和会签(fork and join):
1:部署流程定义
2:启动流程实例
分配个人任务总结:
个人任务及三种分配方式:
    1:在.jpdl.xml中直接写 assignee="张三"
    2:在.jpdl.xml中写 assignee=“#{userId}”,变量的值要是String的。
         使用流程变量指定办理人
    3,使用AssignmentHandler接口,要使类实现该接口,在类中定义:
         assignable.setAssignee(userId); // 指定个人任务的办理人
        使用任务ID和办理人重新指定办理人:
     processEngine.getTaskService().assignTask(taskId, userId);
分配组任务总结:
组任务及三种分配方式:
    1:在.jpdl.xml中直接写 candidate-users=“小A,小B,小C,小D"
    2:在.jpdl.xml中写 candidate-users =“#{userIds}”,变量的值要是String的。
         使用流程变量指定办理人
              Map<String, Object> variables = new HashMap<String, Object>();
              variables.put("userIDs", "大大,小小,中中");
    3,使用AssignmentHandler接口,使用类实现该接口,在类中定义:
            //添加组任务的用户
assignable.addCandidateUser("张无忌");
assignable.addCandidateUser(“张三丰”);   
组任务分配给个人任务:
     processEngine.getTaskService().takeTask(taskId, userId);
个人任务分配给组任务:
     processEngine.getTaskService().assignTask(taskId, null);
向组任务添加人员:
     processEngine.getTaskService().addTaskParticipatingUser(taskId, userId, Participation.CANDIDATE);

活动的概念:
          task:
         state:
         custom(自定义节点):特点:当使用自定义活动时,此时流程默认不会在自定义活动节点上停留,而是执行完execute方法后,继续往下执行,
当流程离开自定义活动的时候,需要调用signal方法,使用自定义活动时,此时流程默认不会在自定义活动节点上停留,signal方法不会被执行,要想调用signal方法,必须让自定义活动节点处于等待状态,将自定义活动处于等待状态后,并且调用向后执行一步
事件(监听器):
事件类:
public class EventListenerImpl implements EventListener 
JBPM整合项目:
1:导入相应的jar包
2:将tomcat下的lib下的el-api.jar注释掉,导入一下三个jar包:Juel-api.jar,Juel-engine.jar,Juel-impl.jar
3:修改配置文件:在src下导入jbpm.cfg.xml文件,并在此文件下添加
<import resource="jbpm.default.cfg.xml" />
  <import resource="jbpm.businesscalendar.cfg.xml" />
  <import resource="jbpm.tx.hibernate.cfg.xml" />
  <import resource="jbpm.jpdl.cfg.xml" />
  <import resource="jbpm.bpmn.cfg.xml" />
  <import resource="jbpm.identity.cfg.xml" />
4:因为项目中hibernate.cfg.xml文件与jbpm.hibernate.cfg.xml文件冲突,
所以修改hibernate.cfg.xml文件
添加Jbpm所需要的配置文件
  <!-- 导入JBPM工作流的映射文件 修改添加工作流-->
      <mapping resource="jbpm.repository.hbm.xml" />
      <mapping resource="jbpm.execution.hbm.xml" />
      <mapping resource="jbpm.history.hbm.xml" />
      <mapping resource="jbpm.task.hbm.xml" />
      <mapping resource="jbpm.identity.hbm.xml" />
5:使用测试类,生成18张表
6:在jbpm.cfg.xml文件中添加与spring的整合:
  <!-- 与spring整合需要 -->
  <import resource="jbpm.tx.spring.cfg.xml" />
7:在beans.xml中配置流程引擎
<!-- 配置ProcessEngine(与JBPM4.4整合) -->
<bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper">
     <property name="jbpmCfg" value="jbpm.cfg.xml"></property>
</bean>
<bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine" /> 
7:测试流程引擎

 

设备购置计划:提交申请---》审批(部门经理)---》审批(总经理)
设备费用离开统管理员操作此模块
审批流程管理:部署流程定义,对流程定义的CRUD操作,主要有系统管理员操作
申请模板管理:针对流程定义(一个流程对应一个申请模板),对申请模板的CRUD的操作(文件的上传和下载),主要有系统管理员操作
起草申请:用户根据提供的流程模板进行下载,然后进行编辑,将编辑后的文件上传,上传的过程就是报审,报审后由领导进行审批,此模块是由用户操作(张三)
待我审批:
我的申请查询:可以查看当前用户的报审信息,信息包括(审核中,审核不通过,审核通过),用户可以查看每个流程的执行过程,此模块是由用户操作(张三)