第一章 认识Activiti
1.1什么是Activiti
1.Activiti是什么?
答:Activiti是一个针对企业用户,开发人员,系统管理员的轻量级工作流业务管理平台。
2.Activiti的核心是什么?
答:使用JAVA开发 的快速,稳定的BPMN2.0流程 引擎。
Activiti可以允运行在任何类型的JAVA程序中,例如服务器,集群,云服务。
Activiti可以完美滴与Spring集成。同时,基于思想的设计使Activiti非常轻量级。
1.2工作流基础
1.2.1什么是BPM(业务流程管理)IT工具。
企业流程管理:生产流程层,运作层,计划层,战略,四个层次。
BPM最早是由工作流+企业应用集成逐步融合发展起来的。
现在的BPM是一种企业集成技术,作为对面向 服务系统架构SOA,企业应用集成EAI,企业服务总线ESB的补充。
BPM:管理规范,软件工程
1.2.2工作流的声明周期
生命周期分为 5步,并且迭代循环。
1.定义:总是由流程定义开始。此阶段的任务是收集业务服务需求并转化为流程定义。
业务------>开发
2. 发布:发布流程定义。再具体的流程引擎汇总包括定义文件,自定义表单,任务监听类。
3.执行:流程引擎(Activiti)按流程处理线路以任务驱动方式执行。
4.监控:此阶段是依赖阶段。收集每个任务的结构并作出处理。
5.优化:此阶段,一个完整的流程已经结束。需要做的是优化与设计,再次流程上改进,并开始下一个新的周期。
1.2.3什么是BPMN(业务流程建模标注)
定义了业务流程图。
1.3Activiti的特点
1.数据持久化:使用MyBatis(最优SQL执行Command),保持最高性能。
2.引擎Server接口:7大接口,通过ProcessEngine获取,并且支持API编程风格。七大接口的作用。
3.流程设计器
有专业的流程设计器:BPMN2.0-------Eclipse Designer,还有基于Web的Activiti Modeler流程设计器。
4.原生支持Spring:轻松的与Spring集成。非常方便管理事务和解析表达式。
5.分离运行时与历史数据
1.4Activiti的应用
1.在系统继承方面应用
1与ESB(企业服务总线)整合,例如Mule.
2.与规则引擎整合
3.嵌入已有平台
2.在其他产品中应用
1.5Activiti架构与组件
知识点就先这些 ,我们来看一下我们的示例:HelloWorld
首先我们用的软件是Eclipse,事先的准备工作挺多的,你需要安装
这个插件,安装好了之后我们就开始吧,
首先建一个Maven的项目,然后在pom.xml中导入我们需要的节点
<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>cn.happy</groupId>
<artifactId>ActivitiTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>BPMN 2.0 with Activiti - Examples</name>
<properties>
<activiti-version>5.14</activiti-version>
</properties>
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>${activiti-version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>${activiti-version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.3.168</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
<exclusion>
<artifactId>jms</artifactId>
<groupId>javax.jms</groupId>
</exclusion>
<exclusion>
<artifactId>mail</artifactId>
<groupId>javax.mail</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.43</version>
</dependency>
</dependencies>
</project>
现在我们看一下架构
首先我们建项目的时候我们可能会少文件夹,这个我们自己加就好。
我们的配置文件必须写在resource下面。
现在我们先看一下配置文件,activiti.cfg.xml
这个主要是连接数据库的。
<?xml version="1.0" encoding="UTF-8"?>
<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"/>
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUsername" value="root"/>
<property name="jdbcPassword" value=""/>
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>
然后我们需要画一个流程图
然后我们会生成一个图片 .png结尾的 ,并且我们要把这个图生成
bpmn结尾的代码。图片右击-->Open With----->XML Editor就可以了,
然后我们开始写具体的代码,看我的注释。
package Demo;
import java.util.List;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
public class HelloWorld {
public static void main(String[] args) {
/* ProcessEngineConfiguration processEngine=ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
processEngine.setJdbcDriver("com.mysql.jdbc.Driver");
processEngine.setJdbcUrl("jdbc:mysql://localhost:3306/activiti");
processEngine.setJdbcUsername("root");
processEngine.setJdbcPassword("");
processEngine.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
ProcessEngine buildPRocessEngine=processEngine.buildProcessEngine();*/
ProcessEngine processEngines=ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml")
.buildProcessEngine();
System.out.println("================"+processEngines);
/** 部署流程定义*/
ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
/* Deployment deployment= processEngine.getRepositoryService()//与流程定义与部署对象相关的service
.createDeployment()
.name("HelloWorld入门程序")//创建一个部署对象
.addClasspathResource("ActivitiHelloWorld.bpmn")//从classpath资源中加载,一次只能加载一个文件
.addClasspathResource("ActivitiHelloWorld.png")
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());
System.out.println("部署名字:"+deployment.getName());*/
/**启动流程实例*/
/* String processDefinitionKey="ActivitiHelloWorld";
ProcessInstance pi=processEngines.getRuntimeService()//与正在 执行流程实例和执行对象相关的service
.startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动流程实例
System.out.println("流程实例ID:"+pi.getId());
System.out.println("流程定义ID:"+pi.getProcessDefinitionId());*/
/**查询当前人的个人任务*/
/*String assigine="张三";
List<Task> list=processEngine.getTaskService()
.createTaskQuery()
.taskAssignee(assigine)
.list();
if(list!=null&&list.size()>0){
for(Task task:list){
System.out.println("任务ID:"+task.getId());
System.out.println("任务名称:"+task.getName());
System.out.println("任务的创建时间:"+task.getCreateTime());
System.out.println("任务的创建人:"+task.getAssignee());
System.out.println("流程实例ID"+task.getParentTaskId());
System.out.println("执行对象ID"+task.getExecutionId());
System.out.println("流程定义ID"+task.getProcessDefinitionId());
}
}
*/
/**完成我的任务*/
String taskId="302";
processEngine.getTaskService()
.complete(taskId);
System.out.println("完成任务:任务ID:"+taskId);
}
}
记着这个是一步一步执行的 ,不可以一起执行,先部署流程定义,在启动流成,查询任务,完成任务。然后你就可以查看你的数据库了,会有数据显示你执行的每一步。