SpringBoot整合Activiti7——消息事件(十)

news2024/11/16 2:25:23

文章目录

  • 消息事件
    • 开始事件
    • 中间事件
    • 边界事件
    • 代码实现
      • xml文件
      • 测试流程
      • 流程执行步骤


消息事件

消息事件只有一个接收者,消息具有名字与载荷。

信息会储存在 act_ru_event_subscr 表中。

<!-- 定义消息 -->
<message id="msgId1" name="msgName1"/>
<message id="msgId2" name="msgName2"/>
<message id="msgId3" name="msgName3"/>
<message id="msgId4" name="msgName4"/>

开始事件

使用场景:比如接收到一封邮件,一条短信后启动流程

<!-- 消息开始事件 -->
<startEvent id="sid-2aac151d-e888-467a-b8e9-2f512e365228" name="消息开始事件">
  <!-- 引用消息 -->
  <messageEventDefinition messageRef="msgId1"/>
</startEvent>

中间事件

使用场景:需要接收特定的消息之后才能进入下一个环节

<!-- 消息中间事件 -->
<intermediateCatchEvent id="sid-b3ed607b-e3ea-4695-87af-54c71bd85820" name="消息中间事件">
  <messageEventDefinition messageRef="msgId2"/>
</intermediateCatchEvent>

边界事件

使用场景:当前用户任务还没有完成,触发了边界事件(发送消息),会根据cancelActivity属性完成下一个节点。

<!-- 消息边界事件1 -->
<boundaryEvent id="sid-32b97e42-5b52-45fa-9bc3-ec8bd4461087" attachedToRef="sid-c504e710-651a-4f5a-a0a1-6e2e3d3e992a" cancelActivity="false" name="消息边界事件1">
  <messageEventDefinition messageRef="msgId3"/>
</boundaryEvent>

代码实现

消息开始事件 - 自动任务 - 消息中间事件 - 用户任务(消息边界事件非中断) - 用户任务(消息边界事件中断)- 结束流程
在这里插入图片描述

xml文件

