面试资料整理汇总
这些面试题是我朋友进阿里前狂刷七遍以上的面试资料,由于面试文档很多,内容更多,没有办法一一为大家展示出来,所以只好为大家节选出来了一部分供大家参考。
面试的本质不是考试,而是告诉面试官你会做什么,所以,这些面试资料中提到的技术也是要学会的,不然稍微改动一下你就凉凉了
在这里祝大家能够拿到心仪的offer!
输出内容:
启动流程实例涉及到的表结构
act_hi_actinst 流程实例执行历史
act_hi_identitylink 流程的参与用户的历史信息
act_hi_procinst 流程实例历史信息
act_hi_taskinst 流程任务历史信息
act_ru_execution 流程执行信息
act_ru_identitylink 流程的参与用户信息
act_ru_task 任务信息
流程启动后,任务的负责人就可以查询自己当前能够处理的任务了,查询出来的任务都是当前用户的待办任务
/**
- 任务查询
*/
@Test
public void test06(){
String assignee =“zhansan”;
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 任务查询 需要获取一个 TaskService 对象
TaskService taskService = engine.getTaskService();
// 根据流程的key和任务负责人 查询任务
List list = taskService.createTaskQuery()
.processDefinitionKey(“evection”)
.taskAssignee(assignee)
.list();
// 输出当前用户具有的任务
for (Task task : list) {
System.out.println(“流程实例id:” + task.getProcessInstanceId());
System.out.println(“任务id:” + task.getId());
System.out.println(“任务负责人:” + task.getAssignee());
System.out.println(“任务名称:” + task.getName());
}
}
输出结果
任务负责人查询出来了待办的人,选择任务进行处理,完成任务
/**
- 流程任务的处理
*/
@Test
public void test07(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = engine.getTaskService();
Task task = taskService.createTaskQuery()
.processDefinitionKey(“evection”)
.taskAssignee(“zhansan”)
.singleResult();
// 完成任务
taskService.complete(task.getId());
}
zhangsan处理了这个操作后,流程就流转到了 lisi处
然后就是不同的用户登录,然后查询任务处理任务,直到任务流程走完。
查询流程相关的信息,包括流程的定义,流程的部署,流程定义的版本
/**
- 查询流程的定义
*/
@Test
public void test08(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = engine.getRepositoryService();
// 获取一个 ProcessDefinitionQuery对象 用来查询操作
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
List list = processDefinitionQuery.processDefinitionKey(“evection”)
.orderByProcessDefinitionVersion() // 安装版本排序
.desc() // 倒序
.list();
// 输出流程定义的信息
for (ProcessDefinition processDefinition : list) {
System.out.println(“流程定义的ID:” + processDefinition.getId());
System.out.println(“流程定义的name:” + processDefinition.getName());
System.out.println(“流程定义的key:” + processDefinition.getKey());
System.out.println(“流程定义的version:” + processDefinition.getVersion());
System.out.println(“流程部署的id:” + processDefinition.getDeploymentId());
}
}
输出结果
流程定义的ID:evection:1:12504
流程定义的name:出差申请单
流程定义的key:evection
流程定义的version:1
流程部署的id:12501
/**
- 删除流程
*/
@Test
public void test09(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = engine.getRepositoryService();
// 删除流程定义,如果该流程定义已经有了流程实例启动则删除时报错
repositoryService.deleteDeployment(“12501”);
// 设置为TRUE 级联删除流程定义,及时流程有实例启动,也可以删除,设置为false 非级联删除操作。
//repositoryService.deleteDeployment(“12501”,true);
}
注意:项目开发中级联删除操作的权限一般只开发给超级管理员使用。
现在我们的流程资源文件已经上传到了数据库中,如果其他用户想要查看这些资源,可以从数据库中把这些资源下载到本地。
解决方案:
-
jdbc对blob类型处理clob类型数据读取出来就可以了。
-
使用activiti的api来实现操作。
使用activiti的api来操作我们需要添加commons-io的依赖
commons-io
commons-io
2.6
实现代码
/**
- 读取数据库中的资源文件
*/
@Test
public void test10() throws Exception{
// 1.得到ProcessEngine对象
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 2.获取RepositoryService对象
RepositoryService repositoryService = engine.getRepositoryService();
// 3.得到查询器
ProcessDefinition definition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(“evection”)
.singleResult();
// 4.获取流程部署的id
String deploymentId = definition.getDeploymentId();
// 5.通过repositoryService对象的相关方法 来获取图片信息和bpmn信息
// png图片
InputStream pngInput = repositoryService
.getResourceAsStream(deploymentId, definition.getDiagramResourceName());
// bpmn 文件的流
InputStream bpmnInput = repositoryService
.getResourceAsStream(deploymentId, definition.getResourceName());
// 6.文件的保存
File filePng = new File(“d:/evection.png”);
File fileBpmn = new File(“d:/evection.bpmn”);
OutputStream pngOut = new FileOutputStream(filePng);
OutputStream bpmnOut = new FileOutputStream(fileBpmn);
IOUtils.copy(pngInput,pngOut);
IOUtils.copy(bpmnInput,bpmnOut);
pngInput.close();
pngOut.close();
bpmnInput.close();
bpmnOut.close();
}
即使流程定义已经被删除了,流程执行的实例信息通过前面的分析,依然保存在Activiti的act_hi_* 的相关表结构中,所以我们还是可以查询流程的执行的历史信息,可以通过HistoryService来查看
/**
- 流程历史信息查看
*/
@Test
public void test11(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 查看历史信息我们需要通过 HistoryService来实现
HistoryService historyService = engine.getHistoryService();
// 获取 actinst 表的查询对象
HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
instanceQuery.processDefinitionId(“evection:1:12504”);
instanceQuery.orderByHistoricActivityInstanceStartTime().desc();
List list = instanceQuery.list();
// 输出查询的结果
for (HistoricActivityInstance hi : list) {
System.out.println(hi.getActivityId());
System.out.println(hi.getActivityName());
System.out.println(hi.getActivityType());
System.out.println(hi.getAssignee());
System.out.println(hi.getProcessDefinitionId());
System.out.println(hi.getProcessInstanceId());
System.out.println(“-----------------------”);
}
}
输出结果
usertask3
总经理审批
userTask
wangwu
evection:1:12504
15001
usertask2
经理审批
userTask
lisi
evection:1:12504
15001
usertask1
创建请假单
userTask
zhansan
evection:1:12504
15001
startevent1
Start
startEvent
null
evection:1:12504
15001
最后我们该如何学习?
1、看视频进行系统学习
这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
另外,我自己也珍藏了好几套视频资料躺在网盘里,有需要的我也可以分享给你:
2、读源码,看实战笔记,学习大神思路
“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。
Spring源码深度解析:
Mybatis 3源码深度解析:
Redis学习笔记:
Spring Boot核心技术-笔记:
3、面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:
只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。
人生短暂,别稀里糊涂的活一辈子,不要将就。
g-O2GCotMp-1715769784843)]
Redis学习笔记:
[外链图片转存中…(img-Xq8MIWTi-1715769784844)]
Spring Boot核心技术-笔记:
[外链图片转存中…(img-7OOqck7e-1715769784844)]
3、面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:
[外链图片转存中…(img-niE0i6De-1715769784845)]
只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。
人生短暂,别稀里糊涂的活一辈子,不要将就。