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 ...
随机推荐
- Android基础开发入门(一)
前言:我学了一年多的C#(从学编程算起,也没有两年,我现在大二下),中间也一直在学WP开发,虽然技术不咋地,很渣渣,但微软在Build大会上宣布的策略让我觉得有必要学习一下安卓开发了.关于微软的策略, ...
- WinForm子线程调用主线程
public Form1() { InitializeComponent(); Thread t = new Thread(ThreadWorker); t.Start(); } private vo ...
- create table as 复制not null
创建一张表包含非空约束,唯一约束和check约束 SQL> create table dept( 2 ename varchar2(20) constraint mep_ename_nn not ...
- Delphi的对象注销方法Destroy和free
当您使用完对象后,您应该及时撤销它,以便把这个对象占用的内存释放出来.您可以通过调用一个注销方法来撤销您的对象,它会释放分配给这个对象的内存. Delphi的注销方法有两个:Destroy和Free. ...
- Delphi编程中Http协议应用
Http协议的通信遵循一定的约定.例如,请求一个文件的时候先发送Get请求,然后服务器会返回请求的数据.如果需要进行断点传输,那么先发送'HEAD /'请求,其中返回的'Content-Length: ...
- MSYS2 瘦身小攻略(使用junction)
MSYS2, 吃硬盘的大神 MSYS2,集成了 x86 x64两个开发环境,且可以使用 pacman 进行包管理,可谓方便的很!可是,这个东东也有一个很不好的地方,就是实在太占硬盘.尽管下载的软件包一 ...
- jQuery仪表盘指示器动画插件 6种仪表样式
土豆网同步更新:http://www.tudou.com/plcover/VHNh6ZopQ4E/ 使用HTML 创建Mac OS App 视频教程. 官方QQ群: (1)App实践出真知 434 ...
- MSYS2开发环境搭建(无幻的博客,编译OpenSSL,可使用pacman升级)
MSYS2开发环境搭建 软件安装 下载msys2-x86_64软件包,双击安装到某根目录下,比如D:\msys64. pacman是MSYS2自带的软件管理工具: 可通过修改msys64\etc\pa ...
- [java代码库]-简易计算器(第二种)
[java代码库]-简易计算器(第二种) 第二种方案:在程序中不使用if/switch……case等语句,完成计算器功能. <html> <head> <title> ...
- 简单学习js
由于是个前端小白,通过这一两天的学习html,css,js和jquery等,基本上前端会用了,而且熟悉我博客的人来说,没错,我把自己的博客给优化了一下(一些大佬都是禁用模板的所有样式,然后自己设计页面 ...