ActiveMQ 高级特性:延迟消息与优先级队列实战(二)
三、优先级队列实战
3.1 优先级队列概念与应用场景
优先级队列是一种特殊的队列,与普通队列按照先进先出(FIFO)的规则不同,优先级队列中的元素按照其优先级进行排序,在消费消息时,高优先级的消息会优先被处理 。这就好比在医院的急诊室,病情危急的患者(高优先级)会比病情较轻的患者(低优先级)优先得到救治。
在任务调度系统中,优先级队列有着广泛的应用。比如在一个分布式计算平台中,不同的任务可能有不同的紧急程度和重要性 。一些实时性要求高的任务,如实时数据分析任务,需要及时处理以提供最新的数据结果,这类任务可以被赋予高优先级;而一些定期执行的批量数据处理任务,如每天凌晨进行的数据备份和统计报表生成任务,实时性要求相对较低,可以设置为低优先级。通过优先级队列,系统可以优先处理高优先级的实时数据分析任务,确保数据的及时性,然后再处理低优先级的批量数据处理任务,合理利用系统资源 。
在电商系统中,订单处理也可以利用优先级队列 。对于一些 VIP 客户的订单,由于他们对商家的贡献较大,为了提供更好的服务体验,这些订单可以被设置为高优先级。而普通客户的订单则设置为低优先级。当订单处理系统从优先级队列中获取订单进行处理时,会优先处理 VIP 客户的订单,优先安排发货、配送等环节,提高 VIP 客户的满意度 。
在物流配送系统中,对于一些加急的快递(如生鲜、药品等时效性强的物品),可以将其配送任务设置为高优先级,优先安排车辆和配送人员进行配送;而普通快递则设置为低优先级,按照正常的配送流程进行处理 。这样可以确保加急快递能够按时送达,满足客户的紧急需求 。
3.2 ActiveMQ 中优先级队列的设置与原理
在 ActiveMQ 中设置优先级队列,需要从两个方面进行操作:一是配置队列属性,使其支持优先级;二是在发送消息时设置消息的优先级 。
在activemq.xml配置文件中,可以通过destinationPolicy节点下的policyEntry来配置队列的优先级属性 。例如,要配置一个名为priorityQueue的队列支持优先级,可添加如下配置:
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue="priorityQueue" prioritizedMessages="true" />
</policyEntries>
</policyMap>
</destinationPolicy>
上述配置中,prioritizedMessages="true"表示开启该队列的消息优先级功能 。配置完成后,重启 ActiveMQ 服务使配置生效 。
在代码中设置消息的优先级,JMS 规范定义了消息优先级的范围是 0 - 9,其中 0 表示最低优先级,9 表示最高优先级 。在 Java 代码中,使用 ActiveMQ 发送消息时,可以通过以下方式设置消息优先级:
import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;
public class PriorityMessageProducer {
private static final String BROKER_URL = "tcp://localhost:61616";
private static final String QUEUE_NAME = "priorityQueue";
public static void main(String[] args) throws JMSException {
// 创建连接工厂
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
// 创建连接
Connection connection = connectionFactory.createConnection();
// 启动连接
connection.start();
// 创建会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建队列
Destination destination = session.createQueue(QUEUE_NAME);
// 创建消息生产者
MessageProducer producer = session.createProducer(destination);
// 创建高优先级消息
TextMessage highPriorityMessage = session.createTextMessage("高优先级消息");
highPriorityMessage.setJMSPriority(9);
// 发送高优先级消息
producer.send(highPriorityMessage);
// 创建低优先级消息
TextMessage lowPriorityMessage = session.createTextMessage("低优先级消息");
lowPriorityMessage.setJMSPriority(1);
// 发送低优先级消息
producer.send(lowPriorityMessage);
System.out.println("消息已发送");
// 关闭资源
producer.close();
session.close();
connection.close();
}
}
在上述代码中,通过setJMSPriority方法分别为两条消息设置了不同的优先级,一条为 9(最高优先级),一条为 1(较低优先级) 。
ActiveMQ 中优先级队列的原理是,当消费者从队列中获取消息时,ActiveMQ 会根据消息的优先级属性来决定消息的出队顺序 。高优先级的消息会优先被取出,然后才是低优先级的消息 。这样就实现了按照优先级顺序处理消息的功能 。
3.3 实战案例与代码实现
3.3.1 案例背景与需求分析
假设我们正在开发一个分布式任务调度系统,系统中会接收来自不同业务模块的任务,这些任务的紧急程度和重要性各不相同 。例如,业务模块 A 可能会产生一些实时性要求极高的任务,如实时交易数据处理任务,这类任务需要立即得到处理,否则可能会影响交易的正常进行;而业务模块 B 可能会产生一些定期执行的任务,如数据统计分析任务,对实时性要求不高,可以在系统资源空闲时进行处理 。
为了确保系统能够高效地处理这些任务,需要根据任务的优先级进行调度 。高优先级的任务应该优先被分配到计算资源进行处理,低优先级的任务则在高优先级任务处理完成后再进行处理 。因此,我们需要利用 ActiveMQ 的优先级队列特性来实现任务的优先级调度功能 。
3.3.2 代码实现与配置
首先,创建一个 Spring Boot 项目,并在pom.xml文件中添加 ActiveMQ 和 Spring JMS 的依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jms</artifactId>
</dependency>
</dependencies>
然后,在application.yml文件中配置 ActiveMQ 的连接信息:
spring:
activemq:
broker-url: tcp://localhost:61616
user: admin
password: admin
接下来,在activemq.xml配置文件中配置优先级队列:
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue="TaskQueue" prioritizedMessages="true" />
</policyEntries>
</policyMap>
</destinationPolicy>
创建任务实体类Task:
import java.io.Serializable;
public class Task implements Serializable {
private static final long serialVersionUID = 1L;
private Long taskId;
private String taskName;
private int priority;
// 其他任务相关属性和getter、setter方法
}
创建消息发送服务类TaskMessageSender:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
@Service
public class TaskMessageSender {
@Autowired
private JmsTemplate jmsTemplate;
public void sendTaskMessage(Task task) {
jmsTemplate.send("TaskQueue", session -> {
// 创建对象消息,因为要传递任务对象
javax.jms.ObjectMessage objectMessage = session.createObjectMessage(task);
// 设置消息优先级,根据任务的优先级属性
objectMessage.setJMSPriority(task.getPriority());
return objectMessage;
});
}
}
创建消息接收服务类TaskMessageReceiver:
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Service;
@Service
public class TaskMessageReceiver {
@JmsListener(destination = "TaskQueue")
public void receiveTaskMessage(Task task) {
System.out.println("接收到任务:" + task.getTaskName() + ",优先级:" + task.getPriority());
// 模拟任务处理逻辑
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务 " + task.getTaskName() + " 处理完成");
}
}
在业务逻辑中,调用消息发送服务发送任务消息:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TaskController {
@Autowired
private TaskMessageSender taskMessageSender;
@PostMapping("/tasks")
public String createTask(@RequestBody Task task) {
// 模拟任务创建,设置任务ID和名称
task.setTaskId(1L);
task.setTaskName("任务-" + System.currentTimeMillis());
// 发送任务消息
taskMessageSender.sendTaskMessage(task);
return "任务已创建并发送到队列";
}
}
3.3.3 测试与验证
启动 ActiveMQ 服务和 Spring Boot 应用。使用 Postman 等工具向/tasks接口发送 POST 请求,请求体中包含不同优先级的任务信息,例如:
{
"taskId": 1,
"taskName": "实时交易数据处理任务",
"priority": 9
}
{
"taskId": 2,
"taskName": "数据统计分析任务",
"priority": 1
}
发送多个不同优先级的任务请求后,查看控制台输出 。可以看到,高优先级的任务会优先被接收和处理,低优先级的任务在高优先级任务处理完成后才会被处理 。通过这种方式,可以验证消息是否按照优先级顺序被消费,从而验证优先级队列在任务调度系统中的功能是否正常实现 。
四、高级应用与优化
4.1 延迟消息与优先级队列的结合使用
在复杂的业务场景中,将延迟消息和优先级队列结合起来使用,可以更灵活地满足业务需求 。
以电商系统的订单处理为例,假设系统中有普通订单、VIP 订单以及促销活动订单。对于普通订单,在用户下单后,如果 30 分钟内未支付,系统自动取消订单,这可以通过延迟消息来实现;对于 VIP 订单,为了提供更好的服务体验,不仅要保证其优先处理,还可以设置较短的支付超时时间(如 15 分钟),这就需要结合优先级队列和延迟消息;对于促销活动订单,由于活动期间订单量较大,为了确保活动的顺利进行,可能需要对这些订单设置较高的优先级,并且根据活动规则设置不同的延迟处理时间 。
实现思路如下:
- 配置队列:在activemq.xml文件中,配置订单队列使其支持优先级,例如:
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue="OrderQueue" prioritizedMessages="true" />
</policyEntries>
</policyMap>
</destinationPolicy>
- 发送消息:在发送订单消息时,根据订单类型设置消息的优先级和延迟时间。例如,使用 Java 代码发送订单消息:
import org.apache.activemq.ScheduledMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
@Service
public class OrderMessageSender {
@Autowired
private JmsTemplate jmsTemplate;
public void sendOrderMessage(Order order, int priority, long delay) {
jmsTemplate.send("OrderQueue", session -> {
// 创建对象消息,因为要传递订单对象
javax.jms.ObjectMessage objectMessage = session.createObjectMessage(order);
// 设置消息优先级
objectMessage.setJMSPriority(priority);
// 设置延迟发送时间,单位毫秒
objectMessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay);
return objectMessage;
});
}
}
在上述代码中,sendOrderMessage方法接收订单对象、优先级和延迟时间作为参数。根据订单类型,如 VIP 订单可以设置优先级为 9,延迟时间为 15 * 60 * 1000(15 分钟);普通订单设置优先级为 5,延迟时间为 30 * 60 * 1000(30 分钟) 。
3. 接收消息:消费者从队列中接收消息时,ActiveMQ 会根据消息的优先级和延迟时间,优先处理高优先级且延迟时间已到的消息 。消费者代码与前面介绍的类似,通过@JmsListener注解监听队列并处理消息:
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Service;
@Service
public class OrderMessageReceiver {
@JmsListener(destination = "OrderQueue")
public void receiveOrderMessage(Order order) {
// 处理订单逻辑
}
}
4.2 性能优化与注意事项
在使用延迟消息和优先级队列时,可能会出现一些性能问题,需要采取相应的优化措施和注意事项 。
性能问题:
- 消息堆积:如果生产者发送消息的速度远大于消费者处理消息的速度,无论是延迟消息还是普通消息,都会导致消息在队列中堆积,占用大量的内存和磁盘空间,影响系统性能 。特别是在高并发场景下,若优先级队列中高优先级消息持续产生,低优先级消息可能会长时间得不到处理,进一步加剧消息堆积 。
- 资源消耗:ActiveMQ 在处理延迟消息时,需要维护一个调度任务列表,随着延迟消息数量的增加,调度任务的管理和执行会消耗更多的 CPU 和内存资源 。对于优先级队列,在排序和调度消息时也会增加系统开销 。
优化建议:
- 合理设置队列参数:通过调整队列的concurrentConsumers(并发消费者数量)和prefetch(预取数量)等参数,可以提高消息的消费速度 。例如,在activemq.xml文件中配置:
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue="OrderQueue" concurrentConsumers="10" prefetch="50" />
</policyEntries>
</policyMap>
</destinationPolicy>
上述配置中,concurrentConsumers="10"表示允许同时有 10 个消费者处理该队列的消息,prefetch="50"表示每个消费者一次从队列中预取 50 条消息,具体数值可根据实际业务量和系统性能进行调整 。
- 使用异步处理:在消费者端,对于消息的处理逻辑可以采用异步方式,如使用线程池来处理消息,避免单个消息处理时间过长导致其他消息等待 。例如:
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Service;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@Service
public class OrderMessageReceiver {
private static final ExecutorService executorService = Executors.newFixedThreadPool(5);
@JmsListener(destination = "OrderQueue")
public void receiveOrderMessage(Order order) {
executorService.submit(() -> {
// 处理订单逻辑
});
}
}
在上述代码中,创建了一个固定大小为 5 的线程池,当接收到消息时,将消息处理任务提交到线程池中异步执行 。
- 优化消息存储:对于持久化的消息,选择合适的持久化策略和存储介质可以提高性能 。例如,使用 KahaDB 存储时,可以通过调整数据文件大小等参数来优化存储性能;使用数据库持久化时,优化数据库表结构和索引,提高数据读写速度 。
注意事项:
- 优先级设置的合理性:在设置消息优先级时,要根据业务的实际需求合理分配优先级,避免出现优先级设置混乱导致重要消息得不到及时处理的情况 。同时,要注意不同队列之间的优先级是相互独立的,不要混淆 。
- 延迟时间的准确性:设置延迟消息的延迟时间时,要考虑系统的时间精度和误差,确保延迟时间能够满足业务需求 。如果延迟时间设置过短,可能无法达到预期的延迟效果;设置过长,则可能导致业务处理不及时 。
五、总结与展望
在分布式系统开发中,ActiveMQ 的延迟消息和优先级队列特性为解决复杂业务场景下的消息处理问题提供了强大的支持 。通过本次实战,我们深入了解了这两个特性的概念、实现方式以及在实际项目中的应用 。
在延迟消息方面,我们掌握了使用 TimeToLive 属性和 Scheduled Message 机制两种实现方式。TimeToLive 属性实现简单,适用于对延迟时间精度要求不高的场景;Scheduled Message 机制则更加灵活,能够满足复杂的定时任务需求 。通过电商系统订单支付超时取消的案例,我们看到了延迟消息在实际业务中的具体应用,有效地提高了系统的自动化处理能力和业务的准确性 。
对于优先级队列,我们学会了在 ActiveMQ 中配置队列支持优先级,并在发送消息时设置消息的优先级 。通过分布式任务调度系统的案例,验证了优先级队列能够根据任务的优先级进行合理调度,确保高优先级任务优先得到处理,提高了系统的整体效率和性能 。
将延迟消息和优先级队列结合使用,进一步拓展了 ActiveMQ 在复杂业务场景中的应用。通过电商系统订单处理的案例,展示了如何根据订单类型设置不同的优先级和延迟时间,实现了更加灵活和高效的业务处理逻辑 。
在未来,随着分布式系统的不断发展和业务需求的日益复杂,消息队列技术也将不断演进 。ActiveMQ 作为一款成熟的消息中间件,有望在性能优化、功能扩展等方面持续发展,更好地满足开发者的需求 。例如,在性能优化方面,可能会进一步改进消息的存储和调度算法,提高消息处理的速度和吞吐量;在功能扩展方面,可能会支持更多的消息协议和高级特性,如与云原生技术的深度融合,为分布式系统的开发提供更强大的支持 。同时,我们也期待 ActiveMQ 能够在更多的领域和场景中得到应用,为企业的数字化转型和业务创新提供有力的支撑 。
相关文章:
ActiveMQ 高级特性:延迟消息与优先级队列实战(二)
三、优先级队列实战 3.1 优先级队列概念与应用场景 优先级队列是一种特殊的队列,与普通队列按照先进先出(FIFO)的规则不同,优先级队列中的元素按照其优先级进行排序,在消费消息时,高优先级的消息会优先被…...
ActiveMQ 高级特性:延迟消息与优先级队列实战(一)
引言 在当今的分布式系统开发中,消息中间件扮演着至关重要的角色,而 ActiveMQ 作为一款广泛使用的开源消息中间件,凭借其丰富的特性和良好的性能,深受开发者的青睐。它支持多种消息模型,如点对点和发布 / 订阅&#x…...
动手学深度学习12.4.硬件-笔记练习(PyTorch)
以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。 本节课程地址:31 深度学习硬件:CPU 和 GPU【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&am…...
LAN-402 全国产信号采集处理模块K7-325T(4通道采集)
UD LAN-402全国产化信号处理模块最多支持2通道16bit125Msps的短波采集(或2通道14bit250Msps超短波采集)、2通道16bit310Msps超短波采集,可选配XC7K325T、XC7K410T、JFM7K325T、JFM7K410T FPGA芯片,对外支持PCIe2.0x8接口、千兆网、…...
关于大语言模型的困惑度(PPL)指标优势与劣势
1. 指标本身的局限性 与人类感知脱节: PPL衡量的是模型对词序列的预测概率(基于交叉熵损失),但低困惑度未必对应高质量的生成结果。例如: 模型可能生成语法正确但内容空洞的文本(PPL低但质量差)…...
[Spring AOP 8] Spring AOP 源码全流程总结
Spring AOP总结 更美观清晰的版本在:Github 前面的章节: [Spring AOP 1] 从零开始的JDK动态代理 [Spring AOP 2] 从零开始的CGLIB动态代理 [Spring AOP 3] Spring选择代理 [Spring AOP 4] Spring AOP 切点匹配 [Spring AOP 5] 高级切面与低级切面&#…...
通信网络编程——JAVA
1.计算机网络 IP 定义与作用 :IP 地址是在网络中用于标识设备的数字标签,它允许网络中的设备之间相互定位和通信。每一个设备在特定网络环境下都有一个唯一的 IP 地址,以此来确定其在网络中的位置。 分类 :常见的 IP 地址分为 I…...
支持向量机算法
支持向量机(Support Vector Machine,SVM)作为机器学习领域中一颗耀眼的明星,凭借其卓越的分类与回归能力,在众多算法中独树一帜。它宛如一位精准的边界守护者,通过巧妙地构建超平面,将不同类别的…...
Redis集群模式、持久化、过期策略、淘汰策略、缓存穿透雪崩击穿问题
Redis四种模式 单节点模式 架构:单个Redis实例运行在单台服务器。 优点: 简单:部署和配置容易,适合开发和测试。 低延迟:无网络通信开销。 缺点: 单点故障&…...
【WPF】Opacity 属性的使用
在WPF(Windows Presentation Foundation)中,Opacity 属性是定义一个元素透明度的属性,其值范围是从 0.0(完全透明)到 1.0(完全不透明)。由于 Opacity 是在 UIElement 类中定义的&…...
编程题 02-线性结构3 Reversing Linked List【PAT】
文章目录 题目输入格式输出格式输入样例输出样例 题解解题思路完整代码 编程练习题目集目录 题目 Given a constant K K K and a singly linked list L L L, you are supposed to reverse the links of every K K K elements on L L L. For example, given L being 1 → …...
集成指南:如何采用融云 Flutter IMKit 实现双端丝滑社交体验
在移动应用开发领域,跨平台框架的广泛应用已成为一种趋势。 融云跨平台方案持续升级,近期正式上线 Flutter IMKit,uni-app IMKit 也将紧随其后向广大开发者开放。覆盖两大跨平台核心框架,一套代码即可支持 Android、iOS 双端丝滑…...
使用vite重构vue-cli的vue3项目
一、修改依赖 首先修改 package.json,修改启动方式与相应依赖 移除vue-cli并下载vite相关依赖,注意一些peerDependency如fast-glob需要手动下载 # 移除 vue-cli 相关依赖 npm remove vue/cli-plugin-babel vue/cli-plugin-eslint vue/cli-plugin-rout…...
LeetCode 2094.找出 3 位偶数:遍历3位偶数
【LetMeFly】2094.找出 3 位偶数:遍历3位偶数 力扣题目链接:https://leetcode.cn/problems/finding-3-digit-even-numbers/ 给你一个整数数组 digits ,其中每个元素是一个数字(0 - 9)。数组中可能存在重复元素。 你…...
FLASH闪存(擦除、编译)
FLASH闪存 文章目录 FLASH闪存1.存储器映像位置2.FLASH简介3.闪存模块组织3.2闪存的共性: 4.FLASH基本结构4.1FLASH解锁4.2使用指针访问寄存器 5.选项字节5.1选项字节编程5.2选项字节擦除 6.相关函数介绍7.读取内部FLASH(实操)7.1接线图7.2工…...
企业即时通讯软件,私有化安全防泄密
在数字化转型与信创战略双重驱动下,企业对即时通讯工具的需求已从基础沟通转向安全可控、高效协同的综合能力。BeeWorks作为一款专为政企设计的私有化即时通讯与协同办公平台,凭借其全链路安全架构、深度国产化适配及灵活的业务集成能力,成为…...
直方图特征结合 ** 支持向量机图片分类
一、核心技术框架 1. 直方图特征原理 颜色直方图:统计图像中每个颜色区间(如 RGB 通道)的像素数量,反映颜色分布。HOG 直方图(方向梯度直方图):统计图像局部区域的梯度方向分布,捕…...
【prometheus+Grafana篇】基于Prometheus+Grafana实现windows操作系统的监控与可视化
💫《博主主页》: 🔎 CSDN主页 🔎 IF Club社区主页 🔥《擅长领域》:擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(MongoDB)有了…...
PyTorch实战(4)——卷积神经网络(Convolutional Neural Network, CNN)详解
PyTorch实战(4)——卷积神经网络详解 0. 前言1. 全连接网络的缺陷2. 卷积神经网络基本组件2.1 卷积2.2 步幅和填充2.3 池化2.3 卷积神经网络完整流程 3. 卷积和池化相比全连接网络的优势4. 使用 PyTorch 构建卷积神经网络4.1 使用 PyTorch 构建 CNN 架构…...
【Python】Python常用控制结构详解:条件判断、遍历与循环控制
Python提供了多种控制结构来处理逻辑判断和循环操作,包括if-else条件分支、switch替代方案、遍历方法以及循环控制语句break和continue。以下是对这些功能的详细说明及示例: 一、条件判断:if-else与多分支结构 单分支结构 • 语法࿱…...
在Linux中安装JDK并且搭建Java环境
1.首先准备好JDK的Linux的安装包 2.打开Linux,进入root的文件夹,直接拖入即可 3.输入解压命令,后面指定的是位置(注意不要填写错误,就填写这个) 4.之后进入我们安装的jdk的文件 利用pwd命令,展示我们安装的目录,之后…...
理解多智能体深度确定性策略梯度MADDPG算法:基于python从零实现
引言:多智能体强化学习(MARL) 多智能体强化学习(MARL)将强化学习拓展到多个智能体在共享环境中相互交互的场景。这些智能体可能相互合作、竞争,或者目标混杂。MARL 引入了单智能体设置中不存在的独特挑战。…...
【AI大语言模型本质分析框架】
AI大语言模型本质分析框架 ——从教育危机到智能本质的七层递进式解构 第一层:现象观察——阴(显性危机)与阳(隐性变革)的共存 观点1(阴):AI作弊泛滥,传统教育体系崩溃…...
算法模型部署后_python脚本API测试指南-记录3
API 测试指南 服务运行后,可以通过以下方式测试: Curl: curl -X POST -F "file./test_dataset/surface/surface57.png" http://<服务器IP>:9000/api/v1/predictPython 脚本: (参考 svm_request测试.py) import requestsurl http://…...
鸿蒙(HarmonyOS)应用开发入门教程
目录 第一章:鸿蒙系统简介 1.1 什么是鸿蒙系统? 1.2 鸿蒙系统架构 第二章:开发环境搭建 2.1 安装DevEco Studio 步骤1:下载与安装 步骤2:首次配置 步骤3:设备准备 2.2 创建第一个项目 第三章:鸿蒙应用开发基础 3.1 核心概念:Ability与AbilitySlice 示例代码…...
MIT XV6 - 1.6 Lab: Xv6 and Unix utilities -uptime
接上文 MIT XV6 - 1.5 Lab: Xv6 and Unix utilities - xargs 第一章持续有点久了,虽然肯定有些特点和细节还没注意到,但这次的主要目的是学习内核部分,决定水一篇然后进入第二章节 uptime 第一章的最后一个实验,选做性质…...
Python语言在地球科学交叉领域中的应用——从数据可视化到常见数据分析方法的使用【实例操作】
前言: Python是功能强大、免费、开源,实现面向对象的编程语言,Python能够运行在Linux、Windows、Macintosh、AIX操作系统上及不同平台(x86和arm),Python简洁的语法和对动态输入的支持,再加上解释…...
flutter 的 json序列化和反序列化
一、json转实体 Instantly parse JSON in any language | quicktype 二、实体中的toJson和fromJson 实现 官方推荐的 两个插件(个人觉得一个实体会多一个.g.dart 文件太多了,不喜欢) json_annotation json_serializable 三、使用 dart_json_mapper 实现上面的功…...
什么是数据集市(Data Mart)?
数据集市(Data Mart)是数据仓库(Data Warehouse)的一个子集,专门针对某个特定业务部门、业务线或主题领域,存储和管理该部门或领域所需的特定数据。它通常包含从企业范围的数据仓库中抽取、筛选和汇总的部分…...
从攻击者角度来看Go1.24的路径遍历攻击防御
目录 一、具体攻击示例 程序 攻击步骤: 二、为什么攻击者能成功? 分析 类比理解 总结 三、TOCTOU 竞态条件漏洞 1、背景:符号链接遍历攻击 2. TOCTOU 竞态条件漏洞 3. 另一种变体:目录移动攻击 4. 问题的核心 四、防…...
[ARM][汇编] 01.基础概念
目录 1.全局标号 1.1.使用方法 1.1.1.声明全局标号 1.1.2.定义全局标号 1.1.3.引用全局标号 1.2.全局标号与局部标号的区别 1.3.注意事项 2.局部标号 2.1.使用方法 2.1.1.定义局部标号 2.1.2.跳转引用 2.2.局部标号与全局标号的对比 2.3.注意事项 3.符号定义伪指…...
杭州电商全平台代运营领军者——品融电商
杭州电商全平台代运营领军者——品融电商:以“效品合一”驱动品牌全域增长 在电商行业竞争日益白热化的当下,品牌如何突破流量焦虑、实现长效增长?作为中国领先的品牌化电商服务商,杭州品融电商(PINKROON)…...
02.Golang 切片(slice)源码分析(一、定义与基础操作实现)
Golang 切片(slice)源码分析(一、定义与基础操作实现) 注意当前go版本代码为1.23 一、定义 slice 的底层数据是数组,slice 是对数组的封装,它描述一个数组的片段。两者都可以通过下标来访问单个元素。 数…...
当生产了~/qt-arm/bin/qmake,可以单独编译其他-源码的某个模块,如下,编译/qtmultimedia
cd ~/qt-everywhere-src-5.15.2/qtmultimedia # 设置交叉编译器和 qmake 路径 export CC/usr/bin/aarch64-linux-gnu-gcc export CXX/usr/bin/aarch64-linux-gnu-g export QMAKE~/qt-arm/bin/qmake # 使用已安装的 qmake export QT_INSTALL_PREFIX~/qt-arm # 安装路径 # 配…...
WordPress 网站上的 jpg、png 和 WebP 图片插件
核心功能 1. 转换 AVIF 并压缩 AVIF 将您 WordPress 网站上的 jpg、png 和 WebP 图片转换为 AVIF 格式,并根据您设置的压缩级别压缩 AVIF 图片。如果原始图片已经是 WordPress 6.5 以上支持的 AVIF 格式,则原始 AVIF 图片将仅被压缩。 2. 转换 WebP 并…...
构造+简单树状
昨日的牛客周赛算是比较简单的,其中最后一道构造题目属实眼前一亮。 倒数第二个题目也是一个很好的模拟题目(考验对二叉树的理解和代码的细节) 给定每一层的节点个数,自己拟定一个父亲节点,构造一个满足条件的二叉树。…...
Flask支持哪些日志框架
目录 ✅ Flask 默认支持的日志框架 ✅ 默认推荐:logging(标准库) ✅ 进阶推荐:Loguru(更优雅的日志库) ✅ Flask 日志级别说明(与标准库一致) ✅ 生产环境建议 ✅ 总结推荐 在 Flask 中,默认的日志系统是基于 Python 标准库 logging 模块 构建的。 ✅ Flask 默认…...
健康养生指南:解锁活力生活的科学密码
健康是人生最珍贵的财富,在快节奏的现代生活中,掌握科学的养生方法至关重要。虽然不借助中医理念,我们依然可以从饮食、运动、睡眠等多个方面入手,打造健康生活方式。 合理的饮食是健康的基石。遵循均衡饮食原则,保证每…...
SAR图像压缩感知
SAR图像压缩感知 matlab代码 对应着汕大闫老师的那本压缩感知及其应用,有需要的可以看一下!! SAR图像压缩感知/baboon.bmp , 66616 SAR图像压缩感知/camera.bmp , 66616 SAR图像压缩感知/DWT.m , 1265 SAR图像压缩感知/Gauss.m , 373 SAR图像…...
定时器设计
定时器设计的必要性 服务器中的定时器设计具有多方面的必要性,主要体现在以下几个关键方面: 任务调度与管理 定时任务执行:服务器常常需要执行一些定时性的任务,如定时备份数据、定时清理缓存、定时更新系统日志等。通过定时器可…...
Spring Boot整合Kafka实战指南:从环境搭建到消息处理全解析
一、环境准备 安装 Kafka 下载 Kafka:从 Apache Kafka 官网下载对应版本的 Kafka。 解压并启动 Kafka: # 启动 Zookeeper(Kafka 依赖 Zookeeper) bin/zookeeper-server-start.sh config/zookeeper.properties# 启动 Kafka bin/ka…...
(done) 补充:xv6 的一个用户程序 init 是怎么启动的 ?它如何启动第一个 bash ?
先看 main.c 从函数名来看,比较相关的就 userinit() 和 scheduler() #include "types.h" #include "param.h" #include "memlayout.h" #include "riscv.h" #include "defs.h"volatile static int started 0;//…...
AI 搜索引擎 MindSearch
背景 RAG是一种利用文档减少大模型的幻觉,AI搜索也是 AI 搜索引擎 MindSearch 是一个开源的 AI 搜索引擎框架,具有与 Perplexity.ai Pro 相同的性能。您可以轻松部署它来构建您自己的搜索引擎,可以使用闭源 LLM(如 GPT、Claude…...
HTML简单语法标签(后续实操:云备份项目)
以下是一些 HTML 的简单语法标签及其功能介绍: 基本结构标签 <!DOCTYPE html>:声明文档类型为 HTML5<html>:HTML 文档的根标签<head>:包含文档元数据(如标题、字符编码等)<title>…...
CentOS 和 RHEL
CentOS 和 RHEL(Red Hat Enterprise Linux)关系非常紧密,简而言之: CentOS 最初是 RHEL 的免费、开源克隆版,几乎与 RHEL 二进制兼容。 CentOS 原是 RHEL 的“免费双胞胎”,但已被放弃,现在推荐…...
java----------->代理模式
目录 什么是代理模式? 为什么会有代理模式? 怎么写代理模式? 实现代理模式总共需要三步: 什么是代理模式? 代理模式:给目标对象提供一个代理对象,并且由代理对象控制目标对象的引用 代理就是…...
Wpf学习片段
IRegionManager 和IContainerExtension IRegionManager 是 Prism 框架中用于管理 UI 区域(Regions)的核心接口,它实现了模块化应用中视图(Views)的动态加载、导航和生命周期管理。 IContainerExtension 是依赖注入&…...
智能手表测试用例文档
智能手表测试用例文档 产品名称:智能手表 A1 版本号:FW v1.0.0 测试负责人:[填写] 编写时间:2025-xx-xx 文档状态:初次版本 📁 测试用例结构说明 字段描述用例编号测试用例唯一编号,如 TC-FUN…...
密码学--希尔密码
一、实验目的 1、通过实现简单的古典密码算法,理解密码学的相关概念 2、理解明文、密文、加密密钥、解密密钥、加密算法、解密算法、流密码与分组密码等。 二、实验内容 1、题目内容描述 ①定义分组字符长度 ②随机生成加密密钥,并验证密钥的可行性 …...
配置Hadoop集群-集群配置
以下是 Hadoop 集群的核心配置步骤,基于之前的免密登录和文件同步基础,完成 Hadoop 分布式环境的搭建: 1. 集群规划 假设集群包含 3 个节点: master:NameNode、ResourceManagerslave1:DataNode、NodeMana…...