activiti应用(一)---环境搭建与基本使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hurricane_li/article/details/81836132

可以从https://github.com/Activiti/Activiti/releases/download/activiti-6.0.0/activiti-6.0.0.zip,这个压缩包中包含了activiti需要依赖的jar(使用maven时,不需要),以及官方提供的demo(将activiti-app.war部署到tomcat,访问${host:port}/activiti-app即可,用户名为admin,密码为test;activiti-admin的用户名admin,密码admin;activiti-rest的用户名密码不知道)。

Activiti的表定义介绍:

activiti相关的表都是以act_为前缀的:
act_re_*:re代表repository。这些表包含了流程的静态信息(流程定义、流程资源等);
act_ru_*:ru代表runtime。这些表是运行时表包含了流程实例、用户任务的运行时数据。这些表中的数据量少并且执行快速;
act_id_*:id代表identity。这些表包含了身份信息,例如用户、组等;
act_hi_*:hi代表history。这些表包含历史数据(历史流程实例、变量、任务等);
act_ge_*:ge代表general。这些表用在变动的场景。

Activiti的Service介绍:

RepositoryService用于管理与操作部署与流程定义;
RuntimeService用于管理启动流程定义的实例,保存与获取流程变量;
TaskService是bpm引擎的核心,用于查询指定给用户与组的任务,创建独立于流程实例的任务,
    指定任务的执行者,拾取与完成任务;
IdentityService十分简单,它管理用户与组的增删改查操作;
FormService是可选的服务,这个服务引入了开始表单和任务表单;
HistoryService提供所有引擎产生历史数据的查询功能;
ManagementService在使用activiti进行自定义的应用编程中通常是不需要的,
    它用来获取数据库的表信息,同时它提供了对于工作(job)的查询和管理功能,
    job在activiti中作用多样,比如定时器、延迟挂起/激活等;
DynamicBpmnService可以在不重新部署的情况下部分改变流程定义。

其他:

流程引擎会扫描activiti.cfg.xml与activiti-context.xml:对于activiti.cfg.xml文件引擎会用传统的activiti的方式构建,
对于activiti-context.xml引擎会以spring的方式(首先构建spring的容器,然后从容器中获取需要的实例)构建。

所有的服务都是无状态的,因此可以在一个集群中多个节点上运行activiti,不需要考虑具体哪个节点执行了请求。

Demo编写:

1.下载eclipse插件:使用eclipse的install new software工具,输入网址:http://activiti.org/designer/update/进行安装。若安装失败,可以参考https://blog.csdn.net/qq_33547950/article/details/54926435

2.引入activiti依赖的jar包,pom如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.hurricane.learn</groupId>
	<artifactId>learn-activiti</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<dependencies>
		<dependency>
			<groupId>org.activiti</groupId>
			<artifactId>activiti-engine</artifactId>
			<version>5.22.0</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.25</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>6.0.6</version>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

activiti.cfg.xml文件为:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
	<!-- 连接数据库的链接若是不指定时间相关的配置,会出现异常 -->
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti?useUnicode=true&amp;characterEncoding=utf8&amp;useJDBCCompliantTimezoneShift=true&amp;useLegacyDatetimeCode=false&amp;serverTimezone=UTC" />
    <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
    <property name="jdbcUsername" value="root" />
    <property name="jdbcPassword" value="root" />

    <property name="databaseSchemaUpdate" value="true" />

    <property name="asyncExecutorActivate" value="false" />

  </bean>

</beans>

绘制的bpmn文件为:

完成一个流程简单的代码为:

package com.hurricane.learn.activiti;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class App {
	private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
	private static ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	public static void main(String[] args) {
		ProcessEngineConfiguration config = ProcessEngineConfiguration.createProcessEngineConfigurationFromResourceDefault();
		ProcessEngine buildProcessEngine = config.buildProcessEngine();
//		deploy("process1.bpmn");
		startProcess("myProcess");
//		findMyTask("张三");
//		finishMyTask("赵四", "7503");
		System.out.println(buildProcessEngine);
	}
	/**
	 * @Title: deploy  
	 * @Description: 使用bpmn文件部署一个流程 
	 * @param bpmnPath
	 */
	private static void deploy(String bpmnPath) {
		RepositoryService repositoryService = processEngine.getRepositoryService();
		repositoryService.createDeployment()
		.addClasspathResource(bpmnPath)
		.deploy();
		LOGGER.info("Number of process definitions: " + repositoryService.createProcessDefinitionQuery().count());
	}
//	部署id-》流程定义id-》流程实例id-》执行id-》活动id
	/**
	 * @Title: startProcess  
	 * @Description: 通过流程定义key启动一个流程实例
	 * @param processKey 流程定义key
	 */
	private static void startProcess(String processKey) {
		Map<String, Object> variables = new HashMap<String, Object>();
		variables.put("employeeName", "Kermit2");
		variables.put("numberOfDays", new Integer(3));
		variables.put("vacationMotivation", "I'm really tired!2");
		RuntimeService runtimeService = processEngine.getRuntimeService();
		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess", variables);
		LOGGER.info("Number of process instances: " + runtimeService.createProcessInstanceQuery().count());
	}

	/**
	 * @Title: findMyTask  
	 * @Description: 通过用户名获取该用户下的任务
	 * @param userName 用户名
	 */
	private static void findMyTask(String userName) {
		TaskService taskService = processEngine.getTaskService();
		List<Task> tasks = taskService.createTaskQuery().taskAssignee(userName).list();
		for (Task task : tasks) {
			LOGGER.info("Task available: " + task.getName());
		}
	}
	/**
	 * @Title: finishMyTask  
	 * @Description: 完成指定用户下的指定任务
	 * @param userName	用户名
	 * @param taskId	任务id
	 */
	private static void finishMyTask(String userName,String taskId){
		Map<String, Object> taskVariables = new HashMap<String, Object>();
		taskVariables.put("buxing", "true");
		TaskService taskService = processEngine.getTaskService();
		taskService.complete(taskId, taskVariables);
	}
	
}

以上(没有具体写出流程图的绘制,以及流程图中各活动的参数设置)

参考网址:https://www.activiti.org/userguide/

其他资源:刘洋的activiti5.4的视频教程

猜你喜欢

转载自blog.csdn.net/hurricane_li/article/details/81836132