是什么?
·定义:
JBPM全称Java Business ProcessManagement(业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。
·Configuration和ProcessEngine
Configuration是jbpm的配置文件管理对象及资源加载对象,负责加载jbpm的各种配置如数据库连接配置、事务配置、身份认证、jpdl等相关配置。
ProcessEngine是一个服务工厂,有点类似hibernate的sessionFactory负责创建jbpm的每个服务。(ProcessEngine通过Configuration类构建,Configuration以单例模式获取ProcessEngine对象;ProcessEngine是线程安全的,所有的线程和请求都可以使用同一个ProcessEngine对象)
·ProcessEngine核心服务:
RepositoryService
流程资源服务接口。提供对流程定义的部署、查询、删除和流程图查看等操作。
ExecutionService
流程执行服务接口。提供启动流程实例、推进、删除等操作。
TaskService
人工任务服务接口。提供对任务的创建、提交、保存、删除等操作。
HistoryService
流程历史服务接口。提供对任务的管理操作。提供对流程历史库中历史流程实例、历史活动实例等记录的查询。
ManagementService
流程管理接口。通常用来管理Jop(异步服务)
IdentityService
身份认证服务接口。提供对流程用户、用户组管理。
·JBPM流程变量
流程实例变量ProcessInstance>task(不同流程实例、不同任务的流程变量是不能互相访问)
任务变量Task
变量作用域,两种变量之间的关系
*任务变量和流程实例变量
*流程实例变量直接
*任务变量和任务变量
·流程定义语言JPDL
JPDL(JBossJBPM ProcessDefinition Language)是构建于JBPM矿建上的流行语言之一。在JPDL中提供服务tasks、待处理状态waitstates、计时器timers、自动处理automated actions 。。。等术语,并通过图形化的流程定义,很直观滴描述业务流程。
·JPDL常用活动(Activity)节点
Start开始活动
State状态活动
Decision判断活动
Fork-join分支活动
End结束活动
为什么?
工作流引擎作用:给我们提供流程逻辑的定义方法,给我们提供根据流程逻辑来调度业务的功能。能是我们避免在代码中硬编码流程逻辑,因为硬编码的逻辑难于理解和服用,并且非常容易受到变化的影响,维护起来极度困难。
怎么用?
说明:使用eclipse+mysql+JPBM4.4进行小实例展示
1、在eclipse中安装相关插件
Help——>Install New Software
2、添加相关提示约束
Window——>preferences——>XML Catalog
3、引入相关jar包(可以自己建立一个userliberty)
然后引入\jbpm-4.4\lib需要用到的jar以及jbpm.jar核心包。
4、添加相关配置文件:jbpm.hibernate.cfg.xml、jbpm.cfg.xml
·jbpm.hibernate.cfg.xml(hibernate的配置信息,设置数据库连接属性等)
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///jbpm3</property> <property name="hibernate.connection.username">**</property> <property name="hibernate.connection.password">**</property> <property name="hibernate.hbm2ddl.auto">updates</property>//初次运行时需要写create <property name="hibernate.format_sql">true</property> <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" /> </session-factory> </hibernate-configuration>
·jbpm.cfg.xml(就用它example里面自带的模板就可以了)
<?xml version="1.0" encoding="UTF-8"?> <jbpm-configuration> <!-- 引入外部文件 --> <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" /> <!-- Job executor is excluded for running the example test cases. --> <!-- To enable timers and messages in production use, this should be included. --> <!-- <import resource="jbpm.jobexecutor.cfg.xml" /> --> </jbpm-configuration>
5、创建实例
新建一个java project项目。NewJboss jBPM
然后就会出现一个*.jpdl.xml文件,如下所示进行流程的绘制。
流程绘制完成进行保存,会自动生成xml代码,同时还会保存成一份png图片:
6、编写测试程序:
6.1新建一个公共类JbpmTestCase,封装了服务和startup()、print()方法
public class JbpmTestCase extends TestCase{ protected RepositoryService repositoryService;//流程资源服务 protected ExecutionService executionService;//流程执行服务 protected TaskService taskService;//人工任务服务 protected HistoryService historyService;//流程历史服务 protected ManagementService managementService;//流程管理服务 protected IdentityService identityService;//身份认证服务 protected void startup(){ ProcessEngine processEngine=Configuration.getProcessEngine(); repositoryService=processEngine.getRepositoryService(); executionService=processEngine.getExecutionService(); taskService=processEngine.getTaskService(); historyService=processEngine.getHistoryService(); managementService=processEngine.getManagementService(); identityService=processEngine.getIdentityService(); } public void print(String name,String value){ System.out.println(name+"====="+value); } public void print(String name,int value){ System.out.println(name+"====="+value); } }
6.2 新建接口JbpmUtil,声明流程创建所需方法。
public interface JbpmUntil { public void deploy();//部署流程 public void createInstance();//创建流程 public void getCurrectActivity();//获取流程实例 public void getTask();//获取当前任务 public void completeTask();//完成任务 }6.3编写测试类Test.java实现JbpmUtil接口的方法。并集成公共类JbpmTestCase。
6.3.1 deploy()部署流程
@Override public void deploy() { super.startup(); repositoryService.createDeployment().addResourceFromClasspath(".../state.jpdl.xml").deploy(); }
@Override public void createInstance() { super.startup(); ProcessInstance processInstance=executionService.startProcessInstanceByKey("state"); print("流程实例ID",processInstance.getId()); }
6.3.3 getCurrectActivity() 获取当前节点名称
@Override public void getCurrectActivity() { super.startup(); String name=executionService.createProcessInstanceQuery().processInstanceId("***").uniqueResult().findActiveActivityNames().toString(); print("当前节点名称:",name); }
@Override public void getTask() { super.startup(); List<Task>tasks=taskService.findPersonalTasks("A"); print("任务数量",tasks.size()); print("任务名称",tasks.get(0).getActivityName()); print("任务ID",tasks.get(0).getId()); }
@Override public void completeTask() { super.startup(); taskService.completeTask(""); }
执行完deploy方法后,会在数据库中生成相应的表:
下面小编简单介绍一下生成的这18张表都是干什么用的:
jbpm4_deployment流程定义表。主要包括流程id、name、state
jbpm4_deployprop流程定义属性表。主要包括流程id、objname、stringval(*.jpbl.xml文件的value)
jbpm4_execution流程实例表。主要包括:流程id、activityname、state等
jbpm4_property流程引擎表。主要包括:流程执行的verison等
jbpm4_hist_actinst流程活动实例表,存放活动的历史记录
jbpm4_hist_detail流程历史详细信息表。保存Variable的变更记录
jbpm4_hist_procinst流程实例历史表,存放Process Instance的历史信息
jbpm4_hist_task流程任务实例历史表 存放task的历史信息
jbpm4_hist_var 流程变量历史表 存放历史的流程变量
jbpm4_id_group用户组表
jbpm4_id_membership用户关系表
jbpm4_id_user用户表。存储用户信息
jbpm4_job定时表,存放的是timer的定义
jbpm4_lob存储表,新增记录
jbpm4_participation 参与者表,存放参与者信息
jbpm4_swimlane泳道表,通过泳道可以把多个任务分给同一个人执行
jbpm4_task流程任务表,存放需要人来参与完成的Activity
jbpm4_variable上下文表
学习小结:
通过这几天的jbpm的学习,对于工作流有了进一步的理解和学习。jbpm给我们提供了一个整套的流程逻辑,对于解决流程化的问题是一个非常不错的选择。