最后
如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!
二进制数据表,存储了流程定义图形的XML文件和图片信息
保存流程定义的xml信息
保存流程定义的图片
部署信息表,存储了部署的相关信息(部署时间)
流程定义数据表,存储了当前流程图形的相关信息(id,name,版本号)
③解决乱码问题
import org.activiti.spring.SpringProcessEngineConfiguration;
import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ActivitiConfig implements ProcessEngineConfigurationConfigurer {
@Override
public void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
processEngineConfiguration.setActivityFontName(“宋体”);
processEngineConfiguration.setLabelFontName(“宋体”);
}
}
3.流程查询
①第一步:创建ProcessDefinitionQuery对象
@Test
public void test02ProcessDefinitionQuery() {
//1.创建流程定义查询对象
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
//2.调用对应的方法执行查询
List list = query.list();
//3.遍历集合
for (ProcessDefinition processDefinition : list) {
String key = processDefinition.getKey();
String name = processDefinition.getName();
int version = processDefinition.getVersion();
System.err.println(“key=”+key);
System.err.println(“name=”+name);
System.err.println(“version=”+version);
}
}
注意2:创建了新的流程定义需要再次执行部署,再次启动流程。
@Test
public void test03TaskQuery() {
//创建任务查询对象
TaskQuery query = taskService.createTaskQuery();
//根据流程定义key和委托人查询待办任务
List list = query.processDefinitionKey(“MyProcess”).taskAssignee(“zuzu”).list();
for (Task task : list) {
String assignee = task.getAssignee();
String taskId = task.getId();
String taskName = task.getName();
//taskService需要使用@Autowired注解装配
taskService.complete(task.getId());//完成任务,使任务进入下一步
System.err.println(“assignee=”+assignee);
System.err.println(“taskId=”+taskId);
System.err.println(“taskName=”+taskName);
}
}
8.查询流程实例历史
//1.创建流程实例的历史查询对象,historyService使用@Autowired注解注入
HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery();
HistoricProcessInstance instance =
query.processInstanceId(“7501”) //流程实例的id
.finished()//调用这个方法后未完成的流程实例会返回null
.singleResult();
System.out.println(instance);
9.将任务指派给一个组
注意1:创建的新的流程定义要指定一个新的id。
注意2:创建了新的流程定义需要再次执行部署,再次启动流程。
10.领取任务
@Test
public void test04Claim() {
//1.创建任务查询对象
TaskQuery taskQuery = taskService.createTaskQuery();
//2.根据任务委托组查询任务列表
List list = taskQuery.taskCandidateGroup(“jingli”).list();
//3.遍历
for (Task task : list) {
String taskId = task.getId();
String userId = “jingli”;
//3.指派任务
taskService.claim(taskId, userId);
}
}
提示:可以根据任务委托人在领取任务前和领取任务后分别查询任务,之前没有之后有即为正确。
TaskQuery query = taskService.createTaskQuery();//创建任务查询对象
List list = query.processDefinitionKey(“MyProcess”) //指定流程定义
.taskAssignee(“jingli”)//指定委托人
.list();//执行查询
for (Task task : list) {
System.out.println(task);
}
11.流程变量
①在创建流程定义时指定流程变量
例如:用变量的方式指定委托人
创建MyProcess02.bpmn
创建后正常部署
@Test
public void test01ProcessDefinitionDeployment() {
//部署:将流程定义文件中流程定义信息存入数据库
repositoryService
.createDeployment() //创建部署构建器对象
.addClasspathResource(“MyProcess02.bpmn”) //添加要部署的流程定义文件名
.deploy(); //执行部署
}
②启动
@Test
public void test05StartProcessInstance() {
//1.查询流程定义对象
ProcessDefinition processDefinition =
repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(“MyProcess02”)
.latestVersion()
.singleResult();
//2.获取流程定义的id
String processDefinitionId = processDefinition.getId();
//3.使用RunTimeService根据流程定义id启动流程定义
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId);
//4.打印processInstance对象
System.err.println(processInstance);
}
带有变量的流程启动时,如果第一个任务中就存在变量,那么启动的时候就必须给出变量值。否则将抛出异常:org.activiti.engine.impl.javax.el.PropertyNotFoundException: Cannot resolve identifier ‘erzi’
@Test
public void test06StartProcessInstanceWithVariable() {
//1.查询流程定义对象
ProcessDefinition processDefinition =
repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(“MyProcess02”)
.latestVersion()
.singleResult();
//2.获取流程定义的id
String processDefinitionId = processDefinition.getId();
//※为第一个任务指定流程变量
Map<String,Object> variables = new HashMap<String, Object>();
variables.put(“erzi”, “zhangsan”);
//3.使用RunTimeService根据流程定义id启动流程定义
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, variables);
//4.打印processInstance对象
System.err.println(processInstance);
}
③完成任务
如果完成当前任务时,下一个任务中包含变量,那么此时也必须给出下一个任务的变量值
@Test
public void test7CompleteTaskWithVariables() {
List list =
taskService.createTaskQuery() //创建任务查询对象
.processDefinitionKey(“MyProcess02”)//指定流程定义
.taskAssignee(“zhangsan”)//指定委托人
.list();//执行查询
for (Task task : list) {
String taskId = task.getId();
//在完成当前任务时,为下一个任务指定流程变量
Map<String,Object> variables = new HashMap<String, Object>();
variables.put(“sunzi”, “lisi”);
//完成当前任务时为下一个任务指定变量值
taskService.complete(taskId, variables);//完成任务,使任务进入下一步
//Unknown property used in expression: ${sunzi}
//taskService.complete(taskId);
}
}
12.排他网关
①创建流程定义
部署、启动
@Test
public void test01ProcessDefinitionDeployment() {
//部署:将流程定义文件中流程定义信息存入数据库
repositoryService
.createDeployment() //创建部署构建器对象
.addClasspathResource(“MyProcess03.bpmn”) //添加要部署的流程定义文件名
.deploy(); //执行部署
}
@Test
public void test05StartProcessInstance() {
//1.查询流程定义对象
ProcessDefinition processDefinition =
repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(“MyProcess03”)
.latestVersion()
.singleResult();
//2.获取流程定义的id
String processDefinitionId = processDefinition.getId();
//3.使用RunTimeService根据流程定义id启动流程定义
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId);
//4.打印processInstance对象
System.err.println(processInstance);
}
②完成第一个任务时为排他网关指定变量值
@Test
public void test7CompleteTaskWithVariables() {
List list =
taskService.createTaskQuery() //创建任务查询对象
.processDefinitionKey(“MyProcess03”)//指定流程定义
.taskAssignee(“zhangsan”)//指定委托人
.list();//执行查询
for (Task task : list) {
String taskId = task.getId();
//在完成当前任务时,为下一个任务指定流程变量
Map<String,Object> variables = new HashMap<String, Object>();
variables.put(“day”, “5”);
//完成当前任务时为下一个任务指定变量值
taskService.complete(taskId, variables);//完成任务,使任务进入下一步
//Unknown property used in expression: ${sunzi}
//taskService.complete(taskId);
}
}
[3]创建流程监听器类
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
public class YesListener implements ExecutionListener {
private static final long serialVersionUID = 1L;
@Override
public void notify(DelegateExecution execution) throws Exception {
System.err.println(“YesListener触发了!!!”);
}
}
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
public class NoListener implements ExecutionListener {
private static final long serialVersionUID = 1L;
@Override
public void notify(DelegateExecution execution) throws Exception {
System.err.println(“NoListener触发了!!!”);
}
}
[4]绑定监听器
④操作
- 部署
/**
- 部署
*/
最后
2020年在匆匆忙忙慌慌乱乱中就这么度过了,我们迎来了新一年,互联网的发展如此之快,技术日新月异,更新迭代成为了这个时代的代名词,坚持下来的技术体系会越来越健壮,JVM作为如今是跳槽大厂必备的技能,如果你还没掌握,更别提之后更新的新技术了。
更多JVM面试整理:
}
}
[4]绑定监听器
④操作
- 部署
/**
- 部署
*/
最后
2020年在匆匆忙忙慌慌乱乱中就这么度过了,我们迎来了新一年,互联网的发展如此之快,技术日新月异,更新迭代成为了这个时代的代名词,坚持下来的技术体系会越来越健壮,JVM作为如今是跳槽大厂必备的技能,如果你还没掌握,更别提之后更新的新技术了。
[外链图片转存中…(img-pBkdBFd0-1715551729197)]
更多JVM面试整理:
[外链图片转存中…(img-tfbs0wrz-1715551729198)]