工作流之Flowable与SpringBoot结合
文章目录
- 1 Flowable
- 1.1 flowable-ui部署运行
- 1.2 绘制流程图
- 1.2.1 绘制
- 1.2.2 绘图细节
- 1.2.3 bpmn文件导入
- 1.3 后台项目搭建
- 1.3.1 pom.xml
- 1.3.2 数据库表说明
- 1.4 流程引擎API与服务
- 1.4.1 主要API
- 1.4.2 示例
1 Flowable
1.1 flowable-ui部署运行
flowable-6.6.0
运行 官方demo
参考文档:https://flowable.com/open-source/docs/bpmn/ch14-Applications/
分享牛Flowable文档汉化:https://github.com/qiudaoke/flowable-userguide
华格瑞沙 https://www.cnblogs.com/yangjiming/p/10938515.html
部署步骤:
-
从官网下载flowable-6.6.0 : https://github.com/flowable/flowable-engine/releases/download/flowable-6.6.0/flowable-6.6.0.zip
-
将压缩包中的
flowable-6.6.0\wars\flowable-ui.war
丢到Tomcat中跑起来 -
打开
http://localhost:8080/flowable-ui
用账户:admin/test 登录
-
进入
APP.MODELER
创建流程,之后可以导出流程到项目中使用,或者配置apache-tomcat-9.0.37\webapps\flowable-ui\WEB-INF\classes\flowable-default.properties
连接本地数据库
注意
:需要将java驱动jar(mysql-connector-java-5.1.45.jar)复制到 apache-tomcat-9.0.37\webapps\flowable-rest\WEB-INF\lib
,这样创建的流程后端程序就能直接使用
1.2 绘制流程图
1.2.1 绘制
根据业务需要在 flowable-ui -> APP.MODELER
里面绘制流程图,示例如上图。先解释一些概念。
- 事件(
event
):通常用于为流程生命周期中发生的事情建模,图里是【开始、结束
】两个圈。 - 顺序流(
sequence flow
):是流程中两个元素间的连接器。图里是【箭头线段
】。 - 网关(
gateway
):用于控制执行的流向。图里是【菱形(中间有X)
】 - 用户任务(
user task
):用于对需要人工执行的任务进行建模。图里是【矩形
】。
简单的工作流大概就这些元素(还有很多这里就不扩展了)。下面描述一下工作流是如何流动的。
首先启动了工作流后,由【开始】节点自动流向【学生】节点,等待该任务执行。任务被分配的学生用户执行后流向 【老师】节点,再次等待该任务执行。被分配的老师用户执行后流向 【网关】,网关以此检查每个出口,流向符合条件的任务,比如这里老师执行任务时是同意,就流向【校长】节点,等待该任务执行。执行后跟老师类似,同意后就流向【结束】节点,整个流程到此结束。
1.2.2 绘图细节
保留流程模型
顺序流可以设置流条件来限制流动,比如上面的网关出口就设置了条件
任务需要分配任务的执行用户,可以分配到候选组,也可以直接分配到候选人
最后导出工作流文件
文件内容
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-insmtece" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef"><process id="leave_approval" name="请假审批" isExecutable="true"><startEvent id="start" name="开始" flowable:initiator="startuser" flowable:formFieldValidation="true"></startEvent><userTask id="stu_task" name="学生" flowable:candidateGroups="stu_group" flowable:formFieldValidation="true"></userTask><sequenceFlow id="flow1" sourceRef="start" targetRef="stu_task"></sequenceFlow><userTask id="te_task" name="老师" flowable:candidateGroups="te_group" flowable:formFieldValidation="true"></userTask><exclusiveGateway id="getway1" name="网关1"></exclusiveGateway><userTask id="mte_task" name="校长" flowable:candidateGroups="mte_group" flowable:formFieldValidation="true"></userTask><exclusiveGateway id="getway2" name="网关2"></exclusiveGateway><endEvent id="end" name="结束"></endEvent><sequenceFlow id="flow1" name="请假" sourceRef="stu_task" targetRef="te_task" skipExpression="${command=='agree'}"></sequenceFlow><sequenceFlow id="flow3_1" name="同意" sourceRef="getway1" targetRef="mte_task"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${command=='agree'}]]></conditionExpression></sequenceFlow><sequenceFlow id="flow2" name="审批" sourceRef="te_task" targetRef="getway1"></sequenceFlow><sequenceFlow id="flow3_2" name="拒绝" sourceRef="getway1" targetRef="stu_task"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${command=='refuse'}]]></conditionExpression></sequenceFlow><sequenceFlow id="flow4" name="审批" sourceRef="mte_task" targetRef="getway2"></sequenceFlow><sequenceFlow id="flow4_1" name="同意" sourceRef="getway2" targetRef="end" skipExpression="${command=='free'}"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${command=='agree'}]]></conditionExpression></sequenceFlow><sequenceFlow id="flow4_2" name="拒绝" sourceRef="getway2" targetRef="stu_task"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${command=='refuse'}]]></conditionExpression></sequenceFlow></process><bpmndi:BPMNDiagram id="BPMNDiagram_leave_approval">这里先省略</bpmndi:BPMNDiagram>
</definitions>
1.2.3 bpmn文件导入
如果需要,可以把这个流程文件下载下来,直接导入使用
1.3 后台项目搭建
后台项目基于jdk8,使用springboot框架
1.3.1 pom.xml
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.0.RELEASE</version><relativePath/> <!-- lookup parent from repository -->
</parent>
项目依赖pom.xml<dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</artifactId><version>6.6.0</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.45</version>
</dependency>
项目配置application.yml
spring:datasource:url: jdbc:mysql://localhost:3306/flowable?useSSL=false&characterEncoding=UTF-8&serverTimezone=GMT%2B8driver-class-name: com.mysql.jdbc.Driverusername: xxxxpassword: xxxx
1.3.2 数据库表说明
Flowable
的所有数据库表都以ACT_
开头。第二部分是说明表用途的两字符标示符。服务API的命名也大略符合这个规则。
Flowable
建表机制:
- 自动创建表:
Flowable
在引擎配置中设置了数据库表的自动创建机制。只要引擎启动并连接到数据库,它会检查表是否存在。如果不存在,Flowable
会根据其内部的数据库脚本创建这些表。 - 配置选项:可以在
Flowable
的配置文件中通过databaseSchemaUpdate
属性来配置数据库表的创建和更新行为。true 或 create-drop
:引擎启动时创建表,停止时删除表(通常用于测试环境)。false
:不自动创建表,需要手动创建。create
:如果表不存在则创建。drop-create
:如果表存在则删除,然后创建。
各个表说明:
-
ACT_RE_
:RE
代表repository。带有这个前缀的表包含静态
信息,例如流程定义与流程资源(图片、规则等)。 -
ACT_RU_
:RU
代表runtime。这些表存储运行时信息,例如流程实例(process instance)、用户任务(user task)、变量(variable)、作业(job)等。Flowable只在流程实例运行中保存运行时数据,并在流程实例结束时删除记录。这样保证运行时表小和快。 -
ACT_HI_
:HI
代表history。这些表存储历史数据,例如已完成的流程实例、变量、任务等。 -
ACT_GE_
:通用数据。在多处使用。 -
通用数据表(2个)
act_ge_bytearray:二进制数据表,如流程定义、流程模板、流程图的字节流文件;
act_ge_property:属性数据表(不常用); -
历史表(8个,HistoryService接口操作的表)
act_hi_actinst:历史节点表,存放流程实例运转的各个节点信息(包含开始、结束等非任务节点);
act_hi_attachment:历史附件表,存放历史节点上传的附件信息(不常用);
act_hi_comment:历史意见表;
act_hi_detail:历史详情表,存储节点运转的一些信息(不常用);
act_hi_identitylink:历史流程人员表,存储流程各节点候选、办理人员信息,常用于查询某人或部门的已办任务;
act_hi_procinst:历史流程实例表,存储流程实例历史数据(包含正在运行的流程实例);
act_hi_taskinst:历史流程任务表,存储历史任务节点;
act_hi_varinst:流程历史变量表,存储流程历史节点的变量信息; -
用户相关表(4个,IdentityService接口操作的表)
act_id_group:用户组信息表,对应节点选定候选组信息;
act_id_info:用户扩展信息表,存储用户扩展信息;
act_id_membership:用户与用户组关系表;
act_id_user:用户信息表,对应节点选定办理人或候选人信息; -
流程定义、流程模板相关表(3个,RepositoryService接口操作的表)
act_re_deployment:部属信息表,存储流程定义、模板部署信息;
act_re_procdef:流程定义信息表,存储流程定义相关描述信息,但其真正内容存储在act_ge_bytearray表中,以字节形式存储;
act_re_model:流程模板信息表,存储流程模板相关描述信息,但其真正内容存储在act_ge_bytearray表中,以字节形式存储; -
流程运行时表(6个,RuntimeService接口操作的表)
act_ru_task:运行时流程任务节点表,存储运行中流程的任务节点信息,重要,常用于查询人员或部门的待办任务时使用;
act_ru_event_subscr:监听信息表,不常用;
act_ru_execution:运行时流程执行实例表,记录运行中流程运行的各个分支信息(当没有子流程时,其数据与act_ru_task表数据是一一对应的);
act_ru_identitylink:运行时流程人员表,重要,常用于查询人员或部门的待办任务时使用;
act_ru_job:运行时定时任务数据表,存储流程的定时任务信息;
act_ru_variable:运行时流程变量数据表,存储运行中的流程各节点的变量信息;
1.4 流程引擎API与服务
1.4.1 主要API
引擎API是与Flowable交互的最常用手段。总入口点是ProcessEngine。
说明:
RepositoryService
:很可能是使用Flowable
引擎要用的第一个服务。这个服务提供了管理与控制部署(deployments)与流程定义(process definitions)的操作。管理静态信息,RuntimeService
:用于启动流程定义的新流程实例。IdentityService
:很简单,它用于管理(创建,更新,删除,查询……)组与用户。FormService
:是可选服务。也就是说Flowable没有它也能很好地运行,而不必牺牲任何功能。HistoryService
:暴露Flowable引擎收集的所有历史数据。要提供查询历史数据的能力。ManagementService
:通常在用Flowable编写用户应用时不需要使用。它可以读取数据库表与表原始数据的信息,也提供了对作业(job)的查询与管理操作。DynamicBpmnService
:可用于修改流程定义中的部分内容,而不需要重新部署它。例如可以修改流程定义中一个用户任务的办理人设置,或者修改一个服务任务中的类名。
1.4.2 示例
接下来使用之前的请假流程图,上代码
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.HistoryService;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.runtime.Execution;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.idm.api.Group;
import org.flowable.idm.api.User;
import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.springframework.beans.factory.annotation.Autowired;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;/*** TestFlowable*/
@Slf4j
public class TestFlowable {@Autowiredprivate RepositoryService repositoryService;@Autowiredprivate RuntimeService runtimeService;@Autowiredprivate HistoryService historyService;@Autowiredprivate org.flowable.engine.TaskService taskService;@Autowiredprivate org.flowable.engine.IdentityService identityService;public void createDeploymentZip() {/** Step 1: 部署xml(压缩到zip形式,直接xml需要配置相对路径,麻烦,暂不用)*/try {File zipTemp = new File("f:/leave_approval.bpmn20.zip");ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipTemp));Deployment deployment = repositoryService.createDeployment().addZipInputStream(zipInputStream).deploy();log.info("部署成功:{}", deployment.getId());} catch (FileNotFoundException e) {e.printStackTrace();}/** Step 2: 查询部署的流程定义*/List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().processDefinitionKey("leave_approval").list();List<ProcessDefinition> pages = repositoryService.createProcessDefinitionQuery().processDefinitionKey("leave_approval").listPage(1, 30);/** Step 3: 启动流程,创建实例*/String processDefinitionKey = "leave_approval";//流程定义的key,对应请假的流程图String businessKey = "schoolleave";//业务代码,根据自己的业务用Map<String, Object> variablesDefinition = new HashMap<>();//流程变量,可以自定义扩充ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variablesDefinition);log.info("启动成功:{}", processInstance.getId());/** Step 4: 查询指定流程所有启动的实例列表* 列表,或 分页 删除*/List<Execution> executions = runtimeService.createExecutionQuery().processDefinitionKey("leave_approval").list();List<Execution> executionPages = runtimeService.createExecutionQuery().processDefinitionKey("leave_approval").listPage(1, 30);
// runtimeService.deleteProcessInstance(processInstanceId, deleteReason); //删除实例/** Step 5: 学生查询可以操作的任务,并完成任务*/String candidateGroup = "stu_group"; //候选组 xml文件里面的 flowable:candidateGroups="stu_group"List<Task> taskList = taskService.createTaskQuery().taskCandidateGroup(candidateGroup).orderByTaskCreateTime().desc().list();for (Task task : taskList) {// 申领任务taskService.claim(task.getId(), "my");// 完成taskService.complete(task.getId());}/** Step 6: 老师查询可以操作的任务,并完成任务*/String candidateGroupTe = "te_group"; //候选组 xml文件里面的 flowable:candidateGroups="te_group"List<Task> taskListTe = taskService.createTaskQuery().taskCandidateGroup(candidateGroupTe).orderByTaskCreateTime().desc().list();for (Task task : taskListTe) {// 申领任务taskService.claim(task.getId(), "myte");// 完成Map<String, Object> variables = new HashMap<>();variables.put("command","agree"); //携带变量,用于网关流程的条件判定,这里的条件是同意taskService.complete(task.getId(), variables);}/** Step 7: 历史查询,因为一旦流程执行完毕,活动的数据都会被清空,上面查询的接口都查不到数据,但是提供历史查询接口*/// 历史流程实例List<HistoricProcessInstance> historicProcessList = historyService.createHistoricProcessInstanceQuery().processDefinitionKey("leave_approval").list();// 历史任务List<HistoricTaskInstance> historicTaskList = historyService.createHistoricTaskInstanceQuery().processDefinitionKey("leave_approval").list();// 实例历史变量 , 任务历史变量// historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstanceId);// historyService.createHistoricVariableInstanceQuery().taskId(taskId);// *****************************************************分隔符********************************************************************// *****************************************************分隔符********************************************************************// 可能还需要的API// 移动任务,人为跳转任务// runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId)// .moveActivityIdTo(currentActivityTaskId, newActivityTaskId).changeState();// 如果在数据库配置了分组和用户,还会用到List<User> users = identityService.createUserQuery().list(); //用户查询,用户id对应xml 里面配置的用户List<Group> groups = identityService.createGroupQuery().list(); //分组查询,分组id对应xml 里面配置的分组 如 stu_group,te_group 在表里是id的值// 另外,每个查询后面都可以拼条件,内置恁多查询,包括模糊查询,大小比较都有}
}
相关文章:

