工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。
工作流管理系统(WfMS,Workflow Management System)的主要功能是通过计算机技术的支持去定义、执行和管理工作流,协调工作流执行过程中工作之间以及群体成员之间的信息交互。工作流需要依靠工作流管理系统来实现。工作流管理系统是定义、创建、执行工作流的系统,应能提供以下三个方面的功能支持:
1. 定义工作流:包括具体的活动、规则等
2. 运行控制功能:在运行环境中管理工作流过程,对工作流过程中的活动进行调度
3. 运行交互功能:指在工作流运行中,WfMS与用户(活动的参与者)及外部应用程序工具交互的功能。
采用工作流管理系统的优点
1. 提高系统的柔性,适应业务流程的变化
2. 实现更好的业务过程控制,提高顾客服务质量
3. 降低系统开发和维护成本
工作流框架有:Jbpm、OSWorkflow、ActiveBPEL、YAWL等
OA(办公自动化)主要技术之一就是工作流。
引入办公系统中存在很多流程,他们具备以下共同点:
1,存储数据
2,有状态
流程一:2个环节 --变化--> 4个环节 --变化--> 8个环节 --> 6个环节
流程二:3个环节
流程n :m个环节
流程开发中存在一些问题:
流程比较多,管理比较混乱
流程环节可能会变化
目标:
不改程序
即程序中支持用户定制流程与申请模板(用户)
要有方便好用用户界面。
方案:
通过上传下载实现定制模板。
用画图的方式定制流程。
实现:
?画图程序怎么做(Swing/AWT+Applet,Flex)
?制定一个什么样的流程规则
?按规则解析与执行流程
===> 工作流框架 / 工作流管理系统
需要用户定流程的情况(流程多、变化)
jBPM 即java Business Process Management,是基于java的业务流程管理系统。jBPM是市面上相当流行的一款开源工作流引擎,引擎底层基于Active Diagram模型。jBPM4.4使用了hibernate(3.3.1版),因此可以很好的支持主流数据库。jBPM4.4共有18张表。
jBPM官方主页:http://www.jboss.org/jbpm
jBPM requires a JDK (standard java) version5 or higher. http://java.sun.com/javase/downloads/index.jsp
To execute the ant scripts, you'll needapache ant version 1.7.0 or higher: http://ant.apache.org/bindownload.cgi
1, jBPM下载地址:http://sourceforge.net/projects/jbpm/files/
2, Eclipse下载地址( Eclipse IDE for Java EE Developers (163 MB),Version:3.5 ):http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/galileo
GPD(Graphical Process Designer)是一个Eclipse插件。
安装方法说明(jBPM4.4UserGuide, 2.11.2. Install the GPD plugin into eclipse):
Help --> Install New Software...
Click Add...
In dialog Add Site dialog, click Archive...
Navigate to install/src/gpd/jbpm-gpd-site.zip and click 'Open'
Clicking OK in the Add Site dialog will bring you back to the dialog 'Install'
Select the jPDL 4 GPD Update Site that has appeared
Click Next... and then Finish
Approve the license
Restart eclipse when that is asked
查看是否成功安装了插件:WindowàPreference中是否有Jboss jBPM项。
流程定义文件的xsd文件的路径为:JBPM_HOME/src/jpdl-4.4.xsd。
添加到Eclipse中的方法为(jBPM4.4User Guide, 2.11.5. Adding jPDL 4 schema tothe catalog):
Click Window --> Preferences
Select XML --> XML Catalog
Click 'Add...'
The 'Add XML Catalog Entry' dialog opens
Click the button with the map-icon next to location and select 'FileSystem...'
In the dialog that opens, select file jpdl-4.4.xsd in the src directoryof the jBPM installation root.
Click 'Open' and close all the dialogs
/**
* 保存为流程定义文档(.zip),其中至少有两个文件:processdefinition.jpdl.xml、processimage.png
ZipOutputStream的使用
* @param path
*/
public voidsaveProcessArchive(ExecutionContext ec, String path) {
ZipOutputStream zipOut =null;
try {
zipOut = new ZipOutputStream(newFileOutputStream(path));
// 1,保存流程定义文件: process.jpdl.xml
zipOut.putNextEntry(newZipEntry("process.jpdl.xml"));
zipOut.write(getProcessDefinitionXml(ec).getBytes("utf-8"));
// 2,保存流程图片: processimage.png
zipOut.putNextEntry(newZipEntry("process.png"));
zipOut.write(getProcessImageData(ec));
} catch (Exception ex) {
throw newRuntimeException(ex);
} finally {
if (zipOut != null) {
try {
zipOut.close();
} catch (IOExceptionex) {
throw newRuntimeException(ex);
}
}
}
}
JBPM的结构和原理
管理流程(流程定义)
部署(添加)
查询
删除
查看流程图(xxx.png)
-- 修改 --》没有真正的修改,而是使用“再次部署+使用最新版本启动流程实例”的方式代替。这是因为流程实例是依赖你的流程定义的环节的,要保存历史记录。
执行流程
启动流程实例
查询任务列表
办理任务
向后执行一步
1. ${JBPM_HOME}/jbpm.jar(核心包)
2. JBPM_HOME/lib/*.jar,不添加以下jar包:servlet-api.jar, junit.jar。其中junit.jar一定不要添加,因为是3.8.2版本,与我们使用的junit4有冲突。
3. 所使用的数据库对应的驱动的jar包(第2步所添加的jar包中已包含mysql的jdbc驱动jar包)。
1. 配置文件可以从JBPM_HOME/examples/src/中拷贝:
jbpm.cfg.xml、
logging.properties、//要注意版本的问题,接口和实现类要相同版本
jbpm.hibernate.cfg.xml。
2. 修改logging.properties中的日志输出级别[t1] 为WARNING:java.util.logging.ConsoleHandler.level=WARNING
3. 修改jbpm.hibernate.cfg.xml中的数据库连接信息。如果使用MySQL,使用的方言一定要是org.hibernate.dialect.MySQL5InnoDBDialect[t2] 。
4. 数据库连接编码一定要是UTF-8。否则可能会在部署含有中文字符的流程定义时会抛异常,说sql语法错误。
说明:如果要改变jbpm.hibernate.cfg.xml的文件名称,需要做:
1、从JBPM_HOME/src/中拷贝jbpm.tx.hibernate.cfg.xml放到工程的src/下,然后进行修改。
2、修改jbpm.tx.hibernate.cfg.xml中的hibernate主配置文件的路径配置(指定的是相对于classpath的相对路径)。
1, 方法一:执行sql脚本文件${JBPM4.4_HOME}/install/src/db/create/jbpm.*.create.sql
2, 方法二:使用Hibernate的自动建表,在jbpm.hibernate.cfg.xml中配置:hibernate.hbm2ddl.auto=update。
注意流程设计器的图片生成法和zip生成文件
搞清楚hellowoeld程序,就是在下面这个程序的基础上添加一层web页面,搞明白他
Helloworld
public class HelloWorld_API {
// 建表
@Test
public void createSchema() throwsException { // hbm2ddl.auto=update
neworg.hibernate.cfg.Configuration()//
.configure("jbpm.hibernate.cfg.xml")//
.buildSessionFactory();
}
private static ProcessEngineprocessEngine = new Configuration()//
.setResource("jbpm.cfg.xml")//
.buildProcessEngine();
// 1,部署流程定义
@Test
public voiddeployProcessDefintion() throws Exception {
processEngine.getRepositoryService()//
.createDeployment()//
.addResourceFromClasspath("helloworld/helloworld.jpdl.xml")//
.addResourceFromClasspath("helloworld/helloworld.png")//
.deploy();
}
// 2,启动流程实例
@Test
public void startProcessInstance()throws Exception {
processEngine.getExecutionService().startProcessInstanceByKey(
"helloworld");
}
// 3,查询我的个人任务列表
@Test
public voidfindMyPersonalTaskList() throws Exception {
// String userId = "员工";
// String userId = "部门经理";
String userId = "总经理";
// 查询
List<Task> taskList =processEngine.getTaskService().findPersonalTasks( userId);
// 显示
System.out.println("=============【" + userId + "】的个人任务列表 ============");
for (Task task : taskList) {
System.out.println("id="+ task.getId()//
+ ",name=" + task.getName()// 任务名称
+ ",assignee=" + task.getAssignee()); // 办理人
}
}
// 4,办理任务
@Test
public void completeTask() throwsException {
String taskId ="30001";
processEngine.getTaskService().completeTask(taskId);
}
}
[t1]在java.util.logging.Level的javadoc中列出了可配置的所有输出级别为(由高到低):
· SEVERE(highest value)
· WARNING
· INFO
· CONFIG
· FINE
· FINER
· FINEST(lowest value)
[t2]如使用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_`))。