activiti的简单入门(1)!!!

本文深入探讨Activiti工作流框架,涵盖概念、历史、环境搭建及使用方法。Activiti作为开源BPM平台,由Alfresco软件在2010年推出,旨在简化企业流程管理。文章详细介绍了Activiti的安装配置、核心组件如ProcessEngine、RepositoryService、runtimeService等的使用,以及如何通过API启动、查询和完成流程实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:工作流的概念

工作流(Workflow),是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在“多个参与者”之间按照某种“预定义的规则”传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。通俗的说,就是多个人在一起合作完成某件事情的步骤,把步骤变成计算机能理解的形式就是工作流。
Activiti是工作流框架,是解决企业流程管理的解决方案。

二:Activiti介绍

Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架
1、Activiti基于Apache许可的开源BPM平台
2、Activiti和业界也用的多的JBPM历史渊源。
创始人Tom Baeyens是JBoss jBPM4的项目架构师,后来去Alfresco做了继承和发展了Activiti.而Jboss公司抛弃了JBPM4的设计思想,重新设计开发了JBPM5.所以原来习惯于JBPM4的大部分用户都使用Activiti
3、它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务流程图。 并且提供了Demo,可以从里面抽取流程在线设计器。比较强大。

三:准备环境

1.安装流程设计器(eclipse插件)
2.导包(activiti-所需要的环境jar包)
3.初始化数据库三种方式
3.1编码方式

/**
	 * 创建ProcessEngine引擎对象:
	 *     就会自动创建数据和25张表
	 */
	@Test
	public void createProcessEngine1() {
		// 是一个接口:我们需要去连接数据库,肯定需要很多连接信息,就是配置信息,所以先做配置对象,再通过配置对象构建引擎
		// ProcessEngine
		//①:创建引擎的配置对象
		ProcessEngineConfiguration configuration=ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
		
		//②:做引擎配置对象的配置
		configuration.setJdbcUrl("jdbc:mysql:///activiti?createDatabaseIfNotExist=true");
		configuration.setJdbcDriver("com.mysql.jdbc.Driver");
		configuration.setJdbcUsername("root");
		configuration.setJdbcPassword("root");
		
		//设置创建数据库表的策略:true:创建
		configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
		
		//③:通过引擎配置对象构建引擎
		ProcessEngine pe = configuration.buildProcessEngine();
		// org.activiti.engine.impl.ProcessEngineImpl@3c947bc5
		System.out.println(pe);
	}
	3.2 配置方式
配置文件:
<!-- 创建ProcessEngineConfiguration对象的bean -->
	<bean id="processEngineConfiguration"
		class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">

		<!-- 配置对象的配置信息 :连接数据库,使用MyBatis连接池 -->
		<property name="jdbcUrl"
			value="jdbc:mysql:///activiti?createDatabaseIfNotExist=true" />
		<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
		<property name="jdbcUsername" value="root" />
		<property name="jdbcPassword" value="root" />
		
		<property name="databaseSchemaUpdate" value="true" />
	</bean>
	 Java代码如下:
/**
	 * 通过加载配置文件activiti.cfg.xml来创建
	 * @throws Exception
	 */
	@Test
	public void  createProcessEngine2() throws Exception {
		//①:通过引擎配置对象创建一个配置对象:加载classpath下的配置文件:activiti.cfg.xml
		ProcessEngineConfiguration configuration = ProcessEngineConfiguration
				.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
		//②:通过引擎配置对象创建引擎
		ProcessEngine pe = configuration.buildProcessEngine();
		// org.activiti.engine.impl.ProcessEngineImpl@3c947bc5
		System.out.println(pe);
	}

	3.3 最佳实践
/**
	 * 配置文件都是按照一定规则来的:activiti.cfg.xml有统一的命名规范,,放在resource下
	 * 使用框架提供的默认方法创建
	 * @throws Exception
	 */
	@Test
	public void  createProcessEngine3() throws Exception {
		ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
		System.out.println(processEngine);
	}

四:Activiti的使用

repositoryService 管理流程规则相关,流程定义

1 发布流程
// 获取流程发布对象
DeploymentBuilder createDeployment = repositoryService.createDeployment();
2 查询部署列表和流程定义的列表
3 删除-真删除和假删除(挂起和激活)
4 查看流程图