<?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-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.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.activiti.org/processdef">
  <!-- 定义消息 -->
  <message id="msgId1" name="msgName1"/>
  <message id="msgId2" name="msgName2"/>
  <message id="msgId3" name="msgName3"/>
  <message id="msgId4" name="msgName4"/>
  <process id="message" name="消息事件" isExecutable="true">
    <documentation>消息事件流程</documentation>
    <!-- 消息开始事件 -->
    <startEvent id="sid-2aac151d-e888-467a-b8e9-2f512e365228" name="消息开始事件">
      <!-- 引用消息 -->
      <messageEventDefinition messageRef="msgId1"/>
    </startEvent>
    <!-- 服务任务 -->
    <serviceTask id="sid-bdcd3e82-e9d3-41ee-ae69-f658ea3cf1d1" activiti:exclusive="true" name="服务任务" activiti:delegateExpression="${myServiceTaskListener}"/>
    <sequenceFlow id="sid-1bcd8e94-8f7b-4265-a3b7-b2e113bb3d09" sourceRef="sid-2aac151d-e888-467a-b8e9-2f512e365228" targetRef="sid-bdcd3e82-e9d3-41ee-ae69-f658ea3cf1d1"/>
    <!-- 结束事件1 -->
    <endEvent id="sid-9376d8dd-c6fd-4c8c-94b0-549ca543194c" name="结束事件1"/>
    <sequenceFlow id="sid-9360e3fe-a092-46f4-a6d0-b68cc66f7b57" sourceRef="sid-bdcd3e82-e9d3-41ee-ae69-f658ea3cf1d1" targetRef="sid-b3ed607b-e3ea-4695-87af-54c71bd85820"/>
    <!-- 消息中间事件 -->
    <intermediateCatchEvent id="sid-b3ed607b-e3ea-4695-87af-54c71bd85820" name="消息中间事件">
      <!-- 引用消息 -->
      <messageEventDefinition messageRef="msgId2"/>
    </intermediateCatchEvent>
    <!-- 用户任务1 -->
    <userTask id="sid-c504e710-651a-4f5a-a0a1-6e2e3d3e992a" name="用户任务1">
      <extensionElements>
        <activiti:taskListener event="create" delegateExpression="${myUserTaskListener}"/>
      </extensionElements>
    </userTask>
    <sequenceFlow id="sid-fc3da049-2f76-4188-8c33-27a7572c263e" sourceRef="sid-b3ed607b-e3ea-4695-87af-54c71bd85820" targetRef="sid-c504e710-651a-4f5a-a0a1-6e2e3d3e992a"/>
    <sequenceFlow id="sid-d164986f-7551-43b3-b18e-da7b2830dc7f" sourceRef="sid-c504e710-651a-4f5a-a0a1-6e2e3d3e992a" targetRef="sid-1dbfc3d6-a8ae-4989-9dab-343a2ab573f5"/>
    <!-- 消息边界事件1 -->
    <boundaryEvent id="sid-32b97e42-5b52-45fa-9bc3-ec8bd4461087" attachedToRef="sid-c504e710-651a-4f5a-a0a1-6e2e3d3e992a" cancelActivity="false" name="消息边界事件1">
      <messageEventDefinition messageRef="msgId3"/>
    </boundaryEvent>
    <!-- 服务任务 通知服务 -->
    <serviceTask id="sid-813f9e98-aa9a-4744-b4ff-503f31cd5af8" activiti:exclusive="true" name="通知服务" activiti:delegateExpression="${myServiceTaskListener}"/>
    <sequenceFlow id="sid-a05f2ac4-4cbb-4091-b32a-2251e3d59c34" sourceRef="sid-32b97e42-5b52-45fa-9bc3-ec8bd4461087" targetRef="sid-813f9e98-aa9a-4744-b4ff-503f31cd5af8"/>
    <!-- 用户任务2 -->
    <userTask id="sid-1dbfc3d6-a8ae-4989-9dab-343a2ab573f5" name="用户任务2">
      <extensionElements>
        <activiti:taskListener event="create" delegateExpression="${myUserTaskListener}"/>
      </extensionElements>
    </userTask>
    <!-- 消息边界事件2 -->
    <boundaryEvent id="sid-e9d7d45d-9d06-4b01-8315-e50b66c2dfbd" attachedToRef="sid-1dbfc3d6-a8ae-4989-9dab-343a2ab573f5" cancelActivity="true" name="消息边界事件2">
      <messageEventDefinition messageRef="msgId4"/>
    </boundaryEvent>
    <!-- 用户任务3 -->
    <userTask id="sid-fb470629-bb4f-4c15-8031-629bf6b23474" name="用户任务3">
      <extensionElements>
        <activiti:taskListener event="create" delegateExpression="${myUserTaskListener}"/>
      </extensionElements>
    </userTask>
    <!-- 结束事件2 -->
    <endEvent id="sid-59e5b9e6-1579-464f-bebf-939a6925894b" name="结束事件2"/>
    <sequenceFlow id="sid-4796fc97-3d81-44ac-a372-1ec5107ba121" sourceRef="sid-813f9e98-aa9a-4744-b4ff-503f31cd5af8" targetRef="sid-9376d8dd-c6fd-4c8c-94b0-549ca543194c"/>
    <sequenceFlow id="sid-7b257b24-9a92-4cca-9280-50f057d3b756" sourceRef="sid-1dbfc3d6-a8ae-4989-9dab-343a2ab573f5" targetRef="sid-59e5b9e6-1579-464f-bebf-939a6925894b"/>
    <sequenceFlow id="sid-81b3aace-e1af-4f69-8a77-a1ed9a659c40" sourceRef="sid-e9d7d45d-9d06-4b01-8315-e50b66c2dfbd" targetRef="sid-fb470629-bb4f-4c15-8031-629bf6b23474"/>
    <sequenceFlow id="sid-b307971c-2cdf-4af0-bebc-a2943945cc8c" sourceRef="sid-fb470629-bb4f-4c15-8031-629bf6b23474" targetRef="sid-59e5b9e6-1579-464f-bebf-939a6925894b"/>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_message">
    <bpmndi:BPMNPlane bpmnElement="message" id="BPMNPlane_message">
      <bpmndi:BPMNShape id="shape-2389bc8b-6dca-4ad0-ae30-7f18f1df4ff4" bpmnElement="sid-2aac151d-e888-467a-b8e9-2f512e365228">
        <omgdc:Bounds x="-292.75" y="-38.5" width="30.0" height="30.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="shape-6933f3c2-9e66-478d-a2bf-22042e7198c2" bpmnElement="sid-bdcd3e82-e9d3-41ee-ae69-f658ea3cf1d1">
        <omgdc:Bounds x="-234.25" y="-63.5" width="100.0" height="80.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="edge-c3bd0815-b0e9-4f3a-a4a8-d531063d5ee1" bpmnElement="sid-1bcd8e94-8f7b-4265-a3b7-b2e113bb3d09">
        <omgdi:waypoint x="-262.75" y="-23.5"/>
        <omgdi:waypoint x="-234.25" y="-23.5"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="shape-369198b3-92b5-41dc-be13-161bb96aceeb" bpmnElement="sid-59e5b9e6-1579-464f-bebf-939a6925894b">
        <omgdc:Bounds x="388.9129" y="-38.5" width="30.0" height="30.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="edge-ea561676-eb7f-4e24-b93e-55253ef99de6" bpmnElement="sid-9360e3fe-a092-46f4-a6d0-b68cc66f7b57">
        <omgdi:waypoint x="-134.25" y="-23.5"/>
        <omgdi:waypoint x="-106.75" y="-23.5"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="shape-18ea56ca-4b72-4eb3-bc65-02515550d26d" bpmnElement="sid-b3ed607b-e3ea-4695-87af-54c71bd85820">
        <omgdc:Bounds x="-106.75" y="-38.5" width="30.0" height="30.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="shape-5f517e63-3511-4b12-bb7e-3190a8e458fb" bpmnElement="sid-c504e710-651a-4f5a-a0a1-6e2e3d3e992a">
        <omgdc:Bounds x="-49.35" y="-63.5" width="100.0" height="80.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="edge-a788f528-47cb-4a02-8ac1-18214cbe2277" bpmnElement="sid-fc3da049-2f76-4188-8c33-27a7572c263e">
        <omgdi:waypoint x="-76.75" y="-23.5"/>
        <omgdi:waypoint x="-49.35" y="-23.5"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="edge-8a99dde1-060b-4fcc-8053-6e9f8ea853f9" bpmnElement="sid-d164986f-7551-43b3-b18e-da7b2830dc7f">
        <omgdi:waypoint x="50.65" y="-23.5"/>
        <omgdi:waypoint x="184.43443" y="-23.5"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="shape-9a8d9303-59ce-472d-8ba5-92d68589673c" bpmnElement="sid-813f9e98-aa9a-4744-b4ff-503f31cd5af8">
        <omgdc:Bounds x="36.874165" y="61.529808" width="100.0" height="80.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="edge-5e7d2270-7207-4b9c-a151-90b8ae3dbec4" bpmnElement="sid-a05f2ac4-4cbb-4091-b32a-2251e3d59c34">
        <omgdi:waypoint x="0.7840462" y="10.115295"/>
        <omgdi:waypoint x="0.6500015" y="101.5298"/>
        <omgdi:waypoint x="36.87416" y="101.52981"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="shape-c3ae777e-7677-4666-9568-82afcd8f105c" bpmnElement="sid-1dbfc3d6-a8ae-4989-9dab-343a2ab573f5">
        <omgdc:Bounds x="184.43442" y="-63.5" width="100.0" height="80.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="shape-6c351baf-210d-4254-b775-90d3d849503b" bpmnElement="sid-fb470629-bb4f-4c15-8031-629bf6b23474">
        <omgdc:Bounds x="276.2087" y="61.529793" width="100.0" height="80.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="shape-78f32f48-e45e-4280-8f9e-8da9b1aa8137" bpmnElement="sid-9376d8dd-c6fd-4c8c-94b0-549ca543194c">
        <omgdc:Bounds x="174.23729" y="86.5298" width="30.0" height="30.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="edge-a27dffa7-5cdb-4725-b416-935122444e28" bpmnElement="sid-4796fc97-3d81-44ac-a372-1ec5107ba121">
        <omgdi:waypoint x="136.87416" y="101.52981"/>
        <omgdi:waypoint x="174.23729" y="101.5298"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="edge-1c9fe7c0-1a25-4713-964b-c21c7e7da939" bpmnElement="sid-7b257b24-9a92-4cca-9280-50f057d3b756">
        <omgdi:waypoint x="284.43442" y="-23.5"/>
        <omgdi:waypoint x="388.9129" y="-23.5"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="edge-f224127e-7bf1-4c6b-a9cb-71d3779a2095" bpmnElement="sid-81b3aace-e1af-4f69-8a77-a1ed9a659c40">
        <omgdi:waypoint x="243.56537" y="12.270161"/>
        <omgdi:waypoint x="244.85805" y="101.5298"/>
        <omgdi:waypoint x="276.2087" y="101.529785"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="edge-236d755e-c900-4a3e-ac03-c67efc67fe2c" bpmnElement="sid-b307971c-2cdf-4af0-bebc-a2943945cc8c">
        <omgdi:waypoint x="376.20874" y="101.529785"/>
        <omgdi:waypoint x="403.91287" y="101.529785"/>
        <omgdi:waypoint x="403.9129" y="-8.5"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="shape-0e367d18-9323-48cf-9862-2050042aaa3a" bpmnElement="sid-32b97e42-5b52-45fa-9bc3-ec8bd4461087">
        <omgdc:Bounds x="-14.215954" y="-19.884705" width="30.0" height="30.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="shape-8741f847-bbde-4157-8d80-729f8858eec8" bpmnElement="sid-e9d7d45d-9d06-4b01-8315-e50b66c2dfbd">
        <omgdc:Bounds x="228.56535" y="-17.72984" width="30.0" height="30.0"/>
      </bpmndi:BPMNShape>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

