Activiti工作流,java面试常用问题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

com.alibaba

druid

1.0.5

org.mybatis.spring.boot

mybatis-spring-boot-starter

1.1.1

org.activiti

activiti-spring-boot-starter-basic

5.21.0

org.springframework.boot

spring-boot-starter

org.springframework.boot

spring-boot-starter-test

特别说明:请把mybatis-spring-boot-starter的依赖放在activiti-spring-boot-starter-basic的前面以避免jar包冲突问题。jar包冲突的表现是:java.lang.ClassNotFoundException: org.apache.ibatis.annotations.Mapper。

依赖顺序和依赖传递的关系: mybatis-spring-boot-starter依赖mybatis-3.4.0.jar,而activiti-spring-boot-starter-basic依赖mybatis-3.3.0.jar,对于这种情况,Maven以顺序靠前的为准。现在如果导入的是mybatis-3.3.0.jar就会抛出异常,而mybatis-3.4.0.jar是正确的,所以要让mybatis-spring-boot-starter的依赖放在activiti-spring-boot-starter-basic的前面。

②主启动类

@SpringBootApplication

public class MainApplication {

public static void main(String[] args) {

SpringApplication.run(MainApplication.class, args);

}

}

③测试类

@RunWith(SpringRunner.class)

@SpringBootTest

public class ProcessTest {

@Autowired

private ProcessEngine processEngine;

@Test

public void createTable() {

System.out.println(processEngine);

}

}

④yml配置

spring:

datasource:

name: mydb

type: com.alibaba.druid.pool.DruidDataSource

url: jdbc:mysql://127.0.0.1:3306/db_activiti

username: root

password: root

driver-class-name: com.mysql.jdbc.Driver

⑤特别操作

在src/main/java目录下创建processes目录,否则将抛出异常:java.io.FileNotFoundException: class path resource [processes/] cannot be resolved to URL because it does not exist。processes目录的作用是存放bpmn流程定义文件,并对bpmn文件进行自动部署。如果创建到src/main/resources目录下则要求processes目录下至少存在一个文件(任意)。

三、流程操作

==================================================================

1.创建第一个流程图


2.流程部署


①Java代码

注意:如果放在processes目录下会被自动部署,下面的Java代码是手动部署。

@RunWith(SpringRunner.class)

@SpringBootTest

public class ProcessTest {

@Autowired

private RepositoryService repositoryService;

@Test

public void test01ProcessDefinitionDeployment() {

//部署:将流程定义文件中流程定义信息存入数据库

repositoryService

.createDeployment() //创建部署构建器对象

.addClasspathResource(“MyProcess.bpmn”) //添加要部署的流程定义文件名

.deploy(); //执行部署

}

}

②数据库表分析

[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.排他网关

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们:

目录:

二面蚂蚁金服(交叉面),已拿offer,Java岗定级阿里P6

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

二面蚂蚁金服(交叉面),已拿offer,Java岗定级阿里P6

Java面试核心知识点

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

ariables = new HashMap<String, Object>();

variables.put(“sunzi”, “lisi”);

//完成当前任务时为下一个任务指定变量值

taskService.complete(taskId, variables);//完成任务,使任务进入下一步

//Unknown property used in expression: ${sunzi}

//taskService.complete(taskId);

}

}

12.排他网关

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们:

目录:

[外链图片转存中…(img-zuZgh1Y4-1713595165617)]

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

[外链图片转存中…(img-Jm82sHVr-1713595165618)]

Java面试核心知识点

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-haqgNyLN-1713595165618)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 23
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flowable是一个开源的工作流引擎,该引擎基于BPMN 2.0标准,并提供了一系列的工作流管理和执行功能。 在Flowable工作流面试中,常见的问题可以包括以下几个方面: 1. Flowable的主要特点是什么? Flowable具有以下主要特点: - 开源且免费,易于获取和使用。 - 支持BPMN 2.0标准,提供了丰富的工作流模型和执行功能。 - 可以与Java和Spring等常见的开发框架无缝集成。 - 支持水平和垂直的可扩展性,可以应对大规模工作流的需求。 - 提供了可视化的工作流设计器,提供了良好的业务流程建模体验。 2. Flowable的核心组件有哪些? Flowable的核心组件包括: - "flowable-engine":工作流引擎,负责流程的部署、实例化、执行和管理。 - "flowable-task":任务管理模块,负责任务的创建、分配、执行和管理。 - "flowable-form":表单管理模块,提供了与任务相关的表单的创建和管理功能。 - "flowable-rest":REST服务模块,提供了与Flowable引擎交互的REST API。 - "flowable-ui":可视化工作流管理和监控的用户界面。 3. Flowable工作流的部署方式有哪些? Flowable工作流的部署方式包括: - 通过编程API进行部署,使用Java代码将工作流模型部署到Flowable引擎中。 - 通过Flowable设计器进行部署,使用可视化的设计器创建和导出BPMN文件,再将文件部署到引擎中。 - 通过命令行工具进行部署,使用Flowable提供的命令行工具将BPMN文件部署到引擎中。 - 通过REST API进行部署,使用Flowable提供的REST API将BPMN文件上传到引擎中进行部署。 4. Flowable工作流的执行过程是怎样的? Flowable工作流的执行过程包括以下几个步骤: - 部署工作流模型:将工作流模型部署到引擎中,生成相应的流程定义。 - 创建流程实例:基于流程定义,创建一个流程实例,可以进行启动和暂停操作。 - 运行流程:按照流程定义的节点顺序,逐个执行工作流的各个节点,包括任务的创建、分配、执行和完成。 - 监控工作流:可以通过Flowable提供的工作流管理界面或API,实时监控工作流的执行情况和任务状态。 - 完成工作流:当工作流执行到最后一个节点时,流程实例将被标记为已完成,流程结束。 以上是对Flowable工作流面试题的简要回答,希望能帮到您。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值