// 添加发布部署
	@Test
	public void test1() throws Exception {
		// 获取核心对象 
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		// RepositoryService 
		RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
		// 获取流程发布对象
		DeploymentBuilder createDeployment = repositoryService.createDeployment();
		// 上传资源
		createDeployment.addClasspathResource("MyProcess.bpmn");
		createDeployment.addClasspathResource("MyProcess.png");
		createDeployment.name("xxx");
		// 部署发布
		Deployment deploy = createDeployment.deploy();
	}
	// 删除部署(真删)
	@Test
	public void test2() throws Exception {
		// 获取核心对象
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		// RepositoryService
		RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
		repositoryService.deleteDeployment("2501");
	}
	// 假删除部署 (挂起和激活)
	@Test
	public void test3() throws Exception {
		// 获取核心对象
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		// RepositoryService 
		RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
		// 挂起
		//repositoryService.suspendProcessDefinitionByKey("myProcess");
		// 激活
		repositoryService.activateProcessDefinitionByKey("myProcess");
	}
	// 显示流程图片
	@Test
	public void test4() throws Exception {
		// 获取核心对象 
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		// RepositoryService
		RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
		// web项目输出到浏览器的输入流
		// 模拟输出本地硬盘
		// 获取png图片
		String deploymentId="5001";
		String resourceName="MyProcess.png";
		// 获取输入的流对象 读的字节
		InputStream resourceAsStream = repositoryService.getResourceAsStream(deploymentId, resourceName);
		//模拟输出本地硬盘
		IOUtils.copy(resourceAsStream, new FileOutputStream("f:/b.png"));
	}
	// 查询部署列表
	@Test
	public void test5() throws Exception {
		// 获取核心对象
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		// RepositoryService 
		RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
		// 查询对象
		DeploymentQuery createDeploymentQuery = repositoryService.createDeploymentQuery();
		// 设置查询条件
		// createDeploymentQuery.deploymentName(name)
		//createDeploymentQuery.deploymentId(deploymentId)
		//createDeploymentQuery.deploymentNameLike(nameLike)
		//createDeploymentQuery.listPage(firstResult, maxResults)
		//createDeploymentQuery.singleResult();
		List<Deployment> list = createDeploymentQuery.list();
		for (Deployment deployment : list) {
			System.out.println(deployment.getDeploymentTime());
		}
	}
	// 查询流程定义信息列表
	@Test
	public void test6() throws Exception {
		// 获取核心对象
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		// RepositoryService
		RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
	     // 获取查询对象
		 ProcessDefinitionQuery createProcessDefinitionQuery = repositoryService.createProcessDefinitionQuery();
		// 设置查询条件
		 //createProcessDefinitionQuery.listPage(firstResult, maxResults)
		 List<ProcessDefinition> list = createProcessDefinitionQuery.list();
		for (ProcessDefinition pd : list) {
			System.out.println(pd);
		}
	}

##runtimeService、tasksService
1 启动流程
processkey启动
2 查询任务列表
查询某个人的列表
// TaskService 任务
TaskService taskService = defaultProcessEngine.getTaskService();
// 获取查询对象
TaskQuery createTaskQuery = taskService.createTaskQuery();
// 设置条件
list 分页
3 完成任务
私有任务(一个人)
公有任务(多个人)
4 完成私有任务
taskService.complete(taskId);
5 完成公有任务
先认领任务
taskService.claim(taskId, userId);
然后在完成任务
taskService.complete(taskId);
6 查询实例状态是否就结束

