当前位置: 首页 > news >正文

多叉树+图实现简单业务流程

文章目录

    • 场景
    • 整体架构流程
    • 业务界面
    • 技术细节
    • 小结

场景

     这次遇到一个需求,大致就是任务组织成方案,方案组织成预案,预案可裁剪调整.预案关联事件等级配置,告警触发预案产生事件.然后任务执行是有先后的,也就是有流程概念.

整体架构流程

在这里插入图片描述

     方案管理、预案管理构成任务流程的基础条件,告警信息关联预案配置构成事件,也就是流程启动的入口信息.

业务界面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

技术细节

     其实也没有什么特殊的技术,也就用到了多叉树、图、最长路径计算(深搜)等.

  • 多叉树
import lombok.Data;import java.util.ArrayList;
import java.util.List;/*** @author zwmac*/
@Data
public class MoreParentTreeNode<T> {/*** 节点的唯一标识符*/private Long id;/*** 节点的名称*/private String name;/*** 节点的索引*/private Integer index;/*** 子节点list*/private List<MoreParentTreeNode<T>> children;/*** 父节点list*/private List<MoreParentTreeNode<T>> parents;/*** 扩展信息(一般就存节点对应的原始数据)*/private T extendInfo;public MoreParentTreeNode(Long id, String name,Integer index) {this.id = id;this.name = name;this.index = index;this.children = new ArrayList<>();this.parents = new ArrayList<>();}public MoreParentTreeNode() {}/*** 添加子节点* @param child 子节点*/public void addChild(MoreParentTreeNode<T> child) {if (this.children.contains(child)) {return;}this.children.add(child);child.parents.add(this);}/*** 添加父节点* @param parent 父节点*/public void addParent(MoreParentTreeNode<T> parent) {if (this.parents.contains(parent)) {return;}this.parents.add(parent);parent.children.add(this);}public void traverse() {System.out.println(this.name); // 打印节点名称if (this.children.isEmpty()) {System.out.println("没有子节点");}for (MoreParentTreeNode<T> child : this.children) {child.traverse(); // 递归遍历子节点}}public static void main(String[] args) {MoreParentTreeNode root = new MoreParentTreeNode(1L, "root",1);MoreParentTreeNode node1 = new MoreParentTreeNode(2L, "node1",2);MoreParentTreeNode node2 = new MoreParentTreeNode(3L, "node2",3);MoreParentTreeNode node3 = new MoreParentTreeNode(4L, "node3",4);MoreParentTreeNode node4 = new MoreParentTreeNode(5L, "node4",5);MoreParentTreeNode node5 = new MoreParentTreeNode(5L, "node5",6);MoreParentTreeNode node6 = new MoreParentTreeNode(6L, "node6",7);root.addChild(node1);root.addChild(node2);node1.addChild(node6);node3.addParent(node2);node4.addParent(node2);node4.addParent(node1);node5.addParent(node4);root.traverse();}
}
  • 图对象与计算基本方法
import lombok.Data;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** 流程图对象,用于计算最长执行时间* @author zwmac*/
@Data
public class ProcessGraph {/*** 顶点个数*/private int numVertices;/*** 邻接表*/private List<List<Integer>> adjList;/*** 顶点执行时间(边长)*/private Double[] executionTimes;/*** 构造函数* @param numVertices 顶点个数* @param executionTimes 顶点执行时间(边长)*/public ProcessGraph(int numVertices, Double[] executionTimes) {this.numVertices = numVertices;this.executionTimes = executionTimes;adjList = new ArrayList<>(numVertices);for (int i = 0; i < numVertices; i++) {adjList.add(new ArrayList<>());}}/*** 添加边* @param src 源顶点* @param dest 目标顶点*/public void addEdge(int src, int dest) {adjList.get(src).add(dest);}/*** 计算最长执行时间* @return 最长执行时间*/public Double findMaxExecutionTime() {Double[] maxExecutionTimes = new Double[numVertices];Arrays.fill(maxExecutionTimes, -1d);Double maxExecutionTime = 0d;for (int i = 0; i < numVertices; i++) {Double currentExecutionTime = dfs(i, maxExecutionTimes);if (currentExecutionTime > maxExecutionTime) {maxExecutionTime = currentExecutionTime;}}return maxExecutionTime;}/*** 深度优先搜索* @param vertex 顶点* @param maxExecutionTimes 最长执行时间数组* @return 最长执行时间*/private Double dfs(int vertex, Double[] maxExecutionTimes) {if (maxExecutionTimes[vertex] != -1) {return maxExecutionTimes[vertex];}Double maxExecutionTime = executionTimes[vertex];for (int neighbor : adjList.get(vertex)) {Double neighborExecutionTime = dfs(neighbor, maxExecutionTimes);if (neighborExecutionTime + executionTimes[vertex] > maxExecutionTime) {maxExecutionTime = neighborExecutionTime + executionTimes[vertex];}}maxExecutionTimes[vertex] = maxExecutionTime;return maxExecutionTime;}public static void main(String[] args) {Double[] executionTimes = {0d,3d, 4d, 5d, 2d, 3d,0d};ProcessGraph graph = new ProcessGraph(7, executionTimes);graph.addEdge(0, 1);graph.addEdge(0, 2);graph.addEdge(1, 3);graph.addEdge(1, 4);graph.addEdge(2, 3);graph.addEdge(3, 5);graph.addEdge(3, 5);//graph.addEdge(3, 5);Double maxExecutionTime = graph.findMaxExecutionTime();System.out.println("Max execution time: " + maxExecutionTime);}
}
  • 多叉树工具类
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.json.JSONUtil;
import com.smartPark.business.emergency.event.entity.EmergencyEventTask;
import com.smartPark.business.emergency.event.entity.dto.EmergencyEventTaskDTO;
import org.apache.commons.lang3.StringUtils;import java.util.*;/*** @author zwmac*/
public class EventTaskTreeUtil {/*** 转换流程树* @param eventTaskList 任务列表* @return 流程树根节点*/public static MoreParentTreeNode<?> convertTreeDto(List<EmergencyEventTaskDTO> eventTaskList) {MoreParentTreeNode<?> root = new MoreParentTreeNode<>(0L,"开始",0);EmergencyEventTaskDTO rootEventTaskDto = new EmergencyEventTaskDTO();rootEventTaskDto.setTaskDuration(0d);Map<Long, MoreParentTreeNode<?>> nodeMap = new HashMap<>();for (int i = 0;i < eventTaskList.size();i++) {EmergencyEventTaskDTO eventTask = eventTaskList.get(i);Long id = eventTask.getId();String name = eventTask.getTaskName();MoreParentTreeNode<EmergencyEventTaskDTO> node = new MoreParentTreeNode<>(id,name,(i+1));node.setExtendInfo(eventTask);nodeMap.put(eventTask.getId(), node);}//处理父子关系(正)for (EmergencyEventTaskDTO eventTask : eventTaskList) {transNodeRef(eventTask, nodeMap, root);}//处理父子关系(反)for (int i = eventTaskList.size() - 1;i > -1; i--){EmergencyEventTaskDTO eventTask = eventTaskList.get(i);transNodeRef(eventTask, nodeMap, root);}return root;}/*** 转换流程树* @param eventTaskList 任务列表* @return 流程树根节点*/public static MoreParentTreeNode<?> convertTree(List<EmergencyEventTask> eventTaskList) {MoreParentTreeNode<?> root = new MoreParentTreeNode<>(0L,"开始",0);EmergencyEventTask rootEventTask = new EmergencyEventTask();rootEventTask.setTaskDuration(0d);Map<Long, MoreParentTreeNode<?>> nodeMap = new HashMap<>();for (int i = 0;i < eventTaskList.size();i++) {EmergencyEventTask eventTask = eventTaskList.get(i);Long id = eventTask.getId();String name = eventTask.getTaskName();MoreParentTreeNode<EmergencyEventTask> node = new MoreParentTreeNode<>(id,name,(i+1));node.setExtendInfo(eventTask);nodeMap.put(eventTask.getId(), node);}//处理父子关系(正)for (EmergencyEventTask eventTask : eventTaskList) {EmergencyEventTaskDTO eventTaskDTO = new EmergencyEventTaskDTO();BeanUtil.copyProperties(eventTask, eventTaskDTO);transNodeRef(eventTaskDTO, nodeMap, root);}//处理父子关系(反)for (int i = eventTaskList.size() - 1;i > -1; i--){EmergencyEventTask eventTask = eventTaskList.get(i);EmergencyEventTaskDTO eventTaskDTO = new EmergencyEventTaskDTO();BeanUtil.copyProperties(eventTask,eventTaskDTO);transNodeRef(eventTaskDTO, nodeMap, root);}return root;}/*** 转换节点关系* @param eventTask 父级任务* @param nodeMap 节点map* @param root 根节点*/private static void transNodeRef(EmergencyEventTaskDTO eventTask, Map<Long, MoreParentTreeNode<?>> nodeMap, MoreParentTreeNode<?> root) {Long id = eventTask.getId();MoreParentTreeNode<?> node = nodeMap.get(id);if (node != null){EmergencyEventTaskDTO eventTaskDTO = new EmergencyEventTaskDTO();Object eventTaskObj = node.getExtendInfo();if(eventTaskObj instanceof EmergencyEventTask) {EmergencyEventTask nodeEventTask = (EmergencyEventTask) eventTaskObj;BeanUtil.copyProperties(nodeEventTask, eventTaskDTO);}String preIds = eventTaskDTO.getBeforeTaskIds();if (StringUtils.isEmpty(preIds)){node.addParent(root);root.addChild(node);}else {String[] preIdsArr = preIds.split(",");if (ArrayUtil.isNotEmpty(preIdsArr)){for (String preId : preIdsArr) {MoreParentTreeNode<?> preNode = nodeMap.get(Long.valueOf(preId));//前置任务不为空if (preNode != null){preNode.addChild(node);}}}}nodeMap.put(id, node);}}/*** 获取节点的子节点列表* @param treeNode 节点* @param eventTaskId 事件任务id* @return 子节点列表*/public static List<? extends MoreParentTreeNode<?>> getNodeChildrenList(MoreParentTreeNode<?> treeNode, Long eventTaskId) {List<? extends MoreParentTreeNode<?>> childrenList = itGetNodeChildrenList(treeNode, eventTaskId);if (CollectionUtil.isNotEmpty(childrenList)) {return childrenList;}childrenList = itGetNodeParentList(treeNode, eventTaskId);return childrenList;}/*** 迭代获取节点的父节点列表* @param moreParentTreeNode 父节点* @param eventTaskId 事件任务id* @return 父节点列表*/private static List<? extends MoreParentTreeNode<?>> itGetNodeParentList(MoreParentTreeNode<?> moreParentTreeNode, Long eventTaskId) {List<? extends MoreParentTreeNode<?>> children = null;if (moreParentTreeNode.getId().equals(eventTaskId)){children = moreParentTreeNode.getChildren();}else{List<? extends MoreParentTreeNode<?>> parentTreeNodes = moreParentTreeNode.getParents();if(CollectionUtil.isNotEmpty(parentTreeNodes)) {for (MoreParentTreeNode<?> parentTreeNode : parentTreeNodes) {children = itGetNodeParentList(parentTreeNode, eventTaskId);if (CollectionUtil.isNotEmpty(children)) {break;}}}}return children;}/*** 迭代获取节点的子节点列表* @param moreParentTreeNode 子节点* @param eventTaskId 事件任务id* @return 子节点列表*/private static List<? extends MoreParentTreeNode<?>> itGetNodeChildrenList(MoreParentTreeNode<?> moreParentTreeNode, Long eventTaskId) {List<? extends MoreParentTreeNode<?>> children = null;if (moreParentTreeNode.getId().equals(eventTaskId)){children = moreParentTreeNode.getChildren();}else{List<? extends MoreParentTreeNode<?>> childrenChild = moreParentTreeNode.getChildren();if(CollectionUtil.isNotEmpty(childrenChild)) {for (MoreParentTreeNode<?> parentTreeNode : childrenChild) {children = itGetNodeChildrenList(parentTreeNode, eventTaskId);if (CollectionUtil.isNotEmpty(children)) {break;}}}}return children;}public static void main(String[] args) {List<EmergencyEventTaskDTO> eventTaskList = new ArrayList<>();initTestData(eventTaskList,9);System.out.println(JSONUtil.toJsonStr(eventTaskList));MoreParentTreeNode<?> treeNode = convertTreeDto(eventTaskList);List<?> childrenList = getNodeChildrenList(treeNode, 3L);treeNode.traverse();}private static void initTestData(List<EmergencyEventTaskDTO> eventTaskList, int num) {for (int i = 0;i < num; i++){EmergencyEventTaskDTO eventTask = new EmergencyEventTaskDTO();eventTask.setId(Long.valueOf(i));eventTask.setTaskName("任务-" + (i + 1));eventTask.setTaskDuration(RandomUtil.randomDouble(1,10));if (i > 1){StringJoiner sj = new StringJoiner(",");int n = RandomUtil.randomInt(0,i);for(int j = 0;j < i - 1 - n;j++){sj.add(String.valueOf(j+1));}eventTask.setBeforeTaskIds(sj.toString());}eventTaskList.add(eventTask);}}}

