工作流Activity框架入门(一)
Activity工作流入门
1. 工作流概念
工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。
工作流管理系统(Workflow Management System, WfMS)是一个软件系统,它完成工作量的定义和管理,并按照在系统中预先定义好的工作流逻辑进行工作流实例的执行。工作流管理系统不是企业的业务系统,而是为企业的业务系统的运行提供了一个软件的支撑环境。
2. Activiti简介
Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom
Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务流程图。
Activiti框架底层有数据库提供支持,根据版本不同,表的数量不一致,activiti5.13有23张表。底层使用mybatis操作数据库,开发人员不需要自己编写sql
Jbpm4.4底层也有数据库支持,18张表。 底层使用hibernate操作数据库。
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_*: 通用数据, 用于不同场景下。
3. 安装插件(流程设计器插件)
第一步:解压zip文件到eclipse中的dropins目录中
第二步:重启eclipse,勾选save选项
第三步:使用插件设计流程图
4.手动创建数据库表
6.入门Demo
package activity.demo.test; import java.util.List; import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.impl.juel.ExpressionFactoryImpl.Profile;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.junit.Test;
import org.junit.validator.PublicClassValidator; public class HelloWorld {
// 使用框架的自动建表功能(不提供配置文件)
@Test
public void testCreateTablesAutomaticallyWithoutConfigFiles() {
// 创建流程引擎配置对象
ProcessEngineConfiguration config = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
// 设置jdbc连接参数信息
config.setJdbcDriver("com.mysql.jdbc.Driver");
config.setJdbcUrl("jdbc:mysql:///eam-mirror");
config.setJdbcUsername("root");
config.setJdbcPassword("root");
// 设置自动建表
config.setDatabaseSchemaUpdate("true");
// 使用配置对象创建流程引擎对象,创建对象过程中会自动建表
ProcessEngine processEngine = config.buildProcessEngine();
} // 使用框架的自动建表功能(提供配置文件)
@Test
public void testCreateTablesAutomaticallyWithConfigFiles() {
ProcessEngineConfiguration config = ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource("activiti-context.xml", "processEngineConfiguration");
ProcessEngine pe = config.buildProcessEngine();
} // 使用框架的自动建表功能(提供配置文件---使用默认配置)
@Test
public void testCreateTablesAutomatically() {
ProcessEngine pe = ProcessEngines.getDefaultProcessEngine();
} ProcessEngine pe = ProcessEngines.getDefaultProcessEngine(); // 将设计的流程图部署到数据库中
@Test
public void testDeploy() {
// 创建部署构建器对象,用于加载流程定义文件(UserInfoAudit.bpmn,UserInfoAudit.myProcess.png),部署流程定义
DeploymentBuilder deploymentBuilder = pe.getRepositoryService().createDeployment();
deploymentBuilder.addClasspathResource("UserInfoAudit.bpmn");
Deployment deployment = deploymentBuilder.deploy();
System.out.println(deployment.getId());
} // 查询流程定义
@Test
public void testQueryProcessDefinition() {
// 流程定义查询对象,用于查询流程定义表----act_re_procdef
ProcessDefinitionQuery query = pe.getRepositoryService().createProcessDefinitionQuery();
// 添加过滤条件,取最新版本
query.latestVersion();
// query.processDefinitionId(processDefinitionId)
// query.processDefinitionKey(processDefinitionKey);
// 添加排序条件
query.orderByProcessDefinitionVersion().desc(); // 添加分页条件
// query.listPage(firstResult, maxResults); // 查询所有流程
List<ProcessDefinition> processDefinitionList = query.list();
for (ProcessDefinition pd : processDefinitionList) {
System.out.println(pd.getId());
} }
// 根据流程定义启动流程实例----操作的数据表:act_ru_execution act_ru_task
@Test
public void testStartProcess(){
String processDefinitionId = "UserAuditProcess:2:504";
//根据流程实例ID去启动流程
ProcessInstance pInstance = pe.getRuntimeService().startProcessInstanceById(processDefinitionId);
System.out.println(pInstance.getId());
} //查询任务列表
@Test
public void testQueryTaskList(){
//创建任务查询对象,查询表act_ru_task
TaskQuery query = pe.getTaskService().createTaskQuery();
String assignee ="张三";
//添加过滤条件
query.taskAssignee(assignee);
//排序
query.orderByTaskCreateTime().desc();
List<Task> taskList = query.list();
for(Task task : taskList){
System.out.println("taskId:"+task.getId()+",taskName:"+task.getName());
}
}
//办理任务
//办理个人任务,操作的表是act_ru_execution,act_ru_task
@Test
public void testExecuteTask(){
String taskId= "604";
pe.getTaskService().complete(taskId);
} }
工作流Activity框架入门(一)的更多相关文章
- CI框架入门1
CI框架入门: 1.url的特点 2.目录结构/布局 3.MVC分别在哪里,如何依葫芦画瓢 4.安全性 ...
- 【原创】NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战
概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo. 当前由于NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能. ...
- 【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战
前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...
- 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示
前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...
- 【原创】NIO框架入门(一):服务端基于Netty4的UDP双向通信Demo演示
申明:本文由作者基于日常实践整理,希望对初次接触MINA.Netty的人有所启发.如需与作者交流,见文签名,互相学习. 学习交流 更多学习资料:点此进入 推荐 移动端即时通讯交流: 215891622 ...
- CodeIgniter框架入门教程——第一课 Hello World!
本文转载自:http://www.softeng.cn/?p=45 今天开始,我将在这里连载由我自己编写的<CodeIgniter框架入门教程>,首先,这篇教程的读着应该是有PHP基础的编 ...
- C#.Net EF实体框架入门视频教程
当前位置: 主页 > 编程开发 > C_VC视频教程 > C#.Net EF实体框架入门视频教程 > kingstone金士顿手机内存卡16G仅65元 1.EF实体框架之增加查 ...
- DWR3.0框架入门(2) —— DWR的服务器推送
DWR3.0框架入门(2) —— DWR的服务器推送 DWR 在开始本节内容之前,先来了解一下什么是服务器推送技术和DWR的推送方式. 1.服务器推送技术和DWR的推送方式 传统模式的 Web ...
- ThinkJS框架入门详细教程(二)新手入门项目
一.准备工作 参考前一篇:ThinkJS框架入门详细教程(一)开发环境 安装thinkJS命令 npm install -g think-cli 监测是否安装成功 thinkjs -v 二.创建项目 ...
随机推荐
- TCP/IP|| 建立连接或终止
1.TCP是一个面向连接的协议,在双方发送数据时需要之间建立连接. 当使用telnet命令是连接对应的端口产生TCP连接,通过tcpdump命令查看TCP报文段的输出 源>目的:标志 在标识中有 ...
- 戴尔服务器R710做raid5+1
环境条件 戴尔服务器R710,有四块硬盘 实现目标:四块硬盘其中三块做raid5,剩余一块做热备硬盘 一.启动服务器 二.进入配置raid界面 根据提示按Crtl+R 进入raid配置界面 三.界面介 ...
- DEVOPS技术实践_03:Jenkins自动构建
一.提交代码自动构建 当开发人员在gitlab提交代码后,会自动触发jenkin构建 点击项目---->点击diy_maven-TEST----->点击配置--->构建触发器---- ...
- C++Primer第五版 3.2.3节练习
练习 3.6:编写一段程序,使用范围for语句将字符串内的所有字符用X代替. #include<iostream> #include<string> using namespa ...
- 全流程开发 TP6.0实战高并发电商服务系统*完
在TP6框架中我们可以学到TP整体知识,如下图一所示: 图一:TP6整体知识点 这些内容都会在实战课程中一一涵盖,并且在课程中我们会用到五层架构思想(如图二),和传统的MVC架构有所不一样,这样做可以 ...
- JavaScript面向对象 实例与原型
JavaScript 面向对象 和 C# 不太一样,js 的对象是继承自原型的如下: 首先创建一个 js 实例 new function function f () {} 这个函数 会继承 Func ...
- 用PHP写下HELLO WORLD!
一.选择PHP开发工具 1.phpstorm最新版本 2.打开phpstorm界面 按create键,选择new window ,出下如下页面: 鼠标放在文件夹上,右键单击,弹出以下对话框:做如下操作 ...
- TornadoFx学习笔记(1)——常用的代码片段
Tornadofx是基于JavaFx的一个kotlin实现的框架 之后看情况补充.. 1.读取resources文件夹中的文件 如图 想要读取config.properties文件,有两种方法 在cl ...
- IDEA 公司推出新字体,极度舒适~
这几天炒得沸沸扬扬的 Intellij IDEA 公司 JetBrains 推出了一种新字体:JetBrains Mono,据说它是专为开发人员设计的,下面栈长带大家一起来吃个瓜. JetBrains ...
- Scrapy定制起始请求
Scrapy引擎来爬虫中取起始的URL 1.调用start_requests方法(父类),并获取返回值 2.将放回值变成迭代器,通过iter() 3.执行__next__()方法取值 4.把返回值全部 ...