工作流框架JBPM的基本应用

工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。

工作流管理系统(WfMS,Workflow Management System)的主要功能是通过计算机技术的支持去定义、执行和管理工作流,协调工作流执行过程中工作之间以及群体成员之间的信息交互。工作流需要依靠工作流管理系统来实现。工作流管理系统是定义、创建、执行工作流的系统,应能提供以下三个方面的功能支持:
1. 定义工作流:包括具体的活动、规则等
2. 运行控制功能:在运行环境中管理工作流过程,对工作流过程中的活动进行调度
3. 运行交互功能:指在工作流运行中,WfMS与用户(活动的参与者)及外部应用程序工具交互的功能。

一、管理流程

部署(添加)
删除
查询(查询所有、自定义条件查询)
获取部署添加的文件信息(查看流程图)
* 没有更新操作!策略为:重新部署 + 版本递增。

二、执行流程
启动流程实例
查询我的任务列表
办理任务
直接向后执行一步

===========================================
部署对象 Deployment
表示一次部署的多个文件的信息。
对应的表:
jbpm4_deployment
jbpm4_lob

流程定义 ProcessDefinition
表示一个工作流程,包含每个环节的详细信息。
这是解析.jpdl.xml文件得到的数据。
此类没有对应的表,他对应的是.jpdl.xml文件。

执行对象 Execution
表示一个执行的路径(分支)。最大的分支就是从Start到End的那个。
最大的分支称为Root Execution 也称为 ProcessInstance。
对应的表:
jbpm4_execution 正在执行的信息表
jbpm4_hist_procinst 已经执行完的历史信息表

流程实例 ProcessInstance
表示按某流程定义执行的所有执行时的信息。
ProcessInstance就是Execution对象(的子类型)

任务 Task
在执行流程的过程中,在Task环节生成的任务信息。
对应的表:
jbpm4_task 正在执行的信息表

jbpm4_hist_task已经执行完的历史信息表


示例代码:

/**
 * 管理流程定义有关的操作
 * 	部署(添加)
 * 	删除
 * 	查询(查询所有、自定义条件查询)
 * 	获取部署添加的文件信息(查看流程图)
 *  !!没有更新操作!策略为:重新部署 + 版本递增。
 * 
 */
public class ProcessDefinitionTest {
        // 返回单例的ProcessEngine实例,使用的是默认的配置文件(jbpm.cfg.xml)
	private ProcessEngine processEngine = Configuration.getProcessEngine();

	// 部署(添加)
	@Test
	public void testDeploy() throws Exception {
		String deploymentId = processEngine.getRepositoryService()//
				.createDeployment()// 创建一个部署对象
				.addResourceFromClasspath("helloworld/helloworld.jpdl.xml")// 添加一个要部署的文件
				.addResourceFromClasspath("helloworld/helloworld.png")// 添加一个要部署的文件
				.deploy(); // 执行部署操作
		System.out.println("部署成功:deploymentId = " + deploymentId);
	}

	// 部署(把多个文件打包为一个zip一起部署)
	@Test
	public void testDeploy_zip() throws Exception {
		// 准备
		ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream("d:/helloworld.zip"));
		