     使用思路也特别简单,实际就是将配置任务时只选择了节点上级任务的所有任务构成一个多叉树,然后跟这个树每个节点设置唯一编号,然后转化为图,计算最长路径作为事件的预计完成时间,最后就是各个任务节点的流转了.

/*** 计算预计完成时间* @param event 事件* @return 预计完成时间*/private Date calPlanEndTime(EmergencyEvent event) {Date planStartTime = event.getPlanStartTime();Date finalNow = planStartTime;//先查询预案任务QueryWrapper<EmergencyEventPlan> eventPlanQw = new QueryWrapper<>();eventPlanQw.eq("event_id_", event.getId());List<EmergencyEventPlan> eventPlanList = eventPlanService.list(eventPlanQw);if (CollectionUtil.isNotEmpty(eventPlanList)){//最终预计完成时间//再查询预案任务for (int i = 0;i < eventPlanList.size();i++){QueryWrapper<EmergencyEventTask> eventTaskQw = new QueryWrapper<>();eventTaskQw.eq("event_id_", event.getId());eventTaskQw.eq("event_plan_id_", eventPlanList.get(i).getId());List<EmergencyEventTask> eventTaskList = eventPlanTaskService.list(eventTaskQw);if (CollectionUtil.isNotEmpty(eventTaskList)){//再组织流程树MoreParentTreeNode<?> processTree = EventTaskTreeUtil.convertTree(eventTaskList);//最后计算时间Date planTaskEndTime = calEndTime(processTree, planStartTime, eventTaskList);if (planTaskEndTime.after(finalNow)){finalNow = planTaskEndTime;}}}}return finalNow;}

小结

  • 后悔数据结构没有学好
  • 算法用的少,也有很大工具包直接提供,但是还是很有学的必要的
         就随便写写,希望能帮到大家,uping!

相关文章:

多叉树+图实现简单业务流程

文章目录 场景整体架构流程业务界面技术细节小结 场景 这次遇到一个需求,大致就是任务组织成方案,方案组织成预案,预案可裁剪调整.预案关联事件等级配置,告警触发预案产生事件.然后任务执行是有先后的,也就是有流程概念. 整体架构流程 方案管理、预案管理构成任务流程的基础条…...

Word | 简单可操作的快捷公式编号、右对齐和引用方法

1. 问题描述 在理工科论文的写作中&#xff0c;涉及到大量的公式输入&#xff0c;我们希望能够按照章节为公式进行编号&#xff0c;并且实现公式居中&#xff0c;编号右对齐的效果。网上有各种各样的方法来实现&#xff0c;操作繁琐和简单的混在一起&#xff0c;让没有接触过公…...

leetCode 123.买卖股票的最佳时机 III 动态规划 + 状态压缩

123. 买卖股票的最佳时机 III - 力扣&#xff08;LeetCode&#xff09; 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意&#xff1a;你不能同时参与多笔交易&#xff0…...

JavaScript计算两个时间相差多少个小时的封装函数

js中计算两个时间相差小时数 在JavaScript中&#xff0c;你可以使用Date对象来处理日期和时间。下面是一个函数&#xff0c;它接受两个时间字符串作为参数&#xff0c;并返回两者之间的时间差&#xff08;以小时为单位&#xff09;&#xff1a; function calculateHours(time…...

Qt 画自定义饼图统计的例子

先给出结果图&#xff0c;这个例子是将各种事件分类然后统计的其比例&#xff0c;然后画饼图显示出来 这个是我仿照官方给的例子&#xff0c;让后自己理解后&#xff0c;修改的&#xff0c;要生成饼图&#xff0c;需要QT的 charts 支持&#xff0c;安装QT 没有选择这个的&#…...

【数据结构】链表与LinkedList

作者主页&#xff1a;paper jie 的博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精…...

Flink RoaringBitmap去重

1、RoaringBitmap的依赖 <!-- 去重大哥--> <dependency><groupId>org.roaringbitmap</groupId><artifactId>RoaringBitmap</artifactId><version>0.9.21</version> </dependency> 2、Demo去重 package com.gwm.driver…...

Elasticsearch—(MacOs)

1⃣️环境准备 准备 Java 环境&#xff1a;终端输入 java -version 命令来确认版本是否符合 Elasticsearch 要求下载并解压 Elasticsearch&#xff1a;前往&#xff08;https://www.elastic.co/downloads/elasticsearch&#xff09;选择适合你的 Mac 系统的 Elasticsearch 版本…...

插入排序与希尔排序

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; 这两个排序在思路上有些相似&#xff0c;所以有人觉得插入排序和希尔排序差别不大&#xff0c;事实上&#xff0c;他们之间的差别不小&#xff0c;插入排序只是希尔排序的最后一步。 目录 前言&#xff1a;…...

C# OpenCvSharp 基于直线检测的文本图像倾斜校正

效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp;namespace OpenCvSharp_基于直线检测的文…...

“智慧时代的引领者:探索人工智能的无限可能性“

目录 一.背景 二.应用 2.1金融领域 2.2医疗领域 2.3教育领域 三.发展 四.总结: 一.背景 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;&#xff0c;是指通过计算机程序模拟人类智能的一种技术。它是计算机科学、工程学、语言学、哲学等多…...

PMSM——转子位置估算基于QPLL

文章目录 前言仿真模型观测器速度观测位置观测转矩波形电流波形 前言 今后是电机控制方向的研究生的啦&#xff0c;期待有同行互相交流。 仿真模型 观测器 速度观测 位置观测 转矩波形 电流波形...

Android Studio之Gradle和Gradle插件的区别

解释的很详细 Android Studio之Gradle和Gradle插件的区别...

DataExcel控件读取和保存excel xlsx 格式文件

需要引用NPOI库 https://github.com/dotnetcore/NPOI 调用Read 函数将excel读取到dataexcel控件 调用Save 函数将dataexcel控件文件保存为excel文件 using NPOI.HSSF.UserModel; using NPOI.HSSF.Util; using NPOI.SS.UserModel; using NPOI.SS.Util; using System; using …...

【JavaEE】CAS(Compare And Swap)操作

文章目录 什么是 CASCAS 的应用如何使用 CAS 操作实现自旋锁CAS 的 ABA 问题CAS 相关面试题 什么是 CAS CAS&#xff08;Compare and Swap&#xff09;是一种原子操作&#xff0c;用于在无锁情况下保证数据一致性的问题。它包含三个操作数——内存位置、预期原值及更新值。在执…...

第三章:最新版零基础学习 PYTHON 教程(第三节 - Python 运算符—Python 中的关系运算符)

关系运算符用于比较值。它根据条件返回 True 或 False。这些运算符也称为比较运算符。 操作员描述 句法> 大于:如果左操作数大于右操作数,则为 Truex > y...

【GDB】使用 GDB 自动画红黑树

阅读本文前需要的基础知识 用 python 扩展 gdb python 绘制 graphviz 使用 GDB 画红黑树 前面几节中介绍了 gdb 的 python 扩展&#xff0c;参考 用 python 扩展 gdb 并且 python 有 graphviz 模块&#xff0c;那么可以用 gdb 调用 python&#xff0c;在 python 中使用 grap…...

使用Vue3+elementPlus的Tree组件实现一个拖拽文件夹管理

文章目录 1、前言2、分析3、实现4、踩坑4.1、拖拽辅助线的坑4.2、数据的坑4.3、限制拖拽4.4、样式调整 1、前言 最近在做一个文件夹管理的功能&#xff0c;要实现一个树状的文件夹面板。里面包含两种元素&#xff0c;文件夹以及文件。交互要求如下&#xff1a; 创建、删除&am…...

小谈设计模式(7)—装饰模式

小谈设计模式&#xff08;7&#xff09;—装饰模式 专栏介绍专栏地址专栏介绍 装饰模式装饰模式角色Component&#xff08;抽象组件&#xff09;ConcreteComponent&#xff08;具体组件&#xff09;Decorator&#xff08;抽象装饰器&#xff09;ConcreteDecorator&#xff08;具…...

nginx 多层代理 + k8s ingress 后端服务获取客户真实ip 配置

1.nginx http 七层代理 修改命令空间&#xff1a; namespace: nginx-ingress : configmap&#xff1a;nginx-configuration kubectl get cm nginx-configuration -n ingress-nginx -o yaml添加如上配置 compute-full-forwarded-for: “true” forwarded-for-header: X-Forwa…...

6种最常用的3D点云语义分割AI模型对比

由于增强现实/虚拟现实的发展及其在计算机视觉、自动驾驶和机器人领域的广泛应用&#xff0c;点云学习最近引起了人们的关注。 深度学习已成功用于解决 2D 视觉问题&#xff0c;然而&#xff0c;由于其处理面临独特的挑战&#xff0c;深度学习技术在点云上的使用仍处于起步阶段…...

UG NX二次开发(C#)-获取UI中选择对象的handle值

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、设计一个简单的UI界面3、创建工程项目4、测试结果1、前言 我在哔哩哔哩的视频中看到有人问我如何获取UI选择对象的Handle,本来想把Tag、Taggedobject、Handle三者的关系讲一下,然后看…...

win10,WSL的Ubuntu配python3.7手记

1.装linux 先在windows上安装WSL版本的Ubuntu Windows10系统安装Ubuntu子系统_哔哩哔哩_bilibili &#xff08;WSL2什么的一直没搞清楚&#xff09; 图形界面会出一些问题&#xff0c;注意勾选ccsm出的界面设置 win10安装Ubuntu16.04子系统&#xff0c;并开启桌面环境_win…...

02-Zookeeper实战

上一篇&#xff1a;01-Zookeeper特性与节点数据类型详解 1. zookeeper安装 Step1&#xff1a; 配置JAVA环境&#xff0c;检验环境&#xff1a; java -versionStep2: 下载解压 zookeeper wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.8/apache-zookeepe…...

【C语言深入理解指针(1)】

1.内存和地址 1.1内存 在讲内存和地址之前&#xff0c;我们想有个⽣活中的案例&#xff1a; 假设有⼀栋宿舍楼&#xff0c;把你放在楼⾥&#xff0c;楼上有100个房间&#xff0c;但是房间没有编号&#xff0c;你的⼀个朋友来找你玩&#xff0c;如果想找到你&#xff0c;就得挨…...

模拟实现简单的通讯录

前言&#xff1a;生活中处处都会看到或是用到通讯录&#xff0c;今天我们就通过C语言来简单的模拟实现一下通讯录。 鸡汤&#xff1a;跨越山海&#xff0c;终见曙光&#xff01; 链接:gitee仓库&#xff1a;代码链接 目录 主函数声明部分初始化通讯录实现扩容的函数增加通讯录所…...

rabbitMQ死信队列快速编写记录

文章目录 1.介绍1.1 什么是死信队列1.2 死信队列有什么用 2. 如何编码2.1 架构分析2.2 maven坐标2.3 工具类编写2.4 consumer1编写2.5 consumer2编写2.6 producer编写 3.整合springboot3.1 架构图3.2 maven坐标3.3 构建配置类&#xff0c;创建exchange&#xff0c;queue&#x…...

数位dp,338. 计数问题

338. 计数问题 - AcWing题库 给定两个整数 a 和 b&#xff0c;求 a 和 b 之间的所有数字中 0∼90∼9 的出现次数。 例如&#xff0c;a1024&#xff0c;b1032&#xff0c;则 a 和 b 之间共有 9 个数如下&#xff1a; 1024 1025 1026 1027 1028 1029 1030 1031 1032 其中 0 出…...

如何解决git clone http/https仓库失败(403错误)

本来不打算写这篇文章&#xff0c;但是后来又遇到这个问题忘了之前是怎么解决的了。 一般情况下&#xff0c;个人使用 GitHub 等平台时是使用 SSH 协议的&#xff0c;这样不光方便管理可访问用户&#xff0c;也保证了安全性。但是 GitHub 上仓库的 SSH 地址是要登陆才能看到&a…...

华为云云耀云服务器L实例评测 | 实例评测使用之硬件性能评测:华为云云耀云服务器下的硬件运行评测

华为云云耀云服务器L实例评测 &#xff5c; 实例评测使用之硬件性能评测&#xff1a;华为云云耀云服务器下的硬件运行评测 介绍华为云云耀云服务器 华为云云耀云服务器 &#xff08;目前已经全新升级为 华为云云耀云服务器L实例&#xff09; 华为云云耀云服务器是什么华为云云耀…...

广东省两学一做网站/油烟机seo关键词

写在前面 对 CSS 布局掌握程度决定你在 Web 开发中的开发页面速度。随着 Web 技术的不断革新&#xff0c;实现各种布局的方式已经多得数不胜数了。 最近利用碎片时间&#xff0c;大概用了半个月的时间整理了一个系列&#xff0c;本系列文章总结了 CSS 中的各种布局&#xff0…...

做网站能挣多少钱/南京关键词seo公司

一、Redis支持的数据类型 Redis中存储数据是通过key-value存储的&#xff0c;对于value的类型有以下几种: (1)字符串。 (2)Map (3)List (4)Set public class RedisPoolManager{// Redis服务器IPprivate static String HOST "192.168.109.157";// Redis的端口号priva…...

复制wordpress文章/中国今天新闻最新消息

使用IntelliJ IDEA 创建Spring Boot项目时 显示 connect timed out 解决方法: 1.很多博客说将 https://start.spring.io 改为 http://start.spring.io &#xff0c;但是我这里不行&#xff0c;当然&#xff0c;如果连上移动热点的话&#xff0c;就算不改也可以成功。 2.参考转…...

酒店网站制作策划/seo为什么要进行外部优化

见&#xff1a;http://topic.csdn.net/u/20100625/21/cb7295e6-0514-4e28-888f-2935537208f4.html有个表pages ,有5个属性&#xff0c;id, url, title, body, site.问&#xff1a; 用一条SQL语句搜出url,body,或site中包含’test’字符串的数据&#xff0c;且将含有‘test’的u…...

皖icp合肥网站建设/安卓手机优化软件哪个好

1. 首先安装STM32 ST-Link Utility V3.7&#xff0c;电脑接板子的CN1&#xff0c;然后在STM32 ST-Link Utility V3.7点击连接目标板子(目标-连接)&#xff0c;点击External Loader&#xff0c;选择N25Q128A_STM32469I-DISCO 2. 然后选择文件&#xff0c;打开选择STM32469I-Disc…...

黑客黑网站是做网站/培训网络营销的机构

内容来自 https://mp.weixin.qq.com/s/j34nJGomvR23ZJiqIFMoAQ Q&#xff1a;海量稀疏特征&#xff0c;如何找到好的特征 Embedding 表达方式&#xff1f; &#xff08;1&#xff09;对于序列行为中的 Item Embedding&#xff0c;拥有怎样性质的 Embedding 表达方式是较好的&a…...