java工作流activity_activity 工作流学习(一)
启动流程实例
什么是流程实例?根据一个流程定义具体的一次执行过程就是一个流程实例,一个流程定义对应多个流程实例(一对多关系)
为了演示:在流程图中指定办理人是谁,现在是写死的,表示只能张三能提交请假申请。后面会讲解如何动态指定。
//根据流程定义的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 = ProcessEngines.getDefaultProcessEngine();
String processDefinitionId="qjlc:1:104";
ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceById(processDefinitionId);
System.out.print(processInstance.getId());//201
}
查询个人任务列表
@Test
public void test7() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskQuery query = processEngine.getTaskService().createTaskQuery();
query.taskAssignee("张三");
List list = query.list();
for (Task item : list) {
System.out.print(item.getId()+"==="+item.getName());//204===提交请假申请
}
}
办理任务
//办理任务(主要操作ACT_RU_EXECUTION、ACT_RU_TASK表)
@Test
public void test8() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getTaskService().complete("204");
}
办理任务后,流程就走到了下一个节点,再次查询张三个人任务列表就查不到了,此时用李四去查就可以了。
使用Activiti框架的API操作流程
/**
* 使用Activiti框架的API操作流程
*/
public class ActivitiAPITest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**
* 部署流程定义 方式一:读取单个的流程定义文件 方式二:读取zip压缩文件
*/
@Test
public void test1() {
DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();
// 方式一:读取单个的流程定义文件
deploymentBuilder.addClasspathResource("test1.bpmn");
deploymentBuilder.addClasspathResource("test1.png");
Deployment deployment = deploymentBuilder.deploy();
// 方式二:读取zip压缩文件
/*ZipInputStream zipInputStream = new ZipInputStream(this.getClass().getClassLoader().getResourceAsStream("process.zip"));
deploymentBuilder.addZipInputStream(zipInputStream);
deploymentBuilder.name("请假流程部署");
Deployment deployment = deploymentBuilder.deploy();*/
}
/**
* 查询部署列表
*/
@Test
public void test2() {
// 部署查询对象,查询表act_re_deployment
DeploymentQuery query = processEngine.getRepositoryService().createDeploymentQuery();
List list = query.list();
for (Deployment deployment : list) {
String id = deployment.getId();
System.out.println(id);
}
}
/**
* 查询流程定义列表
*/
@Test
public void test3() {
// 流程定义查询对象,查询表act_re_procdef
ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
List list = query.list();
for (ProcessDefinition pd : list) {
System.out.println(pd.getName() + "" + pd.getId());
}
}
/**
* 删除部署信息
*/
@Test
public void test4() {
String deploymentId = "1001";
// processEngine.getRepositoryService().deleteDeployment(deploymentId);
processEngine.getRepositoryService().deleteDeployment(deploymentId,true);
}
/**
* 删除流程定义(通过删除部署信息达到删除流程定义的目的)
*/
@Test
public void test5() {
String deploymentId = "1401";
// processEngine.getRepositoryService().deleteDeployment(deploymentId);
processEngine.getRepositoryService().deleteDeployment(deploymentId,
true);
}
/**
* 查询一次部署对应的流程定义文件名称和对应的输入流(bpmn png)
*
* @throws Exception
*/
@Test
public void test6() throws Exception {
String deploymentId = "101";
List names = processEngine.getRepositoryService()
.getDeploymentResourceNames(deploymentId);
for (String name : names) {
System.out.println(name);
InputStream in = processEngine.getRepositoryService()
.getResourceAsStream(deploymentId, name);
// 将文件保存到本地磁盘
/*
* OutputStream out = new FileOutputStream(new File("d:\\" + name));
* byte[] b = new byte[1024]; int len = 0; while((len =
* in.read(b))!=-1) { out.write(b, 0, len); } out.close();
*/
FileUtils.copyInputStreamToFile(in, new File("d:\\" + name));
in.close();
}
}
/**
* 获得png文件的输入流
*
* @throws Exception
*/
@Test
public void test7() throws Exception {
String processDefinitionId = "qjlc:9:1204";
InputStream pngInputStream = processEngine.getRepositoryService()
.getProcessDiagram(processDefinitionId);
FileUtils.copyInputStreamToFile(pngInputStream, new File("d:\\my.png"));
}
/**
* 启动流程实例 方式一:根据流程定义的id启动 方式二:根据流程定义的key启动(自动选择最新版本的流程定义启动流程实例)
*/
@Test
public void test8() {
/*
* String processDefinitionId = "qjlc:9:1204"; ProcessInstance
* processInstance =
* processEngine.getRuntimeService().startProcessInstanceById
* (processDefinitionId ); System.out.println(processInstance.getId());
*/
String processDefinitionKey = "qjlc";
ProcessInstance processInstance = processEngine.getRuntimeService()
.startProcessInstanceByKey(processDefinitionKey);
System.out.println(processInstance.getId());
}
/**
* 查询流程实例列表,查询act_ru_execution表
*/
@Test
public void test9(){
//流程实例查询对象,查询act_ru_execution表
ProcessInstanceQuery query = processEngine.getRuntimeService().createProcessInstanceQuery();
query.processDefinitionKey("qjlc");
query.orderByProcessInstanceId().desc();
query.listPage(0, 2);
List list = query.list();
for (ProcessInstance pi : list) {
System.out.println(pi.getId() + " " + pi.getActivityId());
}
}
/**
* 结束流程实例,操作的表act_ru_execution act_ru_task
*/
@Test
public void test10(){
String processInstanceId = "1601";
processEngine.getRuntimeService().deleteProcessInstance(processInstanceId , "我愿意");
}
/**
* 查询任务列表
*/
@Test
public void test11(){
//任务查询对象,查询act_ru_task表
TaskQuery query = processEngine.getTaskService().createTaskQuery();
String assignee = "李四";
query.taskAssignee(assignee);
query.orderByTaskCreateTime().desc();
List list = query.list();
for (Task task : list) {
System.out.println(task.getId());
}
}
/**
* 办理任务
*/
@Test
public void test12(){
String taskId = "2902";
processEngine.getTaskService().complete(taskId);
}
/**
* 直接将流程向下执行一步
*/
@Test
public void test13(){
String executionId = "2701";//流程实例id
processEngine.getRuntimeService().signal(executionId);
}
/**
* 查询最新版本的流程定义列表
*/
@Test
public void test14(){
ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
query.orderByProcessDefinitionVersion().asc();
List list = query.list();
Map map = new HashMap();
for (ProcessDefinition pd : list) {
map.put(pd.getKey(), pd);
}
ArrayList lastList = new ArrayList<>(map.values());
for (ProcessDefinition processDefinition : lastList) {
System.out.println(processDefinition.getName() + " "+ processDefinition.getVersion() );
}
}
}
Activiti框架提供的Service对象
RepositoryService----操作静态的资源(流程定义,bpmn、png)
RuntimeService-----操作流程实例(启动流程实例、查询流程实例、结束流程实例)
TaskService-----操作任务(查询任务、办理任务)
HistoryService----操作历史数据
Activiti框架提供的对象(和表有对应关系)
Deployment-----act_re_deployment
ProcessDefinition----act_re_procdef
ProcessInstance-----act_ru_execution
Task-----act_ru_task
使用网页版流程设计器
1、将activiti-explorer.war复制到tomcat中
2、启动tomcat,访问http://lcoalhost:8080/activiti-explorer
3、使用kermit/kermit登录
4、
5、
参考文档:http://www.cnblogs.com/llzgzljl/archive/2013/10/07/3356108.html
学习资源:http://www.mossle.com/index.do
java工作流activity_activity 工作流学习(一)相关推荐
- 工作流Activiti5.13学习笔记(一)
工作流Activiti5.13学习笔记(一) 了解工作流 1.工作流(Workflow),就是"业务过程的部分或整体在计算机应用环境下的自动化",它主要解决的是"使在多个 ...
- 史上最全的工作流引擎 Activiti 学习教程(值得收藏)
点击关注公众号,实用技术文章及时了解 一.工作流介绍 1.1 概念 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是"使在多个参与者之间按照某种预定义的规则 ...
- java jbpm工作流,三分钟明白 Activity工作流,工作流jbpm
三分钟明白 Activity工作流,工作流jbpm 一. 什么是工作流 Georgakopoulos给出的工作流定义是:工作流是将一组任务组织起来以完成某个经营过程:定义了任务的触发顺序和触发条件,每 ...
- java计算机毕业设计工作流流程编辑OA系统MyBatis+系统+LW文档+源码+调试部署
java计算机毕业设计工作流流程编辑OA系统MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计工作流流程编辑OA系统MyBatis+系统+LW文档+源码+调试部署 本源码技术栈: ...
- 工作流模式的学习与总结
工作流模式的学习与总结 概念: 2 工作流的具体应用 2 工作流的审批模式 3 工作流的分类 3 Basic Control Flow Patterns 3 1.顺序(S ...
- Java开源 开源工作流
Willow 点击次数:18942 由Huihoo Power开发详细可到其中文主页查看. OpenWFE 点击次数:17672 OpenWFE是一个开放源码的Java工作流引擎.它是一个 ...
- java workflow jbpm_工作流(workflow)定义和jBPM
工作流(workflow)定义 工作流(Workflow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算.根据 WfMC 的定义 ...
- Java菜鸟到大牛学习路线培训视频
百度网盘下载 这是一套java菜鸟到大牛学习路线培训教程,由工作了10年的资深Java架构师整理.主要分5个阶段:Java程序员->Java初级软件工程师->Java中级软件工程师-> ...
- 2021 年,Java 开发者最值得学习的 14 项技能
如果你想在这个竞争激烈的世界里,成为一名熟练开发 Java 项目的开发人员,你应该学习很多东西才行.你需要掌握许多技能,具体应该掌握的技能组合取决于你的职位.根据关于 Java 编程人员技能的最新调查 ...
- java计算机毕业设计vue学习视频课程网站源码+mysql数据库+系统+lw文档+部署
java计算机毕业设计vue学习视频课程网站源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计vue学习视频课程网站源码+mysql数据库+系统+lw文档+部署 本源码技术栈: 项目 ...
最新文章
- 使用PHP+Sphinx建立高效的站内搜索引擎
- matlab图片压缩
- vector function trmplate
- leetcode713. 乘积小于K的子数组(双指针)
- c语言 vscode代码自动补全_借助C/C++ Extension实现VSCode C++代码补全
- 做外贸出口,要想快速开发客户,快速赚大钱
- 深度学习优化算法大全系列3:NAG(Nesterov Acceleration Gradient)
- 【代码笔记】RRDNet 网络
- 如何选择适合的大数据分析软件
- OpenKG开源系列 | 中文高中地理知识图谱CKGG(南京大学)
- 大数据商业化应用的价值和应用场景是什么?
- 千万别和女程序员做同事!
- 万恶的ie8 hack问题
- 应用程序未安装,已安装了存在签名冲突的同名数据包
- 教你如何制作浪漫的表白网站
- 独家 | 木瓜移动将冲刺香港上市:已任命刘凡为新CFO,赵巨涛退出
- linux daemon 进程
- Windows安装Git客户端工具
- 进销存设计与分析_调仓单(10)
- ADRC自抗扰控制总结
热门文章
- LNK2005错误的原因与解决
- 产品规划三板斧:商业画布/精益画布/SWOT分析
- android 高仿新浪微博,android 仿新浪微博开写篇
- python3安装setuptools步骤_详解Python3中setuptools、Pip安装教程
- 苹果视频剪辑计算机配置,视频剪辑后期神器-创作PC黑苹果系统安装与台式电脑配置推荐...
- TIM网盘批量下载方法
- 软件工程实践 Blog17
- 【竞赛篇-国创(大创)结题】国创(大创)立项后的基本流程、需要用什么结题、如何快速结题
- EDA技术与VHDL设计
- 一只测试喵的重新启航