		// 部署
		String deploymentId = processEngine.getRepositoryService()//
				.createDeployment()// 创建一个部署对象
				.addResourcesFromZipInputStream(zipInputStream)// 指定zip流
				.deploy(); // 执行部署操作
		System.out.println("部署成功:deploymentId = " + deploymentId);
	}

	
	// 删除
	@Test
	public void testDelete() throws Exception {
		// // 删除指定的部署对象,如果有关联的信息,就报错
		// processEngine.getRepositoryService().deleteDeployment(deploymentId);
		// // 删除指定的部署对象,如果有关联的信息,就一并删除
		// processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId);

		String deploymentId = "40001";
		processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId);
	}

	// 查询流程定义(查询所有、自定义条件查询)
	@Test
	public void testFindAllProcessDefinition() throws Exception {
		// 查询
		List<ProcessDefinition> list = processEngine.getRepositoryService()//
				.createProcessDefinitionQuery()//
				// 过滤条件
				// .processDefinitionId(processDefinitionId);
				// .deploymentId(deploymentId)
				// .processDefinitionKey(key)
				// .processDefinitionName(name)
				// 排序条件
				// .orderAsc(property)
				// .orderDesc(property)
				// .orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION)//
				// 执行查询得到结果
				// .page(firstResult, maxResults)
				// .list()
				// .count()
				// .uniqueResult()
				.list();

		// 显示
		for (ProcessDefinition pd : list) {
			System.out.println("id=" + pd.getId()// 格式为:{key}-{version}
					+ ", name=" + pd.getName()// .jpdl.xml中根元素的name属性的值。
					+ ", key=" + pd.getKey()// .jpdl.xml中根元素的key属性的值。如果不写,默认为name属性的值。
					+ ", version=" + pd.getVersion()// .jpdl.xml中根元素的version属性的值。如果不写,默认的效果为同名称的第一个version为1,以后的就递增。(一般不要写)
					+ ", deploymentId=" + pd.getDeploymentId()); // 所属的部署对象的id
		}
	}

	// 获取部署时添加的文件信息(查看流程图)
	@Test
	public void testGetProcessImage() throws Exception {
		String deploymentId = "50001";
		String resourceName = "helloworld/helloworld.png";

		// 获取指定的部署对象中的所有的文件名称
		Set<String> nameSet = processEngine.getRepositoryService().getResourceNames(deploymentId);
		System.out.println("所有的文件:");
		for (String name : nameSet) {
			System.out.println("\t" + name);
		}

		// 获取指定的部署对象中的指定名称的文件内容
		InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, resourceName);

		// 存到d:/中
		FileOutputStream out = new FileOutputStream("d:/process.png");
		byte[] buf = new byte[1024];
		for (int len = -1; (len = in.read(buf)) != -1;) {
			out.write(buf, 0, len);
		}
		in.close();
		out.close();
	}
}

/**
 * 执行流程实例有关的操作
 * 	启动流程实例
 * 	查询我的任务列表
 * 	办理任务
 * 	直接向后执行一步
 */
public class ProcessInstanceTest {

	private ProcessEngine processEngine = Configuration.getProcessEngine();

	// 启动流程实例
	@Test
	public void testStartProcessInstance() throws Exception {
		// 使用指定的流程定义启动流程实例(指定名称并且是指定的version)
		// processEngine.getExecutionService().startProcessInstanceById("helloworld-3");

		// 使用指定key的最新版本的流程定义启动一个流程实例
		ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("helloworld");
		System.out.println("流程实例启动成功,processInstanceId=" + pi.getId() + ", processDefinitionId=" + pi.getProcessDefinitionId());
	}

	// 查询我的(未完成的)任务列表
	@Test
	public void testFindMyTaskList() throws Exception {
		// 准备
		// String userId = "员工";
		// String userId = "部门经理";
		String userId = "总经理";

		// // 查询所有
		// List<Task> list = processEngine.getTaskService().findPersonalTasks(userId);

		// 分页的查询
		List<Task> list = processEngine.getTaskService()//
				.createTaskQuery()//
				// 过滤条件
				.assignee(userId)// 指定办理人是谁,如果不指定办理人,就会查出所有人的任务
				// 排序条件
				// .orderAsc(TaskQuery.PROPERTY_CREATEDATE)
				// 执行查询得到结果
				// .count();
				// .page(firstResult, maxResults)
				.list();

		// 显示
		for (Task t : list) {
			System.out.println("id=" + t.getId()//
					+ ", name=" + t.getName()// 任务名称
					+ ", assignee=" + t.getAssignee()// 办理人
					+ ", createTime=" + t.getCreateTime()// 此任务的创建时间
					+ ", executionId=" + t.getExecutionId()); // 所属的执行对象的id
		}
	}

	// 办理任务
	@Test
	public void testCompleteTask() throws Exception {
		String taskId = "140001";
		processEngine.getTaskService().completeTask(taskId);
	}

	// 直接向后执行一步
	@Test
	public void testSignal() throws Exception {
		String executionId = "helloworld.110001";
		processEngine.getExecutionService().signalExecutionById(executionId, "to 总经理[审批]");
	}
}


