JBPM

是什么?

·定义:

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();
		
	}

6.3.2 createInstance()创建流程实例

	@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);
		
	}

6.3.4 getTask() 获取任务信息

@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());
		
	}

6.3.5 completeTask() 完成任务

	@Override
	public void completeTask() {
		super.startup();
		taskService.completeTask("");
		
	}

然后,按顺序执行测试就ok啦。


执行完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给我们提供了一个整套的流程逻辑,对于解决流程化的问题是一个非常不错的选择。

你可能感兴趣的:(JBPM)