最全Activiti工作流,常见java面试题和答案

最后

如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

[1]act_ge_bytearray表

二进制数据表,存储了流程定义图形的XML文件和图片信息

保存流程定义的xml信息

保存流程定义的图片

[2]act_re_deployment表

部署信息表,存储了部署的相关信息(部署时间)

[3]act_re_procdef表

流程定义数据表,存储了当前流程图形的相关信息(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:创建了新的流程定义需要再次执行部署,再次启动流程。

6.查询任务和7.完成任务


@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面试整理:

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

}

}

[4]绑定监听器

④操作

  • 部署

/**

  • 部署

*/

最后

2020年在匆匆忙忙慌慌乱乱中就这么度过了,我们迎来了新一年,互联网的发展如此之快,技术日新月异,更新迭代成为了这个时代的代名词,坚持下来的技术体系会越来越健壮,JVM作为如今是跳槽大厂必备的技能,如果你还没掌握,更别提之后更新的新技术了。

[外链图片转存中…(img-pBkdBFd0-1715551729197)]

更多JVM面试整理:

[外链图片转存中…(img-tfbs0wrz-1715551729198)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值