宏天BPM X3软件平台是一个易于部署和使用的新一代业务流程管理平台,能够以最快的速度帮助您梳理、设计、执行、监控分析和优化业务流程,从业务和IT相结合的完美视角为用户组建长期而久远的卓越BPM流程管 理架构。通过实施BPM方案让您的企业在运营效率、透明度、控制力和敏捷性方面迅速受益。 BPMX3是基于J2EE开源、轻量级的企业业务开发平台,基于代码重用、组件重用、业务逻辑重用、组装重用,结合快速开发平台中的工具,将开发人员从重复的代码编写中解放出来,把更多的精力集中解决客户的业务逻辑处理上。 BPMX3是支持流程管理、监控、优化、再造的全套IT管理开发平台,并且集单点登录、企业单位门户、业务流程管理、开发、整合、业务分析及重构等多重职能于一身的软件开发工具和企业IT架构平台。 BPMX3是企业管理业务的创新关键,可以帮忙用户更科学、更有效管理企业业务的各个环节,企业通过BPMX3可以明显实现业务的高效运营。同时,由于其架构的开放性,采用业界开放性的技术及流程标准,使其能够成为企业SOA架构的流程基础平台及开发平台,越来越多的企业更偏向采用开源的平台来解决其内部的信息化平台的要求,BPMX3却允许更多的平台系统接入及自身扩展更多的功能,以满足更多的企业不同的个性化的需求,以达到最大满足最终的客户使用要求。 【图一】工作流引擎中心 1.BPMX3的特点 1.是一个开放式、轻量级的开发平台 2.BPMX3多层系统架构 3.基于模板代码生成 4.丰富的报表展示 5.跨数据库的数据访问支持 6.简易的前端使用 7.参照最新的BPMN2标准设计 8.满足中国特色流程需求 9.在线的可视化流程设计、可视化的流程监控 10.完全独立的流程引擎服务,可与其他系统无缝集成 11.基于流行的JAVA 流程引擎Activiti 5.8扩展 12.灵活的在线流程定义 13.灵活的嵌入式部署、独立部署 14.灵活的在线表单定义及版本管理(支持按内表及外部表及视图生成表单) 15.灵活的第三方表单集成 16.开放式的流程体系 17.灵活的组织结构支持 18.流程的导入与导出 19.子流程支持 20.流程任务逐步回退处理(任务追回及多驳回 ) 21.流程自由跳转 22.流程跳转业务规则设置 23.多级分发任务与任务汇总 24.会签(并行与串行)、补签及投票处理 25.流程版本变更管理 26.流程催办(基于MQ短信及邮件设置) 27.流程任务的工作日设置(用于统计流程任务执行效率) 28.任务监控管理 29.流程委办、转办 2.BPMX3多层架构 系统采用多层的系统架构进行功能开发,有利于代码功能责任分开,同时有利于不同开发人员的分工及合作,也有利于代码的单元测试。系统总体结构如下图所示: 【图二】BPMX3多层架构 •数据访问层Dao: 负责与数据库交互 •业务处理层Service: 负责系统的所有业务逻辑处理 •数据控制层Controller: 负责系统的页面数据准备及跳转处理 •视图层View :负责数据的展示处理 整合的开源技术 1.Spring Core 3.0.4 2.Spring MVC 3.0 3.Spring Security 3.0.5 4.Spring AOP 3.0.4 5.Apache Active MQ 5.5 6.MyBatis 3 7.CKEditor 3.6 8.JQuery 1.8 9.CXF 2.0 10.Alfresco Activiti 5.8 11.Compass + Lucene 12.JasperReport 4.5 13.JavaMail 14.Other: Log4j,Velocity,Sitemesh,Jfreechart,Jforum,Solr 15.Maven 2 3.BPMX3的组件构建方式 BPMX3同时也是基于组件构构建,整个系统的构建如下所示: 【图三】BPMX3组件构建 系统提供在线流程设计器,在线表单设计器,代码生成器,结合BPMX3的基础组件,以实现复杂的流程业务应用。基础组件包括: Spring基础组件库,报表引擎,数据库访问模块,短信模块,后台定时任务调用组件,短信访问组件,搜索引擎组件,JMS消息组件,Activiti工作流组件,Cas统一用户认证组件,Spring安全认证组件。 4.BPMX3总体功能 1.多系统管理 BPMX3支持多个业务系统同时运行及切换处理,根据不同的用户授权允许用户进入不同的系统进行访问,而不同的业务系统的开发可以基于BPMX3平台上开发,也可以由其他开发框架开发再与BPMX3做整合。这种模式非常适合企业把BPMX3作为其内部的首先开发平台,以使后续的新应用系统都整合在一起进行管理及使用。 【图四】多系统管理 2.用户管理 BPMX3提供多种维度的用户人员管理,以支持各种类型的组织机构及人员的统一管理,目前可以支持内部组织、外部组织 、虚拟组织。而且还提供用户的属性自定义,允许对用户进行多种属性的扩展,以支持工作流中的任务节点的人员的复杂查找计算。 3.系统安全管理 系统的安全管理由Spring Security 3提供配置及管理,非常容易与第三方的用户或认证平台进行整合,如与CAS服务器作统一认证,只需要加上新的配置模块即可实现,不影响系统现有的功能模块。大大满足了各种不同系统的安全管理认证的需要。 同时系统可以支持URL访问权限、数据权限、列权限及页面按钮权限的统一配置管理。系统的安全认证机制如下所示: 【图五】系统安全拦截原理 4.动态表单管理 BPMX3提供了基于数据库内部表、外部表、视图等来生成在线的流程表单的功能,其生成是基于模板,模板可由开发人员进行自定义,也可以采用BPMX3提供的默认模板。生成的表单后,系统管理员还可以对表单进行编辑管理以实现企业的业务要求,其中,还允许开发人员在表单上编写编写脚本,以实现更复杂的应用。 表单上支持系统中的大量组件,如角色选择,用户选择,角色选择,在线表单,套红在线Office表单,签章表单等。系统开发人员几乎不用作任何开发,可以设计出任何复杂的表单应用需求。 表单上支持系统中的大量组件,如角色选择,用户选择,角色选择,在线表单,套红在线Office表单,签章表单等。系统开发人员几乎不用作任何开发,可以设计出任何复杂的表单应用需求。 【图六】在线动态表单 5.流程管理 BPMX3提供了基于BPMN2标准的流程管理,包括流程版本变量,流程节点表单设置,表单的权限设置,流程任务通知,催办,代办,转化,并行会签、串行会签、补签,子流程,同步任务,多实例任务,人工任务、消息任务、邮件任务等,任务多级分发与汇总、任务追回、任务层层驳回,任务自由跳转等中国特色的流程需求。能满足企业复杂的流程应用需求。 BPMX3在流程管理上,不但能结合在线设计的复杂表单,还能结合本系统或其他系统其他模块的功能表单一起进行业务审批的工作。这大大方便了业务流程在所有的系统中进行流程开发的工作,简化了以往开发流程业务的代码固死的做法,把程序员或业务员真正从流程业务中解放出来。 【图七】在线流程管理 【图八】在线流程设计 6.报表管理 系统的报表管理是基于模板来进行设置管理的,目前支持FineReport及Jasper Report两种报表引擎,前者是商业报表,其功能非常强大,可以实现多样式数据呈现方式,支持HTML、PDF、EXCEL、Word、TXT、Flash样式呈,能完美解决中国式报表难题,无论数据库内原始数据是以何种样式的表结构存储,无论最终用户要求数据以何种表格样式显示,FineReport报表软件独创的多数据源关联查询、公式动态扩展计算等强大的功能,在无需改变表结构,无需改变用户的要求的基础上,完全按照用户的需求制作出报表模板。 【图九】报表管理 7.系统基础组件 系统的基础组件如用户模块一样,是系统的业务功能的基础,在其他业务模块中被大量使用。 ◦定时任务管理 通过配置以实现某时刻重复执行的系统任务,如配置每月最后一天进行库存清算任务,并且启动库存清算审批流程。 ◦系统日志管理 记录进入系统中的每个用户访问的每个功能 ◦数据源管理 可以设置多种数据源,为在线表单设计及展示提供数据来源 ◦资源管理 管理系统的所有资源,包括URL,业务方法等,提供给安全管理进行极限配置 ◦流水号管理 用于产生业务的一些处理流水单号 ◦数据字典管理 用于管理所有的业务中常用的数据字典的数据 ◦附件管理 管理系统中所有的上传附件。 ◦桌面管理 管理用户的桌面布局及常用的功能展示 ◦邮件、短信模板管理 用于配置系统的发送邮件、短信的模板 ◦工作日历管理 用于配置系统的工作流的待办事项的处理工作时间的计算处理 ◦动态脚本管理 用于为流程任务节点或事件中可被调用的逻辑计算代码 ◦短信收发管理 基于USB短信猫的短信模块或短信网关,以实现收发手机短信功能。 ◦外部邮件管理 支持POP3,IMap协议的邮件服务收发功能,允许用户设置多个外部邮箱。 ◦内部短消息收发管理 在系统中用户之间可以收发短消息,如工作流任务的通知也采用短消息进行实时提醒。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值