工作流之Flowable与SpringBoot结合
文章目录 1 Flowable1.1 flowable-ui部署运行1.2 绘制流程图1.2.1 绘制1.2.2 绘图细节1.2.3 bpmn文件导入 1.3 后台项目搭建1.3.1 pom.xml1.3.2 数据库表说明 1.4 流程引擎API与服务1.4.1 主要API1.4.2 示例 1 Flowable 1.1 flowable-ui部署运行 flowable-6.6.0 运行 官方dem…...

python实战:数据分析基础知识
当涉及到数据分析和统计建模时,Python 提供了强大的工具和库,如 pandas、numpy、statsmodels 和 matplotlib。本文将以一个实际的案例为例,介绍如何利用这些工具进行回归分析,并通过可视化工具进行结果展示和解释。 1. 背景介绍 …...

Grafana深入讲解
Grafana 深入讲解 目录 概述Grafana 基本概念 2.1 Grafana 简介2.2 Grafana 功能特性2.3 Grafana 架构 Grafana 安装与配置 3.1 安装 Grafana3.2 配置 Grafana3.3 验证 Grafana 安装 Grafana 数据源 4.1 支持的数据源类型4.2 添加数据源4.3 配置 Prometheus 数据源 Grafana 仪…...

002 git
下载 使用git clone命令下载特定分支 打开终端或命令行界面。 使用cd命令切换到你想存放仓库副本的本地目录。 使用以下命令克隆仓库的develop分支到本地(注意替换<仓库URL>为实际的仓库URL): git clone -b develop --single-branch…...

