2024年Activiti6(4),2024最新腾讯Java高级面试题总结

Ending

Tip:由于文章篇幅有限制,下面还有20个关于MySQL的问题,我都复盘整理成一份pdf文档了,后面的内容我就把剩下的问题的目录展示给大家看一下

如果觉得有帮助不妨【转发+点赞+关注】支持我,后续会为大家带来更多的技术类文章以及学习类文章!(阿里对MySQL底层实现以及索引实现问的很多)

吃透后这份pdf,你同样可以跟面试官侃侃而谈MySQL。其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。

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

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

identityService.setAuthenticatedUserId(null);

}

引擎自动操作如下:

  • act_ru_execution 表 START_USER_ID字段 插入用户id

  • 引擎会记录启动人信息,在ACT_HI_PROINST表的START_USER_ID字段,记录用户id “zs”.

在这里插入图片描述

  • 2.查询我发起的时候,输入用户id

List list = historyService.createHistoricProcessInstanceQuery()

.startedBy(“zs”).list();

实际是执行如下的sql

SELECT DISTINCT

RES.*,

DEF.KEY_ AS PROC_DEF_KEY_,

DEF.NAME_ AS PROC_DEF_NAME_,

DEF.VERSION_ AS PROC_DEF_VERSION_,

DEF.DEPLOYMENT_ID_ AS DEPLOYMENT_ID_

FROM

ACT_HI_PROCINST RES

LEFT OUTER JOIN ACT_RE_PROCDEF DEF ON RES.PROC_DEF_ID_ = DEF.ID_

WHERE

RES.START_USER_ID_ = ‘zs’

ORDER BY

RES.ID_ ASC

LIMIT ‘2147483647’ OFFSET ‘0’

备注:

createHistoricProcessInstanceQuery finished–> 完成的流程; unfinish —>

还在运行中的流程

【流程】与我相关的流程

List list = historyService

.createHistoricProcessInstanceQuery().involvedUser(“zs”).list();

实际sql

SELECT DISTINCT

RES.*,

DEF.KEY_ AS PROC_DEF_KEY_,

DEF.NAME_ AS PROC_DEF_NAME_,

DEF.VERSION_ AS PROC_DEF_VERSION_,

DEF.DEPLOYMENT_ID_ AS DEPLOYMENT_ID_

FROM

ACT_HI_PROCINST RES

LEFT OUTER JOIN ACT_RE_PROCDEF DEF ON RES.PROC_DEF_ID_ = DEF.ID_

WHERE

( EXISTS ( SELECT LINK.USER_ID_ FROM

ACT_HI_IDENTITYLINK LINK WHERE USER_ID_ = ‘zs’ AND LINK.PROC_INST_ID_ = RES.ID_ ) )

ORDER BY

RES.ID_ ASC

LIMIT ‘2147483647’ OFFSET ‘0’

【任务】我的待办任务

String assignee = “zs”;

List list = taskService()//与正在执行的任务管理相关的Service

.createTaskQuery()//创建任务查询对象

.taskAssignee(assignee)//指定个人任务查询,指定办理人

.orderByTaskCreateTime().asc()//使用创建时间的升序排列

