activiti学习笔记
activiti入门
- activiti官网
- pom.xml文件
xml <!-- activiti --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>5.18.0</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring</artifactId> <version>5.18.0</version> </dependency> <!-- activiti结束 -->
- 安装activiti插件
CSDN教程 - 创建bpm图
1.开始点
2.结束点
3.任务
4.执行人
5.流程id,流程名 部署流程
```java
public class Test {
// getDefaultProcessEngine会读取activiti.cfg.xml
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();/** * 部署流程 */ @org.junit.Test public void deploy() { //读取资源文件部署 Deployment deploy = processEngine.getRepositoryService().createDeployment() .addClasspathResource("bpmn/helloWorld.bpmn").addClasspathResource("bpmn/helloWorld.png").deploy(); // act_re_deployment部署对象表 // act_re_procdef 流程定义表 // act_ge_bytearray 资源文件表 System.out.println(deploy.getId()); System.out.println(deploy.getName()); }
}
```- 启动流程
```java
/**- 启动流程实例
*/
@org.junit.Test
public void run() {
// key值对应bpmn中流程的id 默认按最新版本启动
ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey("helloWorld");
// 流程实例id
System.out.println(pi.getId());
// 流程定义id
System.out.println(pi.getProcessDefinitionId());
}
``` - 启动流程实例
- 查询任务
```java
/**查询任务
*/
@org.junit.Test
public void task() {
// 通过执行人进行查询
List list = processEngine.getTaskService().createTaskQuery().taskAssignee("李四").list();
for (Task task : list) {
// 任务id
System.out.println(task.getId());
// 任务名
System.out.println(task.getName());
// 任务创建时间
System.out.println(task.getCreateTime());
// 流程实例id
System.out.println(task.getProcessInstanceId());
// 流程定义id
System.out.println(task.getProcessDefinitionId());}
}
``` - 完成任务
java /** * 完成任务 */ @org.junit.Test public void complete() { // 查询李四的所有任务 List<Task> list = processEngine.getTaskService().createTaskQuery().taskAssignee("李四").list(); for (Task task : list) { System.out.println(task.getId()); // 通过任务id进行完成 processEngine.getTaskService().complete(task.getId()); } }
- 查询所有部署
java /** * 查询所有部署 */ @org.junit.Test public void findDeploy() { List<Deployment> deploymentList = processEngine.getRepositoryService().createDeploymentQuery().list(); for (Deployment deployment : deploymentList) { System.out.println(deployment.getId()); System.out.println(deployment.getName()); } }
删除流程定义
/** * 删除部署 */ @org.junit.Test public void deleteDeploy() { String deployString = "20001"; // 部署表,流程定义表,资源表内容删除 // 普通删除:如果本流程定义正在运行会抛出异常 // 多级删除: 删除与本流程定义所关联的所有信息 processEngine.getRepositoryService().deleteDeployment(deployString); System.out.println("删除部署成功"); }
获得部署资源文件
/** * 获得部署的资源文件 * * @throws IOException */ @org.junit.Test public void getResources() throws IOException { // 部署对象id String id = "7501"; // 查询出当前部署的所有资源文件png+bpm List<String> deploymentResourceNames = processEngine.getRepositoryService().getDeploymentResourceNames(id); String png = null; for (String name : deploymentResourceNames) { // 获得png文件名 if (name.indexOf(".png") >= 0) { png = name; } } System.out.println(png); // 获得当前文件流 InputStream resourceAsStream = processEngine.getRepositoryService().getResourceAsStream(id, png); File file = new File("d:/" + png); FileUtils.copyToFile(resourceAsStream, file); }
获得最新版本的流程定义
/** * 查询最新坂本流程定义 */ @org.junit.Test public void queryLatestVersion() { // 查询流程定义按版本排序 List<ProcessDefinition> list = processEngine.getRepositoryService() .createProcessDefinitionQuery().orderByProcessDefinitionVersion().asc().list(); // 创建一个map用于存放最新版本的流程定义 Map<String, ProcessDefinition> map = new HashMap<String, ProcessDefinition>(); // 遍历流程定义集合 for (ProcessDefinition processDefinition : list) { map.put(processDefinition.getKey(), processDefinition); } // 遍历最新版本流程定义获得信息 for (ProcessDefinition processDefinition : map.values()) { System.out.println("id:" + processDefinition.getId()); System.out.println("name:" + processDefinition.getName()); System.out.println("key:" + processDefinition.getKey()); System.out.println("version:" + processDefinition.getVersion()); } }
查询流程状态
/** * 查询流程状态 */ @org.junit.Test public void processState() { // 流程实例 String pid = "47501"; // 通过流程实例id进行查询返回唯一结果 ProcessInstance singleResult = processEngine.getRuntimeService().createProcessInstanceQuery() .processInstanceId(pid).singleResult(); // 判断结果不为空 if (singleResult != null) { System.out.println("未完成"); System.out.println(singleResult.getActivityId()); } else { System.out.println("流程结束"); } }
查询历史任务
/** * 查询历史任务 */ @org.junit.Test public void getHistoryTasks() { // 历史任务办理人 String assignee = "张三"; // 通过历史任务办理人进行查询 List<HistoricTaskInstance> list = processEngine.getHistoryService() .createHistoricTaskInstanceQuery().taskAssignee(assignee).list(); // 遍历历史任务 for (HistoricTaskInstance historicTaskInstance : list) { // 任务id System.out.println(historicTaskInstance.getId()); // 任务办理人 System.out.println(historicTaskInstance.getAssignee()); // 任务名 System.out.println(historicTaskInstance.getName()); // 任务流程实例 System.out.println(historicTaskInstance.getProcessInstanceId()); } }
查询历史流程定义
/** * 查询历史流程实例 */ @org.junit.Test public void historyProcessInstance() { // 通过流程定义key进行查询 List<HistoricProcessInstance> list = processEngine.getHistoryService() .createHistoricProcessInstanceQuery().processDefinitionKey("helloWorld").list(); // 遍历结果集 for (HistoricProcessInstance historicProcessInstance : list) { System.out.println(historicProcessInstance.getId()); // 启动时间 System.out.println(historicProcessInstance.getStartTime()); // 结束时间 System.out.println(historicProcessInstance.getEndTime()); // 持续时间 System.out.println(historicProcessInstance.getDurationInMillis()); System.out.println(historicProcessInstance.getName()); System.out.println(historicProcessInstance.getProcessDefinitionKey()); } }
设置与获取流程变量
/** * 设置获取流程变量 */ @org.junit.Test public void setGetVariables() { String pi = "47501"; String person = "李四"; TaskService taskService = processEngine.getTaskService(); Task task = taskService.createTaskQuery().processInstanceId(pi).taskAssignee(person).singleResult(); String taskId = task.getId(); // 设置流程变量 taskService.setVariable(taskId, "审核意见", "同意"); taskService.setVariable(taskId, "备注", "路上注意安全"); /** * setVariable和setVariableLocal的区别 * setVariable:流程变量名称相同的时候,后一次的值替换前一次的值,而且可以看到TASK_ID的字段不会存放任务ID的值 * setVariableLocal:一个流程中存在2个活动节点,流程变量的名称相同,后一次的版本的值也不会替换前一次版本的值 * 使用setVariableLocal说明流程变量绑定了当前的任务,当流程继续执行时,下个任务获取不到这个流程变量 */ // 变量存在javaBean前提要让javaBean实现序列化 LeaveInfo leaveInfo = new LeaveInfo(); leaveInfo.setId("1"); leaveInfo.setLeaveMsg("test"); taskService.setVariable(taskId, "javaBean", leaveInfo); // 获取流程变量 String shyj = (String) taskService.getVariable(taskId, "审核意见"); String bz = (String) taskService.getVariable(taskId, "备注"); System.out.println(shyj); System.out.println(bz); // 同时要求流程变量对象的属性不能发生发生变化,否则抛出异常 LeaveInfo javaBean = (LeaveInfo) taskService.getVariable(taskId, "javaBean"); System.out.println(javaBean.getId()); System.out.println(javaBean.getLeaveMsg()); }
- RuntimeService对象可以设置流程变量和获取流程变量
- TaskService对象可以设置流程变量和获取流程变量
- 流程实例启动的时候可以设置流程变量
- 任务办理完成的时候可以设置流程变量
- 流程变量可以通过名称/值的形式设置单个流程变量
- 流程变量可以通过名称/值的形式设置单个流程变量
- Map集合的key表示流程变量的名称
- Map集合的value表示流程变量的值
查询历史流程变量
/** * 查询历史流程变量 */ @org.junit.Test public void historyVariable() { HistoricVariableInstance variable = processEngine.getHistoryService().createHistoricVariableInstanceQuery().variableName("审核意见") .processInstanceId("47501").singleResult(); // 流程变量名 System.out.println(variable.getVariableName()); // 流程变量的值 System.out.println(variable.getValue()); }
17.根据流程变量走不同的流程
- 流程图
代码:
```java
package com.cjrj.bootactividemo;import java.util.HashMap;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;/**
- 审核附加流程变量
- @author Jamin
*/
public class Test2 {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();@Test
public void test() {
// 部署
Deployment deploy = processEngine.getRepositoryService().createDeployment()
.addClasspathResource("bpm/test.bpmn").addClasspathResource("bpm/test.png").name("test")
.deploy();
// 启动
ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey("myProcess");
Task task = processEngine.getTaskService().createTaskQuery().taskAssignee("张三")
.processInstanceId(pi.getId()).singleResult();
// 审批附加流程变量
Map<String, Object> map = new HashMap<String, Object>();
map.put("message", "重要");
processEngine.getTaskService().complete(task.getId(), map);
// 查询李四的任务
Task task1 = processEngine.getTaskService().createTaskQuery().taskAssignee("李四")
.processInstanceId(pi.getId()).singleResult();
// 如果message是重要task1不为空,如果message是不重要的task为空
if (task1 != null) {
System.out.println(task1.getName());
} else {
System.out.println("结束");
}
}
}
```
- 流程图
排他网关
代码:
```java
package com.cjrj.bootactividemo;
import java.util.HashMap;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;/**
- 排他网关
- @author Jamin
- */
public class Test3 {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
@org.junit.Test public void test() { // 部署 Deployment deployment = processEngine.getRepositoryService().createDeployment() .addClasspathResource("reimburse/MyProcess.bpmn") .addClasspathResource("reimburse/MyProcess.png").deploy(); // 启动 ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey("reimburse"); // 查询任务 Task task = processEngine.getTaskService().createTaskQuery().taskAssignee("张三") .processInstanceId(processInstance.getId()).singleResult(); System.out.println("------------------------------------------------"); System.out.println(task.getId()); System.out.println("-------------------------------------------------"); // 完成任务,附带流程定义 Map<String, Object> map = new HashMap<String, Object>(); map.put("money", 10000); processEngine.getTaskService().complete(task.getId(), map); // 李四的任务 Task lisi = processEngine.getTaskService().createTaskQuery().taskAssignee("李四") .processInstanceId(processInstance.getId()).singleResult(); Task wangwu = processEngine.getTaskService().createTaskQuery().taskAssignee("王五") .processInstanceId(processInstance.getId()).singleResult(); Task zhaoliu = processEngine.getTaskService().createTaskQuery().taskAssignee("赵六") .processInstanceId(processInstance.getId()).singleResult(); if (lisi == null) { System.out.println("李四没有任务"); } if (wangwu == null) { System.out.println("王五没有任务"); } if (zhaoliu == null) { System.out.println("赵六没有任务"); } }
}
```
- 接收任务
代码:
```java
package com.cjrj.bootactividemo;import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;/**
- 接受任务(启动流程实例 执行查询执行对象 查询不到第一个)
- @author Jamin
- @date 2019年7月16日 下午8:08:15
- */
public class Task5 {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
@org.junit.Test public void test() { // 部署 Deployment deploy = processEngine.getRepositoryService().createDeployment() .addClasspathResource("message/message.bpmn").addClasspathResource("message/message.png") .deploy(); // 启动 ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey("message"); System.out.println(processInstance.getId()); // 查询执行对象 Execution execution = processEngine.getRuntimeService().createExecutionQuery() .processInstanceId(processInstance.getId()).activityId("receivetask1").singleResult(); System.out.println("当前执行对象"); System.out.println(execution.getActivityId()); System.out.println("end当前执行对象"); processEngine.getRuntimeService().signal(execution.getId()); ProcessInstance pi = processEngine.getRuntimeService().createProcessInstanceQuery() .processInstanceId(processInstance.getId()).singleResult(); System.out.println("查询实例是否结束"); System.out.println(pi); // 查询执行对象 Execution execution2 = processEngine.getRuntimeService().createExecutionQuery() .processInstanceId(processInstance.getId()).activityId("receivetask2").singleResult(); System.out.println("当前执行对象"); System.out.println(execution2.getActivityId()); System.out.println("end当前执行对象"); processEngine.getRuntimeService().signal(execution2.getId()); ProcessInstance pi2 = processEngine.getRuntimeService().createProcessInstanceQuery() .processInstanceId(processInstance.getId()).singleResult(); System.out.println("查询实例是否结束"); System.out.println(pi2); }
}
```
20.个人任务
1.直接指定办理人
2.通过流程变量指定办理人bpmn图
代码
java /** * 通过流程变量指定办理人 * * @author Jamin * @date 2019年7月17日下午4:18:30 * @return void */ @org.junit.Test public void test() { // 部署 Deployment deploy = repositoryService.createDeployment() .addClasspathResource("personVariables/personVariables.bpmn") .addClasspathResource("personVariables/personVariables.png").deploy(); // 启动并设定流程变量,指定组办理人 HashMap<String, Object> map = new HashMap<String, Object>(); map.put("userId", "张三"); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("personVariables", map); System.out.println("流程实例:" + processInstance.getId()); // 查询个人任务 List<Task> list = taskService.createTaskQuery().taskAssignee("张三").list(); for (Task task : list) { System.out.println(task.getId()); System.out.println(task.getName()); System.out.println(task.getExecutionId()); System.out.println(task.getAssignee()); } }
- 通过类指定办理人
创建一个实现了TaskListener的类
```java
package com.cjrj.bootactividemo;import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
/** * 实现TaskListener接口完成指定办理人 * * @author Jamin * @date 2019年7月17日 下午4:23:30 * */
public class TaskListenerImpl implements TaskListener {
@Override public void notify(DelegateTask delegateTask) { // 指定办理人 String person = "张三"; // 设置办理人 delegateTask.setAssignee(person);
}
}
```
- bpmn图绑定监听
测试代码
```java
/**
* 通过类指定办理人
*
* @author Jamin
* @date 2019年7月17日下午4:20:31
* @return void
*/
@org.junit.Test
public void test2() {
TaskListenerImpl taskListenerImpl = new TaskListenerImpl();
// 部署
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("personVariables/personClass.bpmn")
.addClasspathResource("personVariables/personClass.png").deploy();
// 启动并设定流程变量,指定组办理人
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("userId", "张三");
ProcessInstance processInstance =
runtimeService.startProcessInstanceByKey("personVariables", map);
System.out.println("流程实例:" + processInstance.getId());
// 查询个人任务
Task task = taskService.createTaskQuery().taskAssignee("张三")
.processInstanceId(processInstance.getId()).singleResult();
System.out.println("张三任务:" + task.getName());
// 转交任务
taskService.setAssignee(task.getId(), "李四");
Task task1 = taskService.createTaskQuery().taskAssignee("李四")
.processInstanceId(processInstance.getId()).singleResult();
System.out.println("李四的任务:" + task1.getName());}
```
- 组任务
直接指定
使用流程变量
使用类
代码
```java
package com.cjrj.bootactividemo;import java.util.List; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; import org.activiti.engine.TaskService; import org.activiti.engine.history.HistoricIdentityLink; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.IdentityLink; import org.activiti.engine.task.Task; /** * 组任务 * * @author Jamin * @date 2019年7月17日 下午5:12:21 * */ public class Test7 { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); RuntimeService runtimeService = processEngine.getRuntimeService(); TaskService taskService = processEngine.getTaskService(); /** * 直接指定 * * @author Jamin * @date 2019年7月17日下午5:13:02 * @return void */ @org.junit.Test public void test() { // 第一种 /* * // 部署 repositoryService.createDeployment().addClasspathResource("group/first.bpmn") * .addClasspathResource("group/first.png").deploy(); // 启动 ProcessInstance processInstance = * runtimeService.startProcessInstanceByKey("first"); System.out.println("流程实例id:" + * processInstance.getId()); */ // 第二种 /* * Deployment deploy = * repositoryService.createDeployment().addClasspathResource("group/second.bpmn") * .addClasspathResource("group/second.png").deploy(); HashMap<String, Object> map = new * HashMap<String, Object>(); map.put("userId", "张三,李四,王五"); ProcessInstance processInstance = * runtimeService.startProcessInstanceByKey("second", map); */ // 第三种 Deployment deploy = repositoryService.createDeployment() .addClasspathResource("group/third.bpmn").addClasspathResource("group/third.png").deploy(); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("third"); System.out.println("流程实例id" + processInstance.getId()); // 查询组任务 List<Task> list = taskService.createTaskQuery().processInstanceId(processInstance.getId()) .taskCandidateUser("张三").list(); System.out.println("组任务:" + list); String taskId = null; for (Task task : list) { System.out.println(task.getName()); System.out.println(task.getAssignee()); System.out.println(task.getId()); taskId = task.getId(); } // 查询组成员 List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(taskId); for (IdentityLink identityLink : identityLinksForTask) { System.out.println(identityLink.getGroupId()); System.out.println(identityLink.getUserId()); } // 查询历史组成员列表 List<HistoricIdentityLink> historicIdentityLinksForTask = processEngine.getHistoryService().getHistoricIdentityLinksForTask(taskId); for (HistoricIdentityLink historicIdentityLink : historicIdentityLinksForTask) { System.out.println(historicIdentityLink.getUserId()); System.out.println(historicIdentityLink.getGroupId()); } // 组任务转个人可以是任何人 taskService.claim(taskId, "张11"); Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()) .taskAssignee("张11").singleResult(); System.out.println("组任务转个人任务名:" + task.getName()); // 个人任务转组(必须任务以前是组任务) taskService.setAssignee(task.getId(), null); // 检测是否转组任务成功, List<Task> list1 = taskService.createTaskQuery().processInstanceId(processInstance.getId()) .taskCandidateUser("张三").list(); String taskId1 = null; for (Task task1 : list) { System.out.println("转组任务:" + task1.getName()); System.out.println("转组任务:" + task1.getAssignee()); System.out.println("转组任务:" + task1.getId()); taskId1 = task.getId(); } // 添加人员 taskService.addCandidateUser(taskId1, "qiqi"); // 查询参与人员 List<IdentityLink> identityLinksForTask2 = taskService.getIdentityLinksForTask(taskId1); for (IdentityLink identityLink : identityLinksForTask2) { System.out.println("添加人员后" + identityLink.getUserId()); } // 删除人员张三 taskService.deleteCandidateUser(taskId1, "张三"); List<IdentityLink> identityLinksForTask3 = taskService.getIdentityLinksForTask(taskId1); for (IdentityLink identityLink : identityLinksForTask3) { System.out.println("删除人员后:" + identityLink.getUserId()); } // 完成任务 taskService.complete(taskId); } }
```
- 分配任务给一个角色
- bpmn图
代码:
```java
/**
* 分配任务负责的组
* 可以分配给多个角色
* 三种方式都可
*
* @author Jamin
* @date 2019年7月18日上午8:28:12
* @return void
/
@org.junit.Test
public void four() {
// 部署
Deployment deploy = repositoryService.createDeployment().addClasspathResource("group/four.bpmn")
.addClasspathResource("group/four.png").deploy();
IdentityService identityService = processEngine.getIdentityService();
// 创建组与用户并关联
/
* identityService.saveGroup(new GroupEntity("部门经理")); identityService.saveGroup(new
* GroupEntity("总经理")); identityService.saveUser(new UserEntity("张三"));
* identityService.saveUser(new UserEntity("李四")); identityService.createMembership("张三",
* "部门经理"); identityService.createMembership("李四", "总经理");
/
// 使用流程变量设置角色
/
* HashMap<String, Object> map = new HashMap<String, Object>(); map.put("group", "部门经理,总经理");
*/// 启动 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("four"); // 查询个人任务 Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()) .taskCandidateUser("李四").singleResult(); System.out.println(task.getName()); } // 查询执行任务的组 List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId()); for (IdentityLink identityLink : identityLinksForTask) {
System.out.println(identityLink.getGroupId());
```
- bpmn图
- 总结:
- 流程步骤
- bpmn
- 使用bpmn图或zip部署
- 启动流程
- 查询个人任务或组任务
- 实现办理人的三种方式:
- 直接指定
- 使用流程变量,启动时指定
- 使用监听器
- 21点与22点: 21点是指定多人,可以是任意一个人,以人为单位,22点必须创建角色,执行人是角色中的任意一个,以角色为单位,都可以进行任务转让,添加删除
- 流程步骤
activiti学习笔记的更多相关文章
- Activiti 学习笔记记录(2016-8-31)
上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件
- Activiti 学习笔记记录(二)
上一篇:Activiti 学习笔记记录 导读:对于工作流引擎的使用,我们都知道,需要一个业务事件,比如请假,它会去走一个流程(提交申请->领导审批---(批,不批)---->结束),Act ...
- Activiti学习笔记目录
1.Activiti学习笔记1 — 下载与开发环境的配置: 2.Activiti学习笔记2 — HelloWorld: 3.Activiti学习笔记3 — 流程定义: 4.Activiti学习笔记4 ...
- activiti学习笔记一
activiti学习笔记 在讲activiti之前我们必须先了解一下什么是工作流,什么是工作流引擎. 在我们的日常工作中,我们会碰到很多流程化的东西,什么是流程化呢,其实通俗来讲就是有一系列固定的步骤 ...
- Activiti 学习笔记(2016-8-30)
前言 不管学习什么,都必须对知识体系中专有的名词或者特定的语言组织方式 有所了解. 本文仅记录学习过程中的笔记,参考意义因人而定,不保证所言全部正确. 学习方式,百度传课的视频<权威Activi ...
- Activiti 学习笔记记录
官方在线用户手册(英文版):http://activiti.org/userguide/index.html 中文用户手册:http://www.mossle.com/docs/activiti/in ...
- Activiti学习笔记1 — 下载与开发环境的配置
一.下载 JDK下载URL: Tomcat下载URL:http://tomcat.apache.org/ Eclipse下载URL:http://www.oracle.com/technetwork/ ...
- Activiti学习笔记11 — 判断节点的使用
一. 创建流程 <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns=" ...
- Activiti学习笔记10 — 动态任务分配
动态任务分配使用的两种方式 一.通过特殊表达式,来获取任务信息 ,在流程 UserTask节点上设置 ${流程变量的Key} 1.流程定义 <?xml version="1.0&quo ...
随机推荐
- Debian下编译安装驱动模块
在Linux下,我们常有需要自己来编译安装驱动模块的情况,例如要安装显卡驱动,要安装无线驱动,有的时候某个程序的安装使用与需要安装相应的驱动模块.Debian Linux下的生活本已十分简单,使用ap ...
- WPF获取和设置应用程序范围的资源
设置资源: Application.Current.Resources["ApplicationScopeResource"] = Brushes.White; 使用代码获取资源: ...
- C#根据对象的指定字段去除重复值
PersonInfo类: public class PersonInfo { public int Index; public string Name; public override string ...
- MySQL 常用数据存储引擎区别
mysql有多种存储引擎,目前常用的是 MyISAM 和 InnoDB 这两个引擎,除了这两个引擎以为还有许多其他引擎,有官方的,也有一些公司自己研发的.这篇文章主要简单概述一下常用常见的 MySQL ...
- 【Windows10 IoT开发系列】PowerShell的相关配置
原文:[Windows10 IoT开发系列]PowerShell的相关配置 可使用 Windows PowerShell 远程配置和管理任何 Windows 10 IoT 核心版设备.PowerShe ...
- Android零基础入门第65节:RecyclerView分割线开发技巧
在上一期通过简单学习,已经领略到了RecyclerView的灵活性,当然都是一些最基础的用法,那么本期一起来学习RecyclerView的分割线使用. 相信有的比较细心的同学已经发现了,使用Recyc ...
- .NET重思(三)-数组列表与数组的区别,栈集合和队列结合的区别
数组列表和数组十分相似,区别在于数组列表的容量是可以动态变化的,而数组的容量是固定的.数组即Array类,数组列表即ArrayList类,两者十分相似.不过,Array类在System命名空间下,Ar ...
- Play Framework 模板里使用注入访问数据层
从Play2.4开始,推荐使用依赖注入替代静态控制器.因此我们不能像play2.3那样,在模板里直接调用object访问数据层.是的,我们还是可以使用常规方式,通过传参到模板里.不过这样很多时候不方便 ...
- Linux --- 程序后台运行的几种方法
有时候我们运行一个程序,耗时比较长,所以在快下班的时候或是网络不稳定的时候就比较抓狂. 今天分享几个我在工作中用到的把程序放在后台运行的方法. nohup $ nohup --h Usage: noh ...
- Ptypes一个开源轻量级的c++库,包括对一些I/O操作、网络通信、多线程和异常处理的封装
C++开源项目入门级:Ptypes Ptypes一个开源轻量级的c++库,包括对一些I/O操作.网络通信.多线程和异常处理的封装.虽然代码有限,包括的内容不少,麻雀虽小,五脏俱全. 提高: ...