一、 工作流
工作流(Workflow):就是“业务过程的部分或整体在计算机应用环境下的自动化”
l 简单的说,就是将工作的流程通过程序管理起来,以表单审核和任务办理为主体,实现办公自动化
工作流帮助程序管理业务流程,业务操作不发生改变,工作流只是通知程序,该哪个角色进行某个 任务
典型应用:工作流技术是OA项目典型标志
主流工作流引擎 :
OSWorkflow:OSWorkflow是一个灵活的工作流引擎,设计成可嵌入到企业应用程序中。它提供了许多的持久化API支持包括:EJB,Hibernate,JDBC和其它。OSWorkflow还可以与Spring集成。
OFBiz(大型): OFBiz是一个非常著名的开源项目,提供了创建基于最新J2EE/XML规范和技术标准,构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类WEB应用系统的框架。 OFBiz最主要的特点是OFBiz提供了一整套的开发基于Java的web应用程序的组件和工具。包括实体引擎, 服务引擎, 消息引擎, 工作流引擎, 规则引擎等。
jBpm(轻量级): jBpm是一个灵活可扩展的工作流管理系统。作为 jBpm运行时server输入的业务流程使用简单强大的语言表达并打包在流程档案中。jBmp将工作流应用开发的便利性和杰出的企业应用集成(EAI)能力结合了起来。jBmp包括一个Web应用程序和一个日程安排程序。jBmp是一组J2SE组件,可以作为J2EE应用集群部署。
JBPM采用XML结构的流程描述语言JPDL来描述工作流程,并且JBPM使用Hibernate作为持久层工具。
JBPM的最新版本为 JBPM6,现在主流企业版本 为4.4,JBPM 从5版本开始分流:JBPM 5和JBPM4完全不同,Activity原JBPM4团队开发。
JBPM Demo 演示
1、 通过 java applet 流程设计器,设计请假流程,保存 holiday.zip 文件
2、 启动示例中自带tomcat程序(配置 JAVA_HOME)
webapps\MyJbpm4-Console\WEB-INF\classes修改jbpm.hibernate.cfg.xml 配置 jdbc连接参数
3、 以admin 登陆,上传发布流程 -- 启动实例
4、 以员工登陆,填写请假申请
5、 以部门经理登陆,进行审批
我们可以从JBPM得知
1、 当前业务流程是什么?
2、 当前业务流程有哪些环节? 运行到哪个环境?
3、 该环节由谁来完成?
4、 以具体身份用户登陆,办理对应任务
二、 JBPM 快速入门(开发环境准备)
下载jbpm 4.4 的zip包
API文档:jBPM 4.4 API.chm
1) 安装 gpd 设计器 (Graphical Process Designer (GPD))
通常在企业设计业务流程时,通过画图作业来完成
安装环境 :需要 eclipse3.5 ---- myeclipse 8.5 以上
步骤:
1、 点击myeclipse的help中的myeclipse configuration center
2、选择add-site 本地压缩包安装 \install\src\gpd\jbpm-gpd-site.zip
3、 右击每一项Add to Profile
4、 点击Apply 8 changes按钮提交8处更新,安装完成后提示重启myeclipse
如果在Window的preferences看到jBoss jbpm选项证明(安装成功)
新建工程然后新建 JBPM4 ProcessDefinition 使用 GPD 设计请假流程,即可生成 xxx.jpdl.xml文件,同步产生 png 图片,手动配置xml需要配置添加schema提示 * \src\jpdl-4.4.xsd。
2) 搭建开发环境 导入jar包和配置文件
导入jbpm.jar 核心jar
导入 lib/*.jar(不导入 servlet-api.jar、 junit.jar、 slf4j相关所有jar)
导入slf4j 替换jar
导入配置文件:
src导入log4j.properties日志配置文件
JBPM_HOME/examples/src/jbpm.cfg.xml、jbpm.hibernate.cfg.xml
配置jbpm.hibernate.cfg.xml jdbc的数据库连接参数
注:**使用org.hibernate.dialect.MySQLDialect方言会有流程结束异常问题
** 使用 org.hibernate.dialect.MySQL5InnoDBDialect替换方言
运行后会创建 jbpm18张数据表
// 只需要加载jbpm 核心配置文件 jbpm.cfg.xml
Configuration configuration = new Configuration();
// 获得jbpm流程引擎(完成建表)
configuration.buildProcessEngine();
三、流程定义设计和部署
1、 设计流程
使用gpd设计器设计, 可以手写xml 编写流程
2、 发布流程定义(将流程定义交给jbpm管理 )
获得RepositoryService ---- processEngine.getRepositoryService();
通过 NewDeployment进行流程发布
addResourceFromClasspath添加类路径资源
addResourcesFromZipInputStream添加压缩包文件
数据表操作
流程定义发布操作数据表流程
1、 先从 jbpm4_property 属性表 获得下次操作数据id(value每次加10000)
2、 向jbpm4_deployment(发布表) 插入 1条数据
3、 向jbpm4_lob (发布资源表) 插入n条数据 (多少个文件就插入多少条)
4、 向jbpm4_deployprop(发布流程信息表) 插入 4条数据
5、 更新jbpm4_property 下次数据表操作 id + 10000
3、 对发布流程定义 进行查询
通过ProcessDefinitionQuery查询流程定义信息
l repositoryService.createProcessDefinitionQuery()
• processDefinitionId(processDefinitionId)
• processDefinitionKey(key)
• processDefinitionName(name)
• processDefinitionNameLike(name)
• page(firstResult, maxResults)
• orderAsc(property)
• orderDesc(property)
通常查询根据jbpm4_deployprop 表中属性进行查询
Pdid是全局唯一的标识
Pdkey流程定义关键字,允许重复 (查询结果不唯一)
<process> 元素通过key 指定key值,如果没有执行,默认name将作为key值processDefinitionName(name)通过发布name 查询
4、 查询流程定义相关资源 (图片查询)
l RepositoryService
getResourceAsStream(deploymentId,resourceName)
5、 删除流程定义
通过 流程发布 id (deploymentid) 删除
repositoryService.deleteDeployment(deploymentId);(不能有关联)
repositoryService.deleteDeploymentCascade(deploymentId);
通过 流程key 进行删除 (先通过key 查询 deploymentId, 再删除)
四、流程实例的操作
ProcessDefinition 流程定义 和 ProcessInstance 流程实例的关系
一个业务流程,编写一个jpdl描述文件,发布到jbpm中产生一个ProcessDefinition对象,需要人取操作该流程,每次流程操作,可以理解为一个ProcessInstance对象,一个流程定义可以对应很多个流程实例
1、 启动流程实例
需要 ExecutionService 进行实例运行操作
executionService.startProcessInstanceById(pdId);通过流程id
executionService.startProcessInstanceByKey(pdKey);通过流程key
启动实例数据表操作
1)、向 jbpm4_execution (流程实例执行表)表插入一条数据,代表一个实例正在运行
* 只存放 正在运行的 流程实例信息
2)、向 jbpm4_hist_procinst表(流程实例运行历史记录) 插入一条数据,记录运行实例历史
3)、如果有任务 向 jbpm4_task(任务表,当流程运行任务节点) 插入数据 记录任务
4)、向jbpm4_hist_task(任务历史记录表) 插入数据 记录任务历史
5)、向jbpm4_hist_actinst (流程活动历史记录 )流程活动历史表插入数据
**jbpm4_hist_actinst 可以存放所有活动信息,活动并不是只有任务
注意:如果用key值启动流程,key值不一定是唯一的(使用key启动,启动版本最高那个实例LONGVAL_列)
2、 流程向后一步
不管当前在什么类型 活动节点, 都可以通过 ExecutionService提供 signalExecutionById使当前流程,流转向下一个节点 executionService.signalExecutionById("holiday.50001","to 部门经理审批"); 作用将 holiday.50001业务流程,流转到 to部门经理审批 的 < transition>
3、 中止流程
executionService.endProcessInstance("holiday.70001",ProcessInstance.STATE_ENDED);
4、 通过任务的指定用户,办理任务----查看流程运行到哪个任务
5、 实际开发中 不会直接将任务向后一步,而需要通过特定用户(负责任)来办理任务
查询 某个人的个人任务列表 ,为JBPM中 Task指定负责人,由该人来完成任务
通过 gpd插件,将task指定 Assignment--- Type:assignee --- Expression 指定负责人
通过 TaskQuery 查看某人的个人任务
6 .办理个人任务
通过 TaskService 提供complateTask(taskId) 完成任务
小结:
JBPM就是第三方工作流框架,作用就是帮助程序管理业务流程
1、 流程定义 GPD设计
2、 创建JBPM表核心对象 ProcessEngine 流程引擎
3、 流程引擎 提供常见Service操作
RepositoryService 操作流程定义 ----- ProcessDefinitionQuery
ExecutionService 操作流程实例 ------ ProcessInstanceQuery
TaskService 操作流程任务 ------ TaskQuery