/*返回结果集/

.list();//返回列表

if (list != null && list.size() > 0) {

for (Task task : list) {

System.out.println(“任务ID:” + task.getId());

System.out.println(“任务名称:” + task.getName());

System.out.println(“任务的创建时间:” + task.getCreateTime());

System.out.println(“任务的办理人:” + task.getAssignee());

System.out.println(“流程实例ID:” + task.getProcessInstanceId());

System.out.println(“执行对象ID:” + task.getExecutionId());

System.out.println(“流程定义ID:” + task.getProcessDefinitionId());

System.out.println(task.toString());

System.out.println(“########################################################”);

}

}

【任务】我的已办任务

List list = historyService.createHistoricTaskInstanceQuery()

.taskAssignee(“zs”)

.finished()// 已完成

.list();

【任务】修改任务审核人

taskEntity.setAssignee(assignee);

historyManager.recordTaskAssigneeChange(delegateTask.getId(), assignee);

【批注】添加批注

try {

Authentication.setAuthenticatedUserId(“zs”);//批注人的名称 一定要写,不然查看的时候不知道人物信息

String taskId = “21”; // 任务id;

Task task = taskService.createTaskQuery().taskId(taskId).singleResult();

String processInstanceId = task.getProcessInstanceId(); // 实例id

String type = “comment”; // 批注类型,这个参数如果不写默认就是"comment",用于扩展 用的。

String message = “同意起飞同意”; // 批注内容

// 给当前任务添加批注信息

taskService.addComment(taskId, processInstanceId, type, message);

} finally {

Authentication.setAuthenticatedUserId(null);

}

INSERT INTO

ACT_HI_COMMENT ( ID_, TYPE_, TIME_, USER_ID_,

TASK_ID_, PROC_INST_ID_, ACTION_, MESSAGE_, FULL_MSG_ )

VALUES

( ‘7503’, ‘comment’, ‘2020-11-26 11:42:39.908’, ‘zs’,

‘21’, ‘8’, ‘AddComment’, ‘同意起飞同意’, ‘java.io.ByteArrayInputStream@6b2042de’

)

【批注】获取批注

  • 1.根据实例id获取批注

List processInstanceComments = taskService.getProcessInstanceComments(processInstanceId);

实际sql

select * from ACT_HI_COMMENT where PROC_INST_ID_ = ‘8’ order by TIME_ desc

  • 2、根据任务id获取批注

List taskComments = taskService.getTaskComments(taskId);

select * from ACT_HI_COMMENT where TASK_ID_ = ‘21’ and TYPE_ = ‘comment’ order by TIME_ desc

【附件】创建附件

try {

Authentication.setAuthenticatedUserId(“zs”);//批注人的名称 一定要写,不然查看的时候不知道人物信息

String attachmentType = “”;

String taskId = “21”; // 任务id

String processInstanceId = “8”; // 任务实例id

String attachmentName = “test.png”; // 附件名称

String attachmentDescription = “描述描述”; // 附件描述

String url = “www.baidu.com/a.png”;

taskService.createAttachment(attachmentType, taskId, processInstanceId, attachmentName, attachmentDescription, url);

} finally {

Authentication.setAuthenticatedUserId(null);

}

INSERT INTO

ACT_HI_COMMENT ( ID_, TYPE_, TIME_, USER_ID_, TASK_ID_, PROC_INST_ID_,

ACTION_, MESSAGE_, FULL_MSG_ )

VALUES

( ‘10002’, ‘event’, ‘2020-11-26 11:57:30.691’, ‘zs’, ‘21’, ‘8’,

‘AddAttachment’, ‘test.png’, ‘null’ )

INSERT INTO

ACT_HI_ATTACHMENT ( ID_, REV_, USER_ID_, NAME_,

DESCRIPTION_, TYPE_, TASK_ID_, PROC_INST_ID_, URL_, CONTENT_ID_, TIME_ )

VALUES

( ‘10001’, 1, ‘zs’, ‘test.png’,

‘描述描述’, ‘’, ‘21’, ‘8’, ‘www.baidu.com/a.png’, ‘null’, ‘2020-11-26 11:57:30.668’

)

【附件】获取附件

  • 1.根据流程实例ID查询附件

// 根据流程实例ID查询附件

List processInstanceAttachments = taskService.getProcessInstanceAttachments(“8”);

// 实际sql

select * from ACT_HI_ATTACHMENT where PROC_INST_ID_ = ‘8’ order by TIME_ desc

  • 2.根据任务ID查询附件

// 根据任务ID查询附件

List attachments= taskService.getTaskAttachments(“21”);

// 实际sql

select * from ACT_HI_ATTACHMENT where TASK_ID_ = ‘21’ order by TIME_ desc

【常用方法】

尽量都是没什么限制的全局可用方法。

获取CommandContext(全局任意地方使用)

这个很方便可以在任意地方使用,service,自定义事件,自定义命令中等等

//import org.activiti.engine.impl.context.Context;

CommandContext commandContext = Context.getCommandContext();

HistoryManager historyManager = commandContext.getHistoryManager();

获取当前任务节点

//import org.activiti.engine.impl.context.Context;

CommandContext commandContext = Context.getCommandContext();

获取任务实例管理类

TaskEntityManager taskEntityManager = commandContext.getTaskEntityManager();

获取当前任务实例

TaskEntity currentTask = taskEntityManager.findById(taskId);

ExecutionEntity execution = currentTask.getExecution();

String executionId = execution.getId();

获取流程定义

Process process = ProcessDefinitionUtil.getProcess(processDefinitionId);

根据节点id获取FlowElement节点对象

FlowElement flowElement = process.getFlowElement(targetNodeId);

设置执行实例的当前活动节点为目标节点

execution.setCurrentFlowElement(flowElement);

向operations中压入继续流程的操作类

commandContext.getAgenda().planContinueProcessOperation(execution);

删除任务

可用用内置的删除命令

org.activiti.engine.impl.cmd。DeleteTaskCmd

public DeleteTaskCmd(String taskId, String deleteReason, boolean cascade) {

this.taskId = taskId;

this.cascade = cascade;

this.deleteReason = deleteReason;

}

public DeleteTaskCmd(Collection taskIds, String deleteReason, boolean cascade) {

this.taskIds = taskIds;

this.cascade = cascade;

this.deleteReason = deleteReason;

}

// 执行方式1

new DeleteTaskCmd(delegateTask.getId(), null).execute(Context.getCommandContext());// 执行完成命令

// 执行方式2

processEngine.getManagementService().executeCommand(cmd)

完成任务

内置的CompleteTaskCmd命令,还有很多类似的,待挖掘

new CompleteTaskCmd(delegateTask.getId(), null).execute(Context.getCommandContext());// 执行完成命令

// 执行方式2

processEngine.getManagementService().executeCommand(cmd)

获取流程定义的start节点

Process process = ProcessDefinitionUtil.getProcess(processDefinitionId);

FlowElement flowElement = process.getInitialFlowElement();

FlowNode startActivity = (FlowNode) flowElement;

获取流程定义的第一个节点

/**

  • 获得第一个节点.

*/

public FlowNode findFirstActivity(String processDefinitionId) {

Process process = ProcessDefinitionUtil.getProcess(processDefinitionId);

FlowElement flowElement = process.getInitialFlowElement();

FlowNode startActivity = (FlowNode) flowElement;

if (startActivity.getOutgoingFlows().size() != 1) {

throw new IllegalStateException(

"start activity outgoing transitions cannot more than 1, now is : "

  • startActivity.getOutgoingFlows().size());

}

SequenceFlow sequenceFlow = startActivity.getOutgoingFlows()

.get(0);

FlowNode targetActivity = (FlowNode) sequenceFlow.getTargetFlowElement();

最后

分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。

这些面试题相对应的技术点:

  • JVM
  • MySQL
  • Mybatis
  • MongoDB
  • Redis
  • Spring
  • Spring boot
  • Spring cloud
  • Kafka
  • RabbitMQ
  • Nginx

大类就是:

  • Java基础
  • 数据结构与算法
  • 并发编程
  • 数据库
  • 设计模式
  • 微服务
  • 消息中间件

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

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

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

  • MongoDB
  • Redis
  • Spring
  • Spring boot
  • Spring cloud
  • Kafka
  • RabbitMQ
  • Nginx

大类就是:

  • Java基础
  • 数据结构与算法
  • 并发编程
  • 数据库
  • 设计模式
  • 微服务
  • 消息中间件

[外链图片转存中…(img-8PZB3WWD-1714834790870)]

[外链图片转存中…(img-tZB2YxK5-1714834790871)]

[外链图片转存中…(img-Sv7hmD2c-1714834790871)]

[外链图片转存中…(img-UOmgFYKR-1714834790872)]

[外链图片转存中…(img-uy8HyZvo-1714834790872)]

[外链图片转存中…(img-9nTxUadD-1714834790873)]

[外链图片转存中…(img-iaB5V3ZB-1714834790873)]

[外链图片转存中…(img-GrFz4HIL-1714834790874)]

[外链图片转存中…(img-UNY4F2Jm-1714834790874)]

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

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

  • 28
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Activiti工作流的面试中,可能会涉及到以下几个问: 1. RepositoryService、RuntimeService、TaskService、HistoryService分别表示什么操作? - RepositoryService用于管理和操作流程定义,比如获取流程定义、部署流程定义等。 - RuntimeService用于管理和操作流程实例,比如启动流程实例、暂停或激活流程实例等。 - TaskService用于管理和操作任务,比如创建任务、完成任务、指派任务给用户等。 - HistoryService用于管理和查询历史数据,比如查询已完成的任务、查询流程实例的历史记录等。 2. 请解释一下userTask元素的含义和用法。 userTask元素是Activiti中的一个任务节点,用于表示一个需要用户处理的任务。在userTask元素中,可以使用assignee属性指定任务的负责人,使用dueDate属性指定任务的截止日期。例如,`<userTask id="task" activiti:assignee="${user}" activiti:dueDate="${now()}"> </userTask>`表示一个任务节点,负责人由`${user}`动态指定,截止日期为`${now()}`动态计算的当前时间。 3. 请解释一下serviceTask元素的含义和用法。 serviceTask元素是Activiti中的一个服务任务节点,用于表示一个需要执行某个服务的任务。在serviceTask元素中,可以使用expression属性指定需要执行的服务的表达式,使用collection属性指定服务需要处理的集合,使用isSequential属性指定集合的处理方式是否为顺序执行,使用elementVariable属性指定集合中的元素变量。例如,`<serviceTask id="serviceTask" activiti:expression="${myList}" activiti:collection="item" activiti:isSequential="false" activiti:elementVariable="item"> </serviceTask>`表示一个服务任务节点,执行`${myList}`所指定的服务,处理集合为`${item}`,集合的处理方式为非顺序执行,集合中的元素变量为`item`。 这些是Activiti工作流面试中可能会涉及到的一些问和相关知识点。希望对你有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Activiti工作流面试相关知识](https://download.csdn.net/download/grabungen/10260534)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Activiti开源工作流引擎面试](https://blog.csdn.net/yangzhihua/article/details/130557445)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值