工作流框架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 总经理[审批]");
	}
}

工作流框架JBPM的基本应用

时间: 2024-10-06 03:28:56

工作流框架JBPM的基本应用的相关文章

Activiti工作流框架学习(一)——环境的搭建和数据表的了解

一.什么是工作流 工作流(Workflow),就是"业务过程的部分或整体在计算机应用环境下的自动化",它主要解决的是"使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现". 工作流管理系统(Workflow Management System,WfMS)是一个软件系统,它完成工作量的定义和管理,并按照在系统中预先定义好的工作流逻辑进行工作流实例的执行.工作流管理系统不是企业的业务系统,而是为企业

Jeecg+fixflow,工作流框架分享

工作流引擎使用fixflow. 动态表达使用jeecg. 不多说直接上源码. 注:本人使用的jdk为6.0.mysql.tomcat6.0 其中fixflow-expand 为eclips流程设计核心 jeecg-framework 为合并后的运行框架 框架中自带一个可运行的项目流程(使用动态模版.带任务分发功能) 验证码为了开发方便已经默认设置为123456 启动任务帐号:zh001 123456 流程步骤中可能涉及的帐号请在组织机构模块中查看 管理员帐号:admin 123456 配置文件修

工作流管理系统 jBPM

工作流管理系统 jBPM 运行环境: 授权方式:BSD 软件大小:M 下载量:589 更新日期:2014-04-04 来源地址: 联系作者:Linux jBpm是一个灵活可扩展的工作流管理系统.作为 jBpm运行时server输入的业务流程使用简单强大的语言表达并打包在流程档案中.jBpm将工作流应用开发的便利性和杰出的企业应用集成(EAI)能力结合了起来.jBpm包括一个Web应用程序和一个日程安排程序.jBpm是一组J2SE组件,可以作为J2EE应用集群部署. 工作流程编辑 1) jBPM的

基于Spring的轻量级工作流框架

先通俗的介绍一下框架 该框架的灵感来自于现实中的公交系统.公交系统的中最重要的几个元素,及其对工作流框架的对应: 乘客:对应工作流框架的中的数据(data) 公交车:数据的载体, 车站:一个车站可以看成工作流中的一个节点,负责处理"公交车"上的"乘客". 线路:由哪些节点组成一个完整的工作流的处理链是不是感觉整个公交系统就是一个庞大的工作流处理网,每时每刻都公交车从车站出发,到达一个车站,上下乘客又开往下一个车站(当然前提是不出事故(exception)). 框架中

项目结合activiti工作流框架使用

项目结合activiti工作流框架使用: 1.项目与工作流框架的结合. 2.状态:草稿(待审批).审批中.审批通过.审批失败 3. 提交审批: 0 草稿(待审批),记录绑定工作流执行id,审批状态设置为1 4.审批中的记录进行审批: 审批通过:工作流任务完成,判断是否最后审批,如果是则更新记录的审批状态. 审批不通过:工作流任务完成,更新记录的审批状态. 原文地址:https://www.cnblogs.com/super-chao/p/8624390.html

jbpm工作流框架与Spring整合的步骤

1. 在jbpm.cfg.xml文件中注销掉自己的,导入需要的配置文件 <!-- 注销掉这个 <import resource="jbpm.tx.hibernate.cfg.xml" /> --> <!-- 添加这个配置文件 --> <import resource="jbpm.tx.spring.cfg.xml" /> 2.在hibernate.cfg.xml文件中导入配置文件 <!-- 这是jbmp的配置文件

工作流技术JBPM开发入门(一)

什么是工作流? 对于工作流的官方解释在这里就不在赘述了,通俗的说呢,工作流就是对于我们业务中的流程管理! 由来: 由于我们接触的大部分OA系统中存在着大量的工作流程,而这些流程夹杂着不同领域的业务,无论是状态还是一些操作等都由我们自己维护,而一旦发生业务流程上的变化,修改源代码变成为家常便饭,整个项目举步维艰,况且需求的变更又是无处不在,业务流程的变化更是不可避免. 那么说了这么多,工作流到底帮我们做了什么呢? 工作流的实现原理: 对于工作流,其实它并不是什么高大上的技术,它的实现原理很简单,其

工作流 之JBPM简介

自从做ITOO以来确实是感觉自己知道的东西越来越多了可是真正的系统性的学习一系列东西却是越来越少了,在项目中一直要求的工作流,虽然工作流的氛围里熏陶的越来越觉得工作流是一个好东西,直到前些日子根据视频了解了工作流的一些知识才觉得工作流离我越来越近了. 一.WorkFlow 工作流(Workflow),就是"业务过程的部分或整体在计算机应用环境下的自动化",它主要解决的是"使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现某个预期的业务目标,或者

Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作

可以在项目中加入log4j,将logj4.properties文件拷入到src目录下,这样框架执行的sql就可以输出到到控制台,log4j提供的日志级别有以下几种: Fatal  error  warn  info  debug  trace 一.部署流程定义 1,在工程项目下创建源码文件夹process 2,在该文件下下面新创建一个工作流流程定义文件test1.bpmn(NewàActivit Diagram) 3,在test1.bpmn文件定义请假流程或者是报销流程 4,测试代码 [java