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

文章目录

  • 消息事件
    • 开始事件
    • 中间事件
    • 边界事件
    • 代码实现
      • 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 {@Autowiredprivate RepositoryService repositoryService;@Autowiredprivate RuntimeService runtimeService;@Autowiredprivate TaskService taskService;private static final String PROCESS_INSTANCE_ID = "bb77d92a-3e55-11ee-8497-18c04dcd4aee";@Testpublic 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);}@Testpublic void receivedMiddleMessage() {// 查询执行Execution execution = runtimeService.createExecutionQuery().processInstanceId(PROCESS_INSTANCE_ID).onlyChildExecutions().singleResult();System.out.println("execution = " + execution);// 发送消息 触发消息中间事件runtimeService.messageEventReceived("msgName2", execution.getId());}@Testpublic 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());}@Testpublic 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.mzph.cn/news/190004.shtml

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

相关文章

聊聊什么是IO流

目录 Java IOIO 基础Java IO 流了解吗&#xff1f; IO 设计模式1、装饰器模式2、适配器模式适配器模式和装饰器模式有什么区别呢&#xff1f;3、工厂模式4、观察者模式 IO 模型有哪些常见的 IO 模型&#xff1f;BIO(Blocking I/O)NIO (Non-blocking/New I/O)AIO (Asynchronous …

51单片机的智能加湿器控制系统【含proteus仿真+程序+报告+原理图】

1、主要功能 该系统由AT89C51单片机LCD1602显示模块DHT11湿度传感器模块继电器等模块构成。主要适用于智能自动加湿器、湿度保持、湿度控制等相似项目。 可实现基本功能: 1、LCD1602液晶屏实时显示湿度信息 2、DHT11采集湿度 3、按键可以调节适宜人体湿度的阈值范围&#xff0…

西南科技大学模拟电子技术实验三(BJT单管共射放大电路测试)预习报告

一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程,越详细越好。用公式输入法完成相关公式内容,不得贴手写图片。(注意:从抽象公式直接得出结果,不得分,页数可根据内容调整) 二、画出并填写实验指导书上…

京东数据运营-京东数据开放平台-鲸参谋10月粮油调味市场品牌店铺销售数据分析

鲸参谋监测的京东平台10月份料油调味市场销售数据已出炉&#xff01; 根据鲸参谋数据显示&#xff0c;今年10月份&#xff0c;京东平台粮油调味市场的销量将近4600万&#xff0c;环比增长约10%&#xff0c;同比降低约20%&#xff1b;销售额将近19亿&#xff0c;环比增长约4%&am…

Apache Flink(一):Apache Flink是什么?

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

五、ZooKeeper的shell操作

目录 1、客户端连接 2、shell基本操作 2.1 操作命令

力扣225-用队列实现栈

文章目录 力扣225-用队列实现栈示例代码实现总结收获 力扣225-用队列实现栈 示例 代码实现 class MyStack {Queue<Integer>queue1;Queue<Integer>queue2;public MyStack() {queue1new LinkedList<Integer>();queue2new LinkedList<Integer>();}public…

【LeetCode:1094. 拼车 | 差分数组】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【高效开发工具系列】Hutool Http工具类

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

PDF转WORD

无环境的&#xff0c;windows可下载可执行文件&#xff1a;https://download.csdn.net/download/shfei10100/88588106 有python运行环境的&#xff0c;可自行运行&#xff1b; 代码如下&#xff1a; from pdf2docx import Converterimport tkinter as tk from tkinter impor…

Windows11系统下内存占用率过高如何下降

. # &#x1f4d1;前言 本文主要是win11系统下CPU占用率过高如何下降的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日…

每日一题:NowCower-JZ64.求1+2+3+...+n

每日一题系列&#xff08;day 10&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

Git and solve the problem denied to xx

创建仓库 配置Git git config user.name git config user.email git config MINGW64 /e/GithubCode $ git config --global user.name "name"MINGW64 /e/GithubCode $ git config --global user.email "mailxx.com" 生产ssh ssh-keygen -t rsa -C “xx…

选择排序以及改进方案

选择排序以及改进方案 介绍&#xff1a; 选择排序是一种简单直观的排序算法&#xff0c;它的基本思想是在未排序序列中选择最小&#xff08;或最大&#xff09;的元素&#xff0c;然后将其放在已排序序列的末尾。选择排序的过程就像是每次从待排序的元素中选择最小的一个&…

Linux:锁定部分重要文件,防止误操作

一、情景描述 比如root用户或者拥有root权限的用户&#xff0c;登陆系统后&#xff0c;通过useradd指令&#xff0c;新增一个用户。 而我们业务限制&#xff0c;只能某一个人才有权限新增用户。 那么&#xff0c;这个时候&#xff0c;我们就用chattr来锁定/etc/passwd文件&…

六、ZooKeeper Java API操作

目录 1、引入maven坐标 2、节点的操作 这里操作Zookeeper的JavaAPI使用的是一套zookeeper客户端框架 Curator ,解决了很多Zookeeper客户端非常底层的细节开发工作 。 Curator包含了几个包:

使用K-means把人群分类

1.前言 K-mean 是无监督的聚类算法 算法分类&#xff1a; 2.实现步骤 1.数据加工&#xff1a;把数据转为全数字&#xff08;比如性别男女&#xff0c;转换为0 和 1&#xff09; 2.模型训练 fit 3.预测 3.代码 原数据类似这样(source&#xff1a;http:img-blog.csdnimg.cn…

CleanMyMac X2024Macos强大的系统优化工具

都说苹果的闪存是金子做的&#xff0c;这句话并非空穴来风&#xff0c;普遍都是256G起步&#xff0c;闪存没升级一个等级&#xff0c;价格都要增加上千元。昂贵的价格让多数消费者都只能选择低容量版本的mac。而低容量的mac是很难满足用户的需求的&#xff0c;伴随着时间的推移…

FL Studio2024破解版激活注册码

FL Studio2024是功能强大的音乐制作解决方案&#xff0c;使用旨在为用户提供一个友好完整的音乐创建环境&#xff0c;让您能够轻松创建、管理、编辑、混合具有专业品质的音乐&#xff0c;一切的一切都集中在一个软件中&#xff0c;只要您想&#xff0c;只要您需要&#xff0c;它…

深入浅出 Linux 中的 ARM IOMMU SMMU III

系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的 dma_alloc_coherent()/dma_alloc_attrs() 等接口。dma_alloc_coherent()/dma_alloc_attrs() 等接口通过 DMA IOMMU 的回调分配内存&#xff0c;并为经过 IOMMU 的 DMA 内…