Jbpm工作流介绍
工作流介绍:工作流(workFlow),就是"业务过程的部分或整体在计算机应用环境化的自动化"。它主要解决的是"使多个参与者之间按照某种预定义的规则转递文档,信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现"。
通俗的说就是"流程就是将多个人在一起合作完成的事情的步骤,把步骤变成计算机能理解的形式就是工作流。"
工作流管理系统(WFMS,workflow Management System)的主要功能是通过计算机技术的支持去定义,执行和管理工作流,协调工作流执行过程中工作间以及群体成员之间的信息交互。应能提供以下三个方面的功能支持:
定义工作流:包括具体的活动,规则等。
运行控制功能:在运行环境中管理工作流程,对工作流程过程中的活动进行调度。
运行交互功能:指在工作流运行中,WFMS与用户(活动的参与者)及外部应用程序工具交互的功能。
采用工作流关系的优点:
提高系统的柔性,适应业务流程的变化。
实现更好的业务过程控制,提高顾客服务质量。
降低系统开发和维护成本。
工作流框架有:JBPM(Java Business Process Management),OSWorkflow,ActiveBPEL,YAWL等。
Jbmp快速入门:
首先是环境的搭建:在Jbmp下载下载。下载jbmp4.4的。下载下来进行解压得到一个Jbmp4.4文件。先是在eclipse或myeclipse中安装流程设计器,myeclipse是绿色版的好像安装不了。安装方法见另外一篇博客。另外还要添加xsd文件,xml文件约束具体也见另外一篇博客。
现在,开始导入Java包。显示核心包jbpm.jar。还有就是lib下面的大部分包,不是所有的,还有这个文件下有些不是Java包。如下介绍:
JBPM_HOME/lib/*.jar,不添加以下jar包:servlet-api.jar, junit.jar。其中junit.jar一定不要添加,因为是3.8.2版本,与我们使用的junit4有冲突。
由于slf4j-jdk14.jar、slf4j-log4j12.jar都具有处理日志的功能,会避免出现冲突,所以可去掉slf4j-jdk14.jar。
所使用的数据库对应的驱动的jar包(第2步所添加的jar包中已包含mysql的jdbc驱动jar包)。
添加配置文件:
配置文件可以从JBPM_HOME/examples/src/中拷贝: jbpm.cfg.xml、 logging.propertiehibernate包下/project/etc/log4j.properties即可)、 jbpm.hibernate.cfg.xml,配置文件放到项目的src下。
修改logging.properties中的日志输出级别s(拷贝为Error: log4j.rootLogger=ERROR, stdout
修改jbpm.hibernate.cfg.xml中的数据库连接信息。如果使用MySql,使用的方言一定要是org.hibernate.dialect.MySQL5InnoDBDialect。
数据库连接编码一定要是UTF-8。否则可能会在部署含有中文字符的流程定义时会抛异常,说sql语法错误。
连接数据库的时候,建议使用
jdbc:mysql://localhost:3306/itcastjbpm?useUnicode=true&characterEncoding=utf8可防止存储到数据库的值是乱码
注意:如使用MySQLDialect,就会在流程实例结束时抛异常:com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException:Cannot delete or update a parent row: a foreign key constraint fails(`jbpm44_20101028/jbpm4_execution`, CONSTRAINT `FK_EXEC_INSTANCE` FOREIGN KEY(`INSTANCE_`) REFERENCES `jbpm4_execution` (`DBID_`))。。
初始化数据库:
执行sql脚本文件${JBPM4.4_HOME}/install/src/db/create/jbpm.*.create.sql。
使用Hibernate的自动建表,在jbpm.hibernate.cfg.xml中配置:hibernate.hbm2ddl.auto=update。
可以初始化程序创建表,例如:
public void testCreateSchema() { // hbm2ddl.auto=update
new org.hibernate.cfg.Configuration().configure("jbpm.hibernate.cfg.xml").buildSessionFactory();
}
因为Jbmp是底层是基于Hibernate的。
到此环境搭建完成。数据库会生成18张表。
先通过上面安装的gdp软件画一张简单的流程图,安装成功的话,在新建文件中有一个JBoss Jbpm,只需输入名称就行。如下:
保存,通过source可以查看生成的xml文件。这里点击具体的任务在properties视图,选择general,name。输入“申请”。assignment中的type选择assignee。expression输入“张三”。第二个也是一样。选择general,name。输入“经理批阅”,assignment中的type选择assignee。expression输入“李四”。
在创建一个Java类就可以了,具体内容如下:
package cn.itcast.hello; import java.util.List; import org.jbpm.api.Configuration; import org.jbpm.api.ProcessEngine; import org.jbpm.api.ProcessInstance; import org.jbpm.api.task.Task; import org.junit.Test; public class TestClass { //得到流程引擎 ProcessEngine engine = org.jbpm.api.Configuration.getProcessEngine(); /*** * 一。部署流程定义 */ @Test public void deploymentPorcessDefintion(){ String deploymentId = engine.getRepositoryService()//与部署相关对象和流程定义相关Service .createDeployment()//创建部署对象 .addResourceFromClasspath("cn\\itcast\\hello\\helloworld.jpdl.xml")//从类路径下加载资源文件 .addResourceFromClasspath("cn\\itcast\\hello\\helloworld.png") .deploy();//完成部署 System.out.println("部署对象ID:"+deploymentId); } /*** * 二。启动流程实例 */ @Test public void startProcessInstance(){ String key="helloworld"; ProcessInstance pi = engine.getExecutionService()//管理流程实例和执行对象 .startProcessInstanceByKey(key);//按照流程的key启动流程实例,默认会按照最新版本的key启动流程实例 System.out.println("流程实例Id"+pi.getId()); System.out.println("流程定义的ID:"+pi.getProcessDefinitionId()); } /** * 查询我的个人任务列表 */ @Test public void findMyPersonTaskList(){ String userId="张三"; List<Task> listTask= engine.getTaskService()//与任务相关的service .findPersonalTasks(userId); if(listTask!=null&&listTask.size()>0){ for(Task task:listTask){ System.out.println("任务id:"+task.getId()); System.out.println("任务名称:"+task.getName()); System.out.println("任务的办理人:"+task.getAssignee()); } } } /*** * 完成我的个人任务 */ @Test public void complateMytask(){ String taskId = "20001"; engine.getTaskService().//与任务相关的service completeTask(taskId);//使用任务Id,完成任务。 System.out.println("完成任务,任务id是:"+taskId); } }
这个时候查看数据库表,就会有数据。但是通过上面的流程查看,这个任务并没有完成。因为需要经过两个人批阅。所以可以查看jbpm4_task表来查看任务Id。接下来是李四完成任务,在执行完成我的个人任务方法就行。
到此一个简单的入门就OK了。
补充:综合编程 , 其他综合 ,