MySQL --- 用户管理
一、用户信息 MySQL中的用户信息,都存储在系统数据库mysql的表user中 user表的结构如下 这里主要介绍以下几个字段 host : 表示这个用户可以从哪个主机登陆,如果是 localhost ,表示只能从本机登陆 user: 用户名 a…...

Linux 错误码
目录 一、概述二、含义三、错误处理函数1、IS_ERR2、strerr、perror 一、概述 在 Linux 系统中,错误码是用来表示操作系统运行过程中发生的错误的数字代码。错误码通常由负数表示,0 表示成功,正数表示警告或其他非致命错误。 为了开发者更好…...

《向量数据库指南》——开源社区与商业化的平衡
开源社区与商业化的平衡 Lynn:我觉得这个说的特别好,因为开发者工具其实有很多,但是事实上真正去做开源的这种社区的,尤其是做的比较大的,其实这样的企业还是比较少的。那么当初在起步的时候就这么坚定的去选择开源,然后这么短的时间能获得这么多产品反馈。其实让我想到那…...

记录一次echarts图表大数据量轮询刷新页面卡死问题的优化
项目场景: 在我们的项目架构中,集成的Echarts图表组件采用了折线图,业务需求即每300毫秒自动更新图表上的数据,并且每一次的数据点数量达到了约700个,折线图刷新的很快,每300毫秒就要刷新数据 问题描述 开发过程中发现在这种数据量请求频率下,大概2个小时左右就会导致…...