测试流程

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class TestActivityMessage {

    @Autowired
    private RepositoryService repositoryService;
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private TaskService taskService;

    private static final String PROCESS_INSTANCE_ID = "bb77d92a-3e55-11ee-8497-18c04dcd4aee";

    @Test
    public void deployAndStartProcess() {
        // 部署流程
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("processes/message.bpmn20.xml")
                .deploy();
        System.out.println("deploy = " + deploy);

        // 启动流程 根据消息名称触发启动,定义的消息会记录在act_ru_event_subscr,事件结束后自动删除记录。
        ProcessInstance processInstance = runtimeService.startProcessInstanceByMessage("msgName1", "message:10001");
        System.out.println("processInstance = " + processInstance);
    }

    @Test
    public void receivedMiddleMessage() {
        // 查询执行
        Execution execution = runtimeService.createExecutionQuery().processInstanceId(PROCESS_INSTANCE_ID).onlyChildExecutions().singleResult();
        System.out.println("execution = " + execution);
        // 发送消息 触发消息中间事件
        runtimeService.messageEventReceived("msgName2", execution.getId());
    }

    @Test
    public void receivedBoundMessage() {
        String messageName = "msgName4";
        // 查询执行 根据消息名字查询
        Execution execution = runtimeService.createExecutionQuery().processInstanceId(PROCESS_INSTANCE_ID).messageEventSubscriptionName(messageName).onlyChildExecutions().singleResult();
        System.out.println("execution = " + execution);
        // 发送消息
        runtimeService.messageEventReceived(messageName, execution.getId());
    }

    @Test
    public void completeUserTask() {
        // 查询任务
        Task task = taskService.createTaskQuery().processInstanceId(PROCESS_INSTANCE_ID).singleResult();
        System.out.println("task = " + task);
        // 完成任务
        taskService.complete(task.getId());
    }

}

