activity⼯作流学习(⼀)
⼀、了解⼯作流
1、⼯作流(Workflow),就是“业务过程的部分或整体在计算机应⽤环境下的⾃动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递⽂档、信息或任务的过程⾃动进⾏,从⽽实现某个预期的业务⽬标,或者促使此⽬标的实现。
2、⼯作流管理系统(Workflow Management System, WfMS)是⼀个软件系统,它完成⼯作量的定义和管理,并按照在系统中预先定义好的⼯作流逻辑进⾏⼯作流实例的执⾏。⼯作流管理系统不是企业的业务系统,⽽是为企业的业务系统的运⾏提供了⼀个软件的⽀撑环境。
3、常见的⼯作流框架有Activity、JBPM、OSWorkFlow、WorkFlow。本系列使⽤activiti5.13版本。
4、⼯作流框架底层需要有数据库提供⽀持,activiti5.13版本,有23张表。JBPM4.4框架有18张表。JBPM底层使⽤hibernate操作数据库。Activiti框架底层使⽤的mybatis操作数据库。
⼆、Activiti介绍
Activiti5是由Alfresco软件在2010年5⽉17⽇发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理
springboot 原理解析
、⼯作流、服务协作等领域的⼀个开源的、灵活的、易扩展的可执⾏流程语⾔框架。Activiti基于Apache许可的开源BPM平台,创始⼈Tom Baeyens是JBoss jBPM的项⽬架构师,它特⾊是提供了eclipse插件,开发⼈员可以通过插件直接绘画出业务流程图。
三、下载与⽬录结构
官⽹:/  ,没啥⽤,打开了也没啥东西。直接在GitHub上下载。
GitHub:github/Activiti/Activiti  这⾥下载的时activity-dev
⽬录结构如下:
database :提供了建表语句。
docs:该⽬录包含了三种⽂档:javadocs、userguide、xsd。
1. javadocs:API⽂档,包名按照功能模块划分,ine.*。
2. userguide:⽤户⼿册,包含环境配置、10分钟快速⼊门以及各个功能模块的使⽤教程。
3. xsd:包含BPMN2.0规范的XSD⽂件以及Activiti扩展的⾃定义标签XSD。
libs:开发⽤的jar包和源码包。
wars:提供了两个例⼦程序。
安装activiti流程设计器插件
1、eclipse中安装如下:
1.1、获得插件的安装包
1.2、解压安装包,复制到eclipse中的dropins⽬录中
1.3、重启eclipse,勾选save选项
IDEA 安装Activiti Designer插件---actiBPM
打开IDEA,按ctrl+alt+S,打开Pluging
安装成功后,创建数据库:
初始化表结构
⽅式1、使⽤activiti框架提供的建表语句
在database⽬录下到相应数据库的建表语句,执⾏即可。这⾥我⽤的是mysql(可以⼿动执⾏,也可⽤⼯具)
⼿动执⾏:
⼯具的话就不⽤说了吧
⽅式2、使⽤activiti框架的⾃动建表功能。activiti框架提供了和hibernate类似的⾃动建表功能。
创建⼀个java项⽬,导⼊jar包,不知道导哪些jar包,可以到war⽬录解压⽰例程序。把lib⽬录中的jar包拷过来即可。当然数据库驱动包时必不可少的。
1、不使⽤配置⽂件(不建议)
@Test
public void test1(){
/
/1.创建⼀个流程引擎配置对象
ProcessEngineConfiguration configuration=  ateStandaloneInMemProcessEngineConfiguration();
//设置数据源
configuration.setJdbcDriver("sql.jdbc.Driver");
configuration.setJdbcUrl("jdbc:mysql:///activiti_demo");
configuration.setJdbcUsername("root");
configuration.setJdbcPassword("123456");
//设置⾃动建表
configuration.setDatabaseSchema("true");
//创建⼀个流程引擎对象,在创建流程引擎对象时会⾃动建表
ProcessEngine engine= configuration.buildProcessEngine();
}
2、使⽤配置⽂件
配置⽂件可以到⽰例程序的class⽬录拷贝 l,修改⾥⾯的内容即可。
配置⽂件
<beans xmlns="/schema/beans"
xmlns:context="/schema/context" xmlns:tx="/schema/tx"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd
/schema/context /schema/context/spring-context-2.5.xsd
/schema/tx /schema/tx/spring-tx-3.0.xsd">
<!--配置流程引擎配置对象-->
<bean id="processEngineConfiguration" class="ine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
<property name="jdbcDriver"  value="sql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///activiti_demo"/>
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="123456" />
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</bean>
java代码
//使⽤配置⽂件
@Test
public void test2(){
//1.创建⼀个流程引擎配置对象
String resource="l";
String beanName="processEngineConfiguration";
ProcessEngineConfiguration configuration=  ateProcessEngineConfigurationFromResource(resource,beanName);
//创建⼀个流程引擎对象,在创建流程引擎对象时会⾃动建表
ProcessEngine engine= configuration.buildProcessEngine();
}
3、使⽤配置⽂件(使⽤默认配置),要求配置⽂件名称必须为l或者l,配置的信息必须为
配置⽂件如下:
<beans xmlns="/schema/beans"
xmlns:context="/schema/context" xmlns:tx="/schema/tx"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd
/schema/context /schema/context/spring-context-2.5.xsd
/schema/tx /schema/tx/spring-tx-3.0.xsd">
<!--配置流程引擎配置对象-->
<bean id="processEngineConfiguration" class="ine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
<property name="jdbcDriver"  value="sql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///activiti_demo"/>
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="123456" />
<property name="databaseSchemaUpdate" value="true"/>
</bean>
<!--配置⼯⼚,⽤于创建流程引擎 id必须为processEngine-->
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>
</bean>
java代码
//使⽤默认配置⽂件
@Test
public void test3(){
ProcessEngine engine = DefaultProcessEngine();
}
了解25张表
Activiti的后台是有数据库的⽀持,所有的表都以ACT_开头。第⼆部分是表⽰表的⽤途的两个字母标识。⽤途也和服务的API对应。
1.  ACT_RE_*: 'RE'表⽰repository。这个前缀的表包含了流程定义和流程静态资源(图⽚,规则,等等)。
2.  ACT_RU_*: 'RU'表⽰runtime。这些运⾏时的表,包含流程实例,任务,变量,异步任务等运⾏中的数据。 Activiti只在流程实例执⾏过程中保存这些数据,在流程结
束时就会删除这些记录。这样运⾏时表可以⼀直很⼩速度很快。
3. ACT_ID_*: 'ID'表⽰identity。这些表包含⾝份信息,⽐如⽤户,组等等。
4. ACT_HI_*: 'HI'表⽰history。这些表包含历史数据,⽐如历史流程实例,变量,任务等等。
5. ACT_GE_*: 通⽤数据,⽤于不同场景下。
使⽤框架提供的API完成流程操作
可以在项⽬中加⼊log4j,将框架执⾏的sql输出到控制台,log4j提供的⽇志级别:Fatal error warn info debug trace 部署流程定义
需要先画好流程图
/**
* 部署流程定义(操作数据表:act_re_deployment、act_re_procdef、act_ge_bytearray)
*/
@Test
public void test4() {
// 获得⼀个部署构建器对象,⽤于加载流程定义⽂件(test1.bpmn,test.png)完成流程定义的部署
ProcessEngine processEngine = DefaultProcessEngine();
DeploymentBuilder builder= RepositoryService().createDeployment();
// 加载流程定义⽂件
builder.addClasspathResource("process/test1.bpmn");
builder.addClasspathResource("process/test1.png");
// 部署流程定义
Deployment deployment = builder.deploy();
System.out.Id());
}
查询流程定义列表
@Test
public void test5() {
//流程定义查询对象,⽤于查询act_re_procdef表
ProcessEngine processEngine = DefaultProcessEngine();
ProcessDefinitionQuery query = RepositoryService().createProcessDefinitionQuery();
//添加查询条件
query.processDefinitionKey("bxlc");
//分页查询
query.listPage(0, 10);
List<ProcessDefinition> list = query.list();
for (ProcessDefinition item : list) {
System.out.Id());
}
}
启动流程实例
什么是流程实例?根据⼀个流程定义具体的⼀次执⾏过程就是⼀个流程实例,⼀个流程定义对应多个流程实例(⼀对多关系)
为了演⽰:在流程图中指定办理⼈是谁,现在是写死的,表⽰只能张三能提交请假申请。后⾯会讲解如何动态指定。
//根据流程定义的Id启动⼀个流程实例(操作ACT_RU_EXECUTION、ACT_RU_TASK、ACT_HI_PROCINST、ACT_HI_ACTINST、ACT_HI_TASKINST、ACT_RU_IDENTITYLINK、ACT_HI_IDENTITYLINK表)    @Test
public void test6() {
ProcessEngine processEngine = DefaultProcessEngine();
String processDefinitionId="qjlc:1:104";
ProcessInstance processInstance = RuntimeService().startProcessInstanceById(processDefinitionId);
System.out.Id());//201
}
查询个⼈任务列表
@Test
public void test7() {
ProcessEngine processEngine = DefaultProcessEngine();
TaskQuery query = TaskService().createTaskQuery();
query.taskAssignee("张三");
List<Task> list = query.list();
for (Task item : list) {
System.out.Id()+"==="+Name());//204===提交请假申请
}
}
办理任务
//办理任务(主要操作ACT_RU_EXECUTION、ACT_RU_TASK表)
@Test
public void test8() {
ProcessEngine processEngine = DefaultProcessEngine();
}
办理任务后,流程就⾛到了下⼀个节点,再次查询张三个⼈任务列表就查不到了,此时⽤李四去查就可以了。
使⽤Activiti框架的API操作流程
/**
* 使⽤Activiti框架的API操作流程
*/
public class ActivitiAPITest {
ProcessEngine processEngine = DefaultProcessEngine();
/**
* 部署流程定义⽅式⼀:读取单个的流程定义⽂件⽅式⼆:读取zip压缩⽂件
*/
@Test
public void test1() {
DeploymentBuilder deploymentBuilder = RepositoryService().createDeployment();
// ⽅式⼀:读取单个的流程定义⽂件
deploymentBuilder.addClasspathResource("test1.bpmn");
deploymentBuilder.addClasspathResource("test1.png");
Deployment deployment = deploymentBuilder.deploy();
/
/ ⽅式⼆:读取zip压缩⽂件
/*ZipInputStream zipInputStream = new Class().getClassLoader().getResourceAsStream("process.zip"));
deploymentBuilder.addZipInputStream(zipInputStream);
deploymentBuilder.name("请假流程部署");
Deployment deployment = deploymentBuilder.deploy();*/
}
/**
* 查询部署列表
*/
@Test
public void test2() {
// 部署查询对象,查询表act_re_deployment
DeploymentQuery query = RepositoryService().createDeploymentQuery();
List<Deployment> list = query.list();
for (Deployment deployment : list) {
String id = Id();
System.out.println(id);
}
}
/**
* 查询流程定义列表
*/
@Test

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。