补录:day023-回溯法
40.组合II 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 思路:组合题目二,这个题…...

【物联网】(防水篇)电子产品如何做到IPX7级别的防水?
电子产品如何做到IPX7级别的防水? 要使电子产品达到 IPX7 级别的防水,通常需要以下几个方面的措施: 1. 密封设计: 在产品的外壳连接处、接口、按键等部位,采用高质量的密封材料,如橡胶垫圈、硅胶密封圈等…...

JDK版本切换 - Windows
JDK 下载 点我跳转 - JDK下载官网 可以切换网址后面的JDK版本来跳转到不同的JDK版本下载页面 JDK 安装 双击exe文件即可安装最好是使用默认路径安装, 几个版本的JDK加起来也就1G如果双击exe文件没反应的话, 可以用**7-zip**解压出相应的文件 下载安装**7-zip**** - 默认路…...

STM32-IIC协议详解
一、IIC简介 IC(Inter-Integrated Circuit)协议由飞利浦公司于1980年代开发,是一种用于集成电路间短距离通信的串行协议。它设计用于连接低速外围设备,特别适合于需要简单数据交换的场景。IC协议使用两根信号线:SCL&am…...

Spring事件处理
Spring事件处理 1、核心概念2、线程模型3、监听上下文事件4、自定义事件 💖The Begin💖点点关注,收藏不迷路💖 1、核心概念 ApplicationContext:Spring的核心容器,负责管理Bean的生命周期,并支…...