流程执行步骤

// 1.部署流程并根据消息开始事件-名字msgName1启动流程
// 2.触发服务任务
// 3.触发消息中间事件msgName2
// 4.查询execution,并发送msgName2消息
// 5.当前任务为用户任务1,触发消息边界事件1-msgName3(非中断)
// 6.根据消息名字msgName3查询execution,并发送msgName3消息
// 7.触发通知服务任务
// 8.完成用户任务1,当前任务变更为用户任务2,触发消息边界事件2-msgName4(中断)
// 9.根据消息名字msgName4查询execution,并发送msgName4消息
// 10.当前任务变更为用户任务3
// 11.完成用户任务3结束流程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1277161.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【mysql】mysgld.log文件太大怎么办

我们有一台测试服务器。跑着一个msyq&#xff0c;发现没有空间了。差看日志文件占用了很多。 怎么破 使用下面命令 echo "" >mysqld.log 执行命令后

B.牛牛排队伍——模拟双链表

当前位置: 首页 > news >正文 B.牛牛排队伍——模拟双链表 news 2023/12/1 15:14:37 分析 题目其实很简单,就是双链表的增删查,但是刚开始,直接vis标记删除元素,查找一个位置的前一个用的while不断向前找,但是TLE;毕竟O(n*k)的复杂度,一开始没有考虑时间复杂度…