// 添加发布部署
	@Test
	public void test1() throws Exception {
		// 获取核心对象
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		// RepositoryService
		RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
		// 获取流程发布对象
		DeploymentBuilder createDeployment = repositoryService.createDeployment();
		// 上传资源
		createDeployment.addClasspathResource("codeProcess.bpmn");
		createDeployment.addClasspathResource("codeProcess.png");
		createDeployment.name("开发任务");
		// 部署发布
		Deployment deploy = createDeployment.deploy();
		System.out.println(deploy);
	}

	// 启动流程实例
	@Test
	public void test2() throws Exception {
		// 获取核心对象
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		// runtimeService
		RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
		// 根据流程的定义key启动
		ProcessInstance startProcessInstanceByKey = runtimeService.startProcessInstanceByKey("myProcess");
		System.out.println(startProcessInstanceByKey);
	}

	// 获取任务列表
	@Test
	public void test3() throws Exception {
		// 获取核心对象
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		// TaskService
		TaskService taskService = defaultProcessEngine.getTaskService();
		// 获取查询对象
		TaskQuery createTaskQuery = taskService.createTaskQuery();
		List<Task> list = createTaskQuery.list();
		for (Task task : list) {
			System.out.println(task);
		}
	}

	// 获取某个人的任务列表
	@Test
	public void test4() throws Exception {
		// 获取核心对象
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		// TaskService
		TaskService taskService = defaultProcessEngine.getTaskService();
		// 获取查询对象
		TaskQuery createTaskQuery = taskService.createTaskQuery();
		// 设置查询条件
		createTaskQuery.taskAssignee("ls");
		List<Task> list = createTaskQuery.list();
		for (Task task : list) {
			System.out.println(task);
		}
	}

	// zs 办理完成任务 私有任务
	@Test
	public void test5() throws Exception {
		// 获取核心对象
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		// TaskService 
		TaskService taskService = defaultProcessEngine.getTaskService();
		// 完成任务
		String taskId = "10004";
		taskService.complete(taskId);

	}
	// ww 办理完成任务
	@Test
	public void test6() throws Exception {
		// 获取核心对象
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		// TaskService 
		TaskService taskService = defaultProcessEngine.getTaskService();
		// 完成任务
		String taskId = "5002";
		taskService.complete(taskId);
		
	}

	// zs 认领公有任务
	@Test
	public void test7() throws Exception {
		// 获取核心对象 
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		// TaskService 
		TaskService taskService = defaultProcessEngine.getTaskService();
		// 完成任务
		String taskId = "2504";
		String userId="zs";
		// 要
		taskService.claim(taskId, userId);
	}

	// ls 办理完成任务 私有任务
	@Test
	public void test8() throws Exception {
		// 获取核心对象
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		// TaskService
		TaskService taskService = defaultProcessEngine.getTaskService();
		// 完成任务
		String taskId = "12502";
		taskService.complete(taskId);

	}

	// 查询流程是否结束
	@Test
	public void test9() throws Exception {
		// 获取核心对象
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		// RuntimeService
		RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
		// 查询对象
		ProcessInstanceQuery createProcessInstanceQuery = runtimeService.createProcessInstanceQuery();
		// 根据id
		ProcessInstance singleResult = createProcessInstanceQuery.processInstanceId("2501").singleResult();
		// 如果singleResult找到说明流程还没有结束
		if (singleResult != null) {
			System.out.println("流程未结束或不存在");
		} else {
			System.out.println("流程结束");
		}

	}

##historyService

// 有多少次执行这个实例流程
	@Test
	public void queryHisprocessdef() {
		// 获取核心对象
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		// 获取历史服务
		HistoryService historyService = defaultProcessEngine.getHistoryService();
		// 获取查询对象
		HistoricProcessInstanceQuery createHistoricProcessInstanceQuery = historyService
				.createHistoricProcessInstanceQuery();
		// 设置查询条件
		createHistoricProcessInstanceQuery.processDefinitionKey("myProcess");
		// 获取列表
		List<HistoricProcessInstance> list = createHistoricProcessInstanceQuery.list();
		System.out.println( list.size());
	}

	// 获取活动节点日志--(查询那些人办理任务)
	@Test
	public void queryAci() {
		// 获取核心对象
		ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
		// 获取历史服务
		HistoryService historyService = defaultProcessEngine.getHistoryService();
		// 获取查询对象
		 HistoricActivityInstanceQuery createHistoricActivityInstanceQuery = historyService
				.createHistoricActivityInstanceQuery();
		// 设置查询条件
		 createHistoricActivityInstanceQuery.processInstanceId("2501");
		// 获取列表
		 List<HistoricActivityInstance> list = createHistoricActivityInstanceQuery.list();
		for (HistoricActivityInstance ac : list) {
			System.out.println("=================");
			System.out.println(ac.getActivityId());
			System.out.println(ac.getActivityName());
			System.out.println(ac.getStartTime());
			System.out.println(ac.getEndTime());
		}
	}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值