软设之安全防范体系
安全防范体系的划分: 物理环境的安全性。包括通信线路,物理设备和机房的安全等。物理层的安全主要体现在通信线路的可靠性,软硬件设备的安全性,设备的备份,防灾害能力,防干扰能力,设备的运行环…...

【Python】PyWebIO 初体验:用 Python 写网页
目录 前言1 使用方法1.1 安装 Pywebio1.2 输出内容1.3 输入内容 2 示例程序2.1 BMI 计算器2.2 Markdown 编辑器2.3 聊天室2.4 五子棋 前言 前两天正在逛 Github,偶然看到一个很有意思的项目:PyWebIo。 这是一个 Python 第三方库,可以只用 P…...

OrangePi AIpro学习3 —— vscode开发昇腾DVPP程序
目录 一、VScode配置 1.1 下载和安装 1.2 安装和配置需要的插件 二、构建项目 2.1 项目架构 2.2 解决代码高亮显示 2.3 测试编译 2.4 总结出最简单的代码 2.5 vscode报错找不到头文件解决方法 三、代码简单讲解 3.1 初始化部分 3.2 拷贝数据到NPU显存中 3.3 准备裁…...

redis的数据结构与对象
简单动态字符串 文章目录 简单动态字符串SDS的定义SDS的结构图示结构SDS字段解析SDS的特点 SDS和字符串的区别常数复杂度获取字符串的长度杜绝缓冲区的溢出减少修改字符串时的内存分配次数二进制安全兼容部分c字符串函数总结 链表链表和链表节点的实现链表节点(list…...

ARM 汇编语言基础
目录 汇编指令代码框架 汇编指令语法格式 数据处理指令 数据搬移指令 mov 示例 立即数的本质 立即数的特点 立即数的使用 算术运算指令 指令格式 add 普通的加法指令 adc 带进位的加法指令 跳转指令 Load/Store指令 状态寄存器指令 基础概念 C 语言与汇编指令的关…...

c语言小知识点小计
c语言小知识点小计 1、运算符的优先级 运算符的优先级是和指针解引用*的优先级相同的,但在代码运行中执行顺序是从后往前的。因此下面代码 int a[10] {1,2,3,4}; int* arr a; printf("%d",*arr);//访问的值是2 //注意:printf("%d&qu…...

《C#面向语言版本编程》C# 13 中的新增功能
将C#语言版本升级为预览版 C# 13 包括一些新增功能。 可以使用最新的 Visual Studio 2022 版本或 .NET 9 预览版 SDK 尝试这些功能。若想在.NET项目中尝试使用C#的最新预览版特性,可以按照以下步骤来升级你的项目语言版本: .打开项目文件: 找…...

0成本通过Hugo和GitHub Pages搭建博客
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 使用 Chocolatey 安装 Hugo Chocolatey 是一个 Windows 软件包管理器,使用 PowerShell 和 NuGet 作为基础。它可以自动化软件的安装、升级和卸载过…...

Ollama 可以玩 GLM4和CodeGeeX4了
最近这一两周看到不少互联网公司都已经开始秋招提前批了。 不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。 最近,我们又陆续整理了很多大厂的面试题,帮助一些球友…...

浅析C++指针与引用的关系
前言: 在实践中指针与引用相辅相成,功能相互叠加,但各有各的特点,互相不可替代!!!...

Python面试宝典第31题:字符串反转
题目 编写一个函数,其作用是将输入的字符串反转过来,输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组,并使用O(1)的额外空间解决这一问题。备注:s[i]都是ASCII码表中的可打印…...

【深入理解SpringCloud微服务】深入理解微服务中的远程调用,并手写一个微服务RPC框架
【深入理解SpringCloud微服务】深入理解微服务中的远程调用,并手写一个微服务RPC框架 远程过程调用微服务中的RPC框架如何实现一个微服务中的RPC框架接口扫描生成代理对象代理对象处理逻辑 手写一个微服务RPC框架RPCClientEnableRPCClientMicroServiceRPCClientRegi…...

数据结构----二叉树
小编会一直更新数据结构相关方面的知识,使用的语言是Java,但是其中的逻辑和思路并不影响,如果感兴趣可以关注合集。 希望大家看完之后可以自己去手敲实现一遍,同时在最后我也列出一些基本和经典的题目,可以尝试做一下。…...

通过python管理mysql
打开防火墙端口: 使用 firewall-cmd 命令在防火墙的 public 区域中永久添加 TCP 端口 7500(FRP 控制台面板端口)、7000(FRP 服务端端口)以及端口范围 6000-6100(一组客户端端口)。这些端口是 FR…...

Run the OnlyOffice Java Spring demo project in local
Content 1.Download the sample project in java2.Run the project3.Test the example document 1.Download the sample project in java Link: download the sample code in official website document properties setting spring 项目所在的服务器 server. Address192.168…...

11. Rancher2.X部署多案例镜像
**部署springboot项目 : ** **部署中间件Mysql8.0 : ** 名称:service-mysql 端口 :3306:3306 镜像:mysql:8.0 环境变量: MYSQL_ROOT_PASSWORDxdclass.net168路径映射 /home/data/mysql/data /var/lib/mysql:rw /etc/localtime…...

探索Linux世界之Linux环境开发工具的使用
目录 一、yum -- Linux软件包管理器 1、什么是yum 2、yum的使用 2.1 yum一些经常见的操作 1.查看软件包 2. 安装软件包 3. 删除软件包 3、yum的周边知识 3.1 yum的软件包都是从哪里来的?是从哪里能下载到这些软件包? 3.2 yum的拓展软件源 二、…...