分享82个节日PPT,总有一款适合您

分享82个节日PPT&#xff0c;总有一款适合您 82个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1boDTl3PiHFXLJ890CoUfJA?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。…

【Matlab】如何快速入门一项新技能-以Matlab/Simulink入门为例

目录 1. 引言 2. 背景 3. 快速学习并完成开发 3.1 了解需求&#xff0c;知道要干什么 3.2 了解Matlab/Simulink基本功能 第一步&#xff0c;查看Matlab的中文网站中文网站https://www.ilovematlab.cn/resources/对Matlab/Simulink有了一个初步认识。 3.3 实现一个最简单…

07-原型模式-C语言实现

UML图&#xff1a; 代码实现&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>// 原型接口 typedef struct {void* (*clone)(void*); } Prototype;// 具体原型类 typedef struct {Prototype prototype;char* name;int age; } Concr…

列表插槽使用

{label: 是否展示,prop: isShow,solt: true, }<!--自定义列--><template slot-scope"scope" slot"isShow"><div style"color: red;cursor: pointer" focus"getIsShow(scope.row)" ><el-switch v-model"sco…

Linux部分基础指令讲解

目录 1.echo指令 2.more指令 3.less指令&#xff08;重要&#xff09; 4.head指令 5.tail指令 6.管道| 7.时间相关的指令 8.cal指令 9.find指令 10.grep指令 1.echo指令 我们先看效果 如图所示我们可以看到显示器显示出了hellow world和hellow这两句话&#xff0c;我们的echo的…

图书馆座位预约时间冲突提示(前后端全) 前端elementUI 时间选择器只显示时和分,SQL实现时间冲突判断

背景 帮客户定制项目&#xff0c;要实现图书馆预约座位的功能。 功能描述如下&#xff1a;学生选择开始时间和结束时间&#xff0c;只选择小时和分钟&#xff0c;提交预约后&#xff0c;如果该时间有冲突提示学生修改预约时间。 问题 前端样式选择的是elmentUI&#xff0c;但…

VBA技术资料MF90:在PowerPoint中完成多重查找替换

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

Mysql 行转列,把逗号分隔的字段拆分成多行

目录 效果如下源数据变更后的数据 方法第一种示例SQL和业务结合在一起使用 第二种示例SQL和业务结合在一起使用 结论 效果如下 源数据 变更后的数据 方法 第一种 先执行下面的SQL&#xff0c;看不看能不能执行&#xff0c;如果有结果&#xff0c;代表数据库版本是可以的&…

CSS选择器十二种方法

相信大家对元素应该是不陌生的&#xff0c;当我们页面中&#xff0c;我们想要布局&#xff0c;给元素添加样式的时候&#xff0c;我们应该怎么获取到指定元素呢&#xff1f; 优先级&#xff1a;ID 选择器 > 类选择器 > 标签选择器 > 通配符 1.元素选择器 通过标签名…

lv11 嵌入式开发 中断控制器14

目录 1 中断控制器 ​编辑 2 Exynos4412下的中断控制器 2.1 概述 2.2 特征 ​编辑 2.3 中断状态 2.4 中断类型 2.5 中断控制器GIC中断表 3 中断控制器寄存器详解 3.1 ICDDCR&#xff08;Interrupt Controller Distributor Control Register&#xff09; 3.2 ICDISER…

备战春招——12.1 算法

动态规划 动态规划的核心思想就是 本次只由上一次决定。 爬楼梯 第3阶由&#xff08;第1节2&#xff09;和&#xff08;第二节1&#xff09;&#xff0c;不要想着往下迭代&#xff0c;不然那是个无穷底。所以f(x)f(x-1)f(x-2) (x>2)。所以就是当前只与上个操作相关。 cla…

docker安装卸载使用全教程

docker安装卸载使用全教程 1.确定你是Centos7及以上版本 cat /etc/redhat-release2.yum安装gcc相关依赖 yum install -y gcc Yum install -y gcc-c3.安装需要的软件包 sudo yum install -y yum-utils4.设置stable镜像仓库 这里设置的是国内阿里云的镜像库&#xff0c;国外的…

【计算机网络笔记】PPP协议

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

vue3中如何实现事件总线eventBus

使用插件 由于vue3中 “$ on”&#xff0c;$ off 和 $ once 实例方法已被移除&#xff0c;组件实例不再实现事件触发接口 所以我们可以使用官方推荐的这个第三方库实现同样的效果 mitt https://github.com/developit/mitt 安装 pnpm install mitt -S挂载全局写法 main.ts 初始…

[全球首款]开源智能串口屏方案发布

基于 AWTK 和 AWTK-MVVM 实现的串口屏方案。 界面修改数据&#xff0c;自动通知 MCU。 MCU 修改数据&#xff0c;自动更新界面。 1. 主要特色&#xff1a; 1.1 开发 强大的界面设计器 AWStudio。基于 AWTK 实现强大的 GUI 功能&#xff08;多窗口、输入法、动画和各种控件&am…

数据算法之层次聚类——(待完善)

1.数据挖掘入门笔记——层次聚类 ( 浮光掠影) 2.聚类算法&#xff1a;Hierarchical Clustering层次聚类 3.一文读懂层次聚类&#xff08;Python代码&#xff09; 4.层次聚类 5.聚类分析&#xff08;三&#xff09; 层次聚类及matlab程序 5.聚类算法之层次聚类&#xff08…

Linux文件系统 -- inode和block

目录 重要参数目录项fsck软连接&#xff0c;硬链接 重要参数 dumpe2fs /dev/sda1|more查看ext4文件元数据&#xff08;描述文件系统的数据&#xff09;&#xff0c;xfs_info查看xfs文件系统 superblock&#xff1a;超级块&#xff0c;记录此file system的整体信息&#xff0c…

SSM实战项目,基于Spring+SpringMVC+mybatis实现的人事管理系统源码+数据库+使用说明

SSM实战项目&#xff1a;人事管理系统&#xff08;蓝色版&#xff09; 一、员工管理系统项目说明&#xff1a; 该项目主要是完成SpringSpringMVCmybatis的完整整合&#xff0c;功能实现比较单一&#xff0c;就是一个完成增删改查的小项目&#xff01; 完整代码下载地址SSM实…