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

使用 Java 实现一个简单且高效的任务调度框架

目录

一、任务调度系统概述

(一)任务调度的目标

(二)任务调度框架的关键组成

二、任务状态设计

(一)任务状态流转设计

(二)任务表设计(SQL)

三、单机任务调度实现

(一)获取待处理任务

(二)执行任务

代码实现(单线程版本)

(三)多线程提高吞吐量

四、使用阻塞队列解耦生产者-消费者

五、分布式任务调度

(一)分片ID(取模分片)

(二)中心化调度(使用 Redis)

六、结论


干货分享,感谢您的阅读!

在实际业务中,任务调度系统负责从任务队列中获取任务并执行。为了满足高吞吐、高可用、轻量级及可扩展性等需求,任务调度系统的设计必须具备灵活性、可伸缩性和容错性。

本文将展示如何使用 Java 实现一个简单且高效的任务调度框架,并深入探讨每个设计要点,包括任务状态管理、任务并发执行、分布式处理等内容。

一、任务调度系统概述

任务调度系统广泛应用于各种业务场景中,任务往往是异步执行的,需要管理任务的生命周期、处理任务的优先级、失败重试、任务超时等问题。

(一)任务调度的目标

  • 高吞吐量:任务处理速度需要尽可能快。

  • 高可用性:任务调度系统在遇到故障时能够恢复并继续处理任务。

  • 低延迟:任务提交后能迅速被处理。

  • 易于扩展:可以轻松应对任务量的增加,适应分布式环境。

(二)任务调度框架的关键组成

  • 任务状态管理:追踪任务的执行状态。

  • 任务执行策略:决定如何执行任务,包括单机和分布式执行策略。

  • 任务失败与重试机制:处理任务失败后如何重试。

  • 系统监控与报警:对任务执行情况进行实时监控,发现异常时报警。

二、任务状态设计

(一)任务状态流转设计

任务的状态管理是调度系统的核心。任务需要在生命周期内从一个状态流转到另一个状态。常见的任务状态有:

  • INIT:任务初始状态,表示任务已创建但尚未处理。

  • PROCESSING:任务正在处理中,标识任务已被调度但尚未完成。

  • SUCCESS:任务执行成功。

  • FAILED:任务执行失败。

  • RETRY:任务执行失败后需要重试。

任务状态流转的主要问题是如何避免任务的重复执行、如何保证任务在失败时的容错性和可靠性。

(二)任务表设计(SQL)

任务表记录了任务的当前状态及其他元数据,如任务类型、优先级、执行时间等。

CREATE TABLE task (task_id BIGINT AUTO_INCREMENT PRIMARY KEY,task_type VARCHAR(255) NOT NULL,status ENUM('INIT', 'PROCESSING', 'SUCCESS', 'FAILED', 'RETRY') DEFAULT 'INIT',priority INT DEFAULT 0,retry_count INT DEFAULT 0,create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,execute_time TIMESTAMP NULL
);

三、单机任务调度实现

(一)获取待处理任务

首先,我们需要从数据库中获取状态为 INIT 的任务,并按优先级和创建时间排序,优先处理高优先级和较早创建的任务。

SELECT * FROM task WHERE status = 'INIT' 
ORDER BY priority DESC, create_time ASC LIMIT 10;

(二)执行任务

当获取到待处理任务时,系统将执行这些任务,并在任务执行结束后更新任务的状态。对于任务失败的情况,我们可以设置重试机制,最多重试一定次数。

代码实现(单线程版本)
public class TaskScheduler {private static final int SLEEP_INTERVAL = 5000; // 每5秒检查一次任务private TaskRepository taskRepository; // 任务存储库(假设是数据库)public TaskScheduler(TaskRepository taskRepository) {this.taskRepository = taskRepository;}public void start() {while (true) {Task task = getPendingTask();if (task != null) {try {executeTask(task);updateTaskStatus(task.getTaskId(), "SUCCESS");} catch (Exception e) {updateTaskStatus(task.getTaskId(), "FAILED");}} else {try {Thread.sleep(SLEEP_INTERVAL); // 无任务,休眠} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}private Task getPendingTask() {return taskRepository.findFirstByStatusOrderByPriorityDescCreateTimeAsc("INIT");}private void executeTask(Task task) {// 任务执行逻辑,具体实现根据任务类型而定System.out.println("Executing task: " + task.getTaskId());}private void updateTaskStatus(Long taskId, String status) {taskRepository.updateStatus(taskId, status);}
}

(三)多线程提高吞吐量

在单线程模型下,任务处理速度较慢,我们可以通过使用线程池来提高并发性。线程池会创建一定数量的线程,并行执行多个任务,从而提升系统的吞吐量。

public class TaskScheduler {private static final int THREAD_POOL_SIZE = 10; // 线程池大小private static final int SLEEP_INTERVAL = 5000;private TaskRepository taskRepository;private ExecutorService executorService;public TaskScheduler(TaskRepository taskRepository) {this.taskRepository = taskRepository;this.executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);}public void start() {while (true) {Task task = getPendingTask();if (task != null) {executorService.submit(() -> {try {executeTask(task);updateTaskStatus(task.getTaskId(), "SUCCESS");} catch (Exception e) {updateTaskStatus(task.getTaskId(), "FAILED");}});} else {try {Thread.sleep(SLEEP_INTERVAL); // 无任务,休眠} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}private Task getPendingTask() {return taskRepository.findFirstByStatusOrderByPriorityDescCreateTimeAsc("INIT");}private void executeTask(Task task) {// 任务执行逻辑System.out.println("Executing task: " + task.getTaskId());}private void updateTaskStatus(Long taskId, String status) {taskRepository.updateStatus(taskId, status);}
}

四、使用阻塞队列解耦生产者-消费者

为了更好地解耦任务生产者和消费者,我们可以使用阻塞队列。生产者从任务表中拉取任务并放入队列,消费者从队列中取任务并执行。这种方式能够有效地隔离任务生产和消费的压力。

import java.util.concurrent.*;public class TaskScheduler {private static final int THREAD_POOL_SIZE = 10;private static final int SLEEP_INTERVAL = 5000;private static final BlockingQueue<Task> taskQueue = new LinkedBlockingQueue<>();private TaskRepository taskRepository;private ExecutorService executorService;public TaskScheduler(TaskRepository taskRepository) {this.taskRepository = taskRepository;this.executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);}public void start() {// 启动消费者线程池for (int i = 0; i < THREAD_POOL_SIZE; i++) {executorService.submit(this::consumeTasks);}// 生产者循环,持续从数据库拉取任务并放入队列while (true) {Task task = getPendingTask();if (task != null) {try {taskQueue.put(task); // 将任务放入队列updateTaskStatus(task.getTaskId(), "PROCESSING");} catch (InterruptedException e) {Thread.currentThread().interrupt();}} else {try {Thread.sleep(SLEEP_INTERVAL); // 无任务,休眠} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}private void consumeTasks() {while (true) {try {Task task = taskQueue.take(); // 从队列中取任务executeTask(task);updateTaskStatus(task.getTaskId(), "SUCCESS");} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}private Task getPendingTask() {return taskRepository.findFirstByStatusOrderByPriorityDescCreateTimeAsc("INIT");}private void executeTask(Task task) {// 任务执行逻辑System.out.println("Executing task: " + task.getTaskId());}private void updateTaskStatus(Long taskId, String status) {taskRepository.updateStatus(taskId, status);}
}

五、分布式任务调度

随着任务量的增加,单机版的任务调度框架可能会遇到性能瓶颈。此时,我们可以考虑分布式任务调度框架。

(一)分片ID(取模分片)

将任务根据 task_id 进行分片处理,每个机器只负责一个特定范围的任务。

例如,通过 task_id % N 来决定任务属于哪个分片,这样可以使每台机器只处理一部分任务。

(二)中心化调度(使用 Redis)

我们可以使用 Redis 来实现分布式任务调度。任务生产者将任务推送到 Redis 队列,任务消费者从队列中获取任务并执行。

import redis.clients.jedis.Jedis;public class DistributedTaskScheduler {private Jedis jedis;private ExecutorService executorService;public DistributedTaskScheduler(Jedis jedis) {this.jedis = jedis;this.executorService = Executors.newFixedThreadPool(10);}public void start() {while (true) {String taskJson = jedis.blpop(0, "taskQueue").get(1); // 阻塞式取任务Task task = deserializeTask(taskJson);executorService.submit(() -> {try {executeTask(task);updateTaskStatus(task.getTaskId(), "SUCCESS");} catch (Exception e) {updateTaskStatus(task.getTaskId(), "FAILED");}});}}private void executeTask(Task task) {// 任务执行逻辑System.out.println("Executing task: " + task.getTaskId());}private void updateTaskStatus(Long taskId, String status) {// 更新任务状态}private Task deserializeTask(String taskJson) {return new Gson().fromJson(taskJson, Task.class);}
}

六、结论

本文介绍了如何设计并实现一个简单的高吞吐、高可用的任务调度系统。我们从任务的状态管理、任务的并发执行、失败重试机制到分布式任务调度等方面进行了详细的探讨。通过合适的设计模式和技术栈,我们能够实现一个灵活且高效的任务调度系统,满足业务需求并具备良好的扩展性和容错性。

未来可以在此框架的基础上增加更多的功能,例如任务优先级、任务分片、动态调整线程池、任务监控与报警等。

相关文章:

使用 Java 实现一个简单且高效的任务调度框架

目录 一、任务调度系统概述 &#xff08;一&#xff09;任务调度的目标 &#xff08;二&#xff09;任务调度框架的关键组成 二、任务状态设计 &#xff08;一&#xff09;任务状态流转设计 &#xff08;二&#xff09;任务表设计&#xff08;SQL&#xff09; 三、单机任…...

Git 完整教程:初学者分步指南

大家好&#xff0c;这里是架构资源栈&#xff01;点击上方关注&#xff0c;添加“星标”&#xff0c;一起学习大厂前沿架构&#xff01; Git 是一个分布式版本控制系统&#xff0c;可以帮助开发人员跟踪代码更改、与他人协作以及高效管理软件项目。无论您是初学者还是正在提升…...

数字智慧方案5856丨智慧环保综合解决方案(50页PPT)(文末有下载方式)

资料解读&#xff1a;智慧环保综合解决方案 详细资料请看本解读文章的最后内容。 随着城市化进程的加速和环境问题的日益严峻&#xff0c;智慧环保成为提升城市环境管理水平的重要手段。本文将对智慧环保综合解决方案进行详细解读&#xff0c;探讨其在实际应用中的需求、解决…...

VBA快速合并多列单元格

实例需求&#xff1a;工作表中第3行到第5行有如下图所示的数据表&#xff0c;为了方便展示&#xff0c;隐藏了部分列&#xff0c;实际数据为从C列到DO列。 现需要合并第3行和第4行相同内容的单元格&#xff0c;如第10行到第12行所示。 示例代码如下。 Sub MergeDemo()Dim dicM…...

区块链+IoT:创新场景落地背后的技术攻坚战

物联网&#xff08;IoT&#xff09;与区块链技术作为两大颠覆性技术&#xff0c;正通过深度融合推动各行各业的数字化转型。物联网通过连接海量设备实现数据互通与智能化管理&#xff0c;而区块链凭借去中心化、不可篡改和可追溯的特性&#xff0c;为物联网的安全性、隐私保护和…...

自动化测试项目2 --- 比特纵横 [软件测试实战 Java 篇]

目录 项目介绍 项目源码 库地址 项目功能测试 1. 自动化实施步骤 1.1 编写测试用例 1.2 自动化测试脚本开发 1.2.1 配置相关环境, 添加依赖 1.2.2 代码编写 2. 编写自动化脚本过程问题总结 2.1 Actons 方法的使用 2.2 等待的使用 2.3 页面操作 项目性能测试 1. 进…...

【学习笔记】深入理解Java虚拟机学习笔记——第1章 走进Java

第1章 走进Java 1.1 概述 Java成功的原因 1>一次编写到处运行 2>内存管理安全&#xff0c;自动回收 3>运行时编译 4>强大成熟的第三方库 1.2 Java技术体系 1>Java技术体系组成&#xff1a; -Java语言 -Java虚拟机实现 -class文件格式 -Java类库API -第三方J…...

JavaScript性能优化实战之运行时性能优化

在 JavaScript 开发中,运行时性能优化是确保网页响应迅速和流畅的重要环节。优化运行时性能不仅能提高用户体验,还能在高并发的情况下保证应用的稳定性。本文将细化几个常见的 JavaScript 运行时性能优化策略,帮助你提高代码执行效率。 1️⃣ 避免不必要的内存分配和释放 J…...

走进AI的奇妙世界:探索历史、革命与未来机遇

2022年11月30日&#xff0c;ChatGPT的横空出世像一枚深水炸弹&#xff0c;掀起了全球范围的AI狂潮。但这场革命并非偶然——它背后是80年AI发展史的厚积薄发。从图灵的哲学思辨到深度学习的技术突破&#xff0c;再到生成式AI的“涌现”时刻&#xff0c;AI正以惊人的速度模糊人机…...

用c 编写的笔记搜索程序

{XXX文本记录} 文本记录格式 xxx 搜索词条 #include <stdio.h> #include <string.h> #include <stdlib.h>int main(void){FILE *ffopen("help.txt","r");if(fNULL){perror("file");return -1;}char nr[2000];f…...

鼎讯信通 智能通信干扰设备:多频段多模态信号压制解决方案

在万物互联时代&#xff0c;通信安全已成为现代社会的核心基础设施防护重点。面对日益复杂的电磁环境挑战&#xff0c;新一代智能通信干扰设备通过技术创新实现了信号压制能力的革命性突破。本文将深入解析该设备的八大核心功能与技术特性&#xff0c;展现其在商业通信保障、工…...

软件测试概念

这里写目录标题 需求开发模型软件生命周期瀑布模型螺旋模型增量模型、迭代模型敏捷模型Scrum 测试模型V模型W模型&#xff08;双V模型&#xff09; 需求 用户需求&#xff1a;没有经过合理的评估&#xff0c;通常就是一句话 软件需求&#xff1a;是开发人员和测试人员执行工作…...

数据库性能杀手与调优实践

目录 前言一、索引缺失引发的全表扫描灾难1.现象与影响2.优化策略 二、SELECT * 的隐性成本1.危害分析2.优化实践 三、分页查询的性能陷阱1.深度分页问题2.优化方案对比 四、执行计划分析方法论1.关键指标解读2.典型劣化模式识别 五、综合优化最佳实践总结 前言 在数据库应用开…...

初始化列表详解

1.类中包含以下成员&#xff0c;必须放在初始化列表位置进行初始化&#xff1a; 1. 引用成员变量 2.const成员变量 3. 自定义类型成员(且该类没有默认构造函数时 ) 2. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序&#xff0c;与其在初始化列表中的先后次序无关…...

【CVE-2025-1094】:PostgreSQL 14.15 SQL注入漏洞导致的RCE_ 利用代码和分析

目标 PostgreSQL 14.15BeyondTrust Privileged Remote Access (PRA) 和 Remote Support (RS) 软件受影响的版本:使用PostgreSQL 14.15及其版本的BeyondTrust产品Explain CVE-2025-1094 是 PostgreSQL 14.15 版本的 psql 交互式工具中发现的 SQL 注入漏洞。由于输入值的验证不…...

【验证技能】VIP项目大总结

VIP项目快做一段落了&#xff0c;历时一年半&#xff0c;也该要一个大汇总。 VIP简介 VIP开发流程 VIP难点 进程同步 打拍插入不同bit位宽数据问题。 动态升降lane VIP做的不好的地方和改进想法 各层之间交互 testsuite两端关键 所有层的实现架构不统一 VIP经验 ** 架构…...

MyBatis 参数处理全解析

在 Java 开发领域&#xff0c;MyBatis 作为一款优秀的持久层框架&#xff0c;凭借其简洁的设计和强大的功能&#xff0c;受到了广大开发者的青睐。而参数处理作为 MyBatis 中一个至关重要的环节&#xff0c;掌握好它能让我们更高效地使用 MyBatis 进行数据库操作。本文将全面深…...

【自然语言处理与大模型】使用Xtuner进行QLoRA微调实操

本文首先对Xtuner这一微调框架进行简单的介绍。手把手演示如何使用Xtuner对模型进行微调训练&#xff0c;包括数据准备、训练命令执行及训练过程中的监控技巧。最后&#xff0c;在完成微调之后&#xff0c;本文还将介绍如何对微调结果进行简单对话测试。 一、Xtuner微调框架 X…...

2023华为od统一考试B卷【二叉树中序遍历】

前言 博主刷的华为机考题&#xff0c;代码仅供参考&#xff0c;因为没有后台数据&#xff0c;可能有没考虑到的情况 如果感觉对你有帮助&#xff0c;请点点关注点点赞吧&#xff0c;谢谢你&#xff01; 题目描述 思路 0.用Character数组存储树&#xff0c;index下标的左右…...

Midjourney 绘画 + AI 配音:组合玩法打造爆款短视频!

一、引言:AI 重构短视频创作范式 在某短视频工作室的深夜剪辑室里,资深编导正在为一条古风剧情视频发愁:预算有限无法实拍敦煌场景,人工绘制分镜耗时 3 天,配音演员档期排到一周后。而使用 Midjourney 生成敦煌壁画风格的场景图仅需 15 分钟,AI 配音工具实时生成多角色台…...

敏感词 v0.25.1 新特性之返回匹配词,修正 tags 标签

开源项目 敏感词核心 https://github.com/houbb/sensitive-word 敏感词控台 https://github.com/houbb/sensitive-word-admin 版本特性 大家好&#xff0c;我是老马。 敏感词以前在实现的时候&#xff0c;没有返回底层实际匹配的词&#xff0c;有时候问题排查非常耗费时间。 …...

【多线程】六、基于阻塞队列的生产者消费者模型

文章目录 Ⅰ. 生产者消费者模型的概念Ⅱ. 生产者消费者模型的优点Ⅲ. 基于阻塞队列的生产者消费者模型MakefileBlock_queue.hpptask.hpptest.cppⅣ. 如何理解提高了效率❓❓❓Ⅰ. 生产者消费者模型的概念 ​ 生产者消费者模型是一种常见的并发模式,用于解决生产者和消费者之间…...

解决Flutter项目中Gradle构建Running Gradle task ‘assembleDebug‘卡顿问题的终极指南

解决Flutter项目中Gradle构建Running Gradle task ‘assembleDebug‘卡顿问题的终极指南 前言 在开发Flutter应用时,经常会遇到Gradle构建卡在Running Gradle task assembleDebug阶段的问题。本文将分享如何通过配置华为云镜像和使用自定义脚本下载依赖的方法解决这些问题。…...

IntelliJ IDEA 保姆级使用教程

文章目录 一、创建项目二、创建模块三、创建包四、创建类五、编写代码六、运行代码注意 七、IDEA 常见设置1、主题2、字体3、背景色 八、IDEA 常用快捷键九、IDEA 常见操作9.1、类操作9.1.1、删除类文件9.1.2、修改类名称注意 9.2、模块操作9.2.1、修改模块名快速查看 9.2.2、导…...

从此,K8S入门0门槛!

前言 当你想要入门K8S的时候&#xff0c;往往会被各种概念搞的晕乎乎的&#xff0c;什么API Server&#xff0c;Scheduler&#xff0c;Controller manager&#xff0c;Etcd&#xff0c;Pod&#xff0c;Kubelet&#xff0c;kube-proxy&#xff0c;deployment…… 哪怕你使用了…...

vue2和vue3组件如何监听子组件生命周期

在 Vue 中监听子组件的生命周期是一个常见需求&#xff0c;但 Vue 官方并不直接推荐这么做&#xff0c;因为这会打破组件的封装性。但在**一些特定场景&#xff08;如自动化监控、封装逻辑复用&#xff09;**下仍是有意义的。 下面分别讲解 Vue 2 和 Vue 3 中如何监听 子组件的…...

如何用Python绘制两个圆之间的8条公切线

引言 在几何学中&#xff0c;两圆之间存在多种类型的公共切线。本文将通过Python代码演示如何绘制两个同心圆&#xff08;半径分别为1.0和3.0&#xff09;之间的8条公切线&#xff0c;并解释相关数学原理与代码实现细节。 环境准备 import matplotlib.pyplot as plt import …...

会话历史管理——持久化

​​需求场景​​​​推荐方案​​​​理由​​中小企业级应用&#xff0c;需复杂查询MySQL/PostgreSQL事务支持完善&#xff0c;开发成本低海量数据高并发写入Cassandra水平扩展性强&#xff0c;写入性能高非结构化历史数据快速检索MongoDB灵活存储&#xff0c;内置全文检索本…...

C++之IO流

目录 一、C语言的输入与输出 二、流是什么 三、CIO流 3.1、C标准IO流 3.2、C文件IO流 四、stringstream的简单介绍 一、C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放…...

maven install时报错:【无效的目标发行版: 17】

在很多次运行项目前的maven install时&#xff0c;我总是遇到无效的目标发行版: 17的问题&#xff0c;解决过之后就又忘了怎么解决&#xff0c;浪费了很多时间。。 今天把他总结一下&#xff0c;如图报错&#xff1a; 解决方法 注意&#xff1a; 如果只想解决这个项目的问题…...

开闭原则(OCP)

非常棒的问题&#xff01;&#x1f50d; 开闭原则&#xff08;OCP, Open/Closed Principle&#xff09;是软件设计的核心原则之一&#xff0c;下面我将从定义、意义、优劣分析、Python示例和结构图五个方面完整解析给你。 &#x1f9e0; 什么是开闭原则&#xff1f; 开闭原则&a…...

FHQ Treap

按值分裂 /* 按值x分裂Treap&#xff1a;将树u分裂为<x的树l和>x的树r */ void split(int u, int x, int& l, int& r) {if (!u) { l r 0; return; } // 空树直接返回if (t[u].val < x) { // 当前节点值<x&#xff0c;应放入左树l u; …...

题解传送门

做个算法分类&#xff0c;这样找特定算法的题目就方便多了23333 竞赛工具 【竞赛工具】——sublime text4 xcpc竞赛向配置教程 【竞赛工具】——vscode xcpc竞赛向配置教程 算法讲解 [算法学习]——通过RMQ与dfs序实现O(1)求LCA&#xff08;含封装板子&#xff09; [算法…...

ASP.NET MVC​ 入门与提高指南七

39. 量子安全通信与 MVC 应用保障 39.1 量子安全通信概念 量子安全通信基于量子力学原理&#xff0c;利用量子态的特性&#xff08;如量子纠缠、量子不可克隆定理&#xff09;来实现信息的安全传输。与传统加密方式相比&#xff0c;量子安全通信能够提供更高的安全性&#xf…...

Linux工作台文件操作命令全流程解析

全文目录 1 确认当前工作路径2 导航与目录管理2.1 关键命令2.2 逻辑衔接 3 文件基础操作3.1 创建 → 备份 → 重命名 → 清理3.2 文件查看和编辑3.3 文件链接3.4 文件diff 4 文件权限与所有权管理5 文件打包与归档6 参考文献 写在前面 shell是一种命令解释器&#xff0c;它提供…...

03 - spring security自定义登出页面

spring security自定义登出页面 文档 00 - spring security框架使用01 - spring security自定义登录页面02 - spring security基于配置文件及内存的账号密码 自定义登出页面 调整配置类WebSecurityConfig.java package xin.yangshuai.springsecurity03.config;import org.…...

unity webgl netbox2本地部署打开运行

unity webgl netbox2本地部署打开运行 复制NetBox2.exe和index.html 在同一级目录下使用&#xff0c;双击netbox2.exe。 下载文件 下载地址&#xff1a; netbox2.exe...

华为OD机试真题 Java 实现【水库蓄水问题】

前言 博主刷的华为机考题&#xff0c;代码仅供参考&#xff0c;因为没有后台数据&#xff0c;可能有没考虑到的情况 如果感觉对你有帮助&#xff0c;请点点关注点点赞吧&#xff0c;谢谢你&#xff01; 题目描述 思路 1. 其实就是找一个最大的水坑&#xff0c;两个…...

A2A 协议与 MCP 协议:智能代理生态系统的双轮驱动

本文将探讨A2A 协议与MCP 协议的特点、区别及协同作用&#xff0c;帮助开发者和产品设计师更好地理解这一新兴技术领域。 A2A 协议&#xff1a;打造代理间的沟通桥梁 A2A 协议的核心概念 A2A 协议是由 Google 与 50 多家行业合作伙伴共同开发的开放协议&#xff0c;旨在实现…...

使用AI-01开发板和开源后端服务搭建整套小智服务系统

使用AI-01开发板和开源后端服务搭建整套小智服务系统 四博智联的AI-01开发板&#xff0c;基于乐鑫ESP32-C2 专属定制的离线语音模组&#xff0c;能够完美的接入小智AI服务平台&#xff0c;再使用开源后端服务&#xff0c;就能够搭建一个完整的小智AI服务系统了。 下面是具体…...

第三章 权限维持-linux权限维持-隐藏

简介 ssh rootenv.xj.edisec.net -p 密码 xjqxwcyc 1.黑客隐藏的隐藏的文件 完整路径md5 2.黑客隐藏的文件反弹shell的ip端口 {ip:port} 3.黑客提权所用的命令 完整路径的md5 flag{md5} 4.黑客尝试注入恶意代码的工具完整路径md5 5.使用命令运行 ./x.xx 执行该文件 将查询的…...

Linux操作系统系统编程:x86-64架构下的系统调用

在Linux操作系统里&#xff0c;系统编程如同精密仪器的核心部件&#xff0c;掌控着系统运行的关键。而 x86-64 架构下的系统调用&#xff0c;更是连接用户空间程序与内核的关键桥梁。你可以把用户空间的程序想象成一个个 “工匠”&#xff0c;它们有着各式各样的需求&#xff0…...

linux下如何在一个录目中将一个文件复制到另一个录目,删除目录

一.文件复制到另一个目录 在Linux系统中&#xff0c;要将一个文件从一个目录复制到另一个目录&#xff0c;你可以使用cp命令。下面是一些基本的用法&#xff1a; 1. 使用绝对路径 如果你知道文件的绝对路径和目标目录的绝对路径&#xff0c;你可以直接使用cp命令。例如&…...

用Selenium开启自动化网页交互与数据抓取之旅

用Selenium开启自动化网页交互与数据抓取之旅 在当今数字化时代&#xff0c;数据的价值不言而喻&#xff0c;而网页作为海量数据的重要载体&#xff0c;如何高效获取其中的关键信息成为众多开发者和数据爱好者关注的焦点。Selenium这一强大工具&#xff0c;为我们打开了自动化…...

RabbitMQ的交换机

一、三种交换机模式 核心区别对比​​ ​​特性​​​​广播模式&#xff08;Fanout&#xff09;​​​​路由模式&#xff08;Direct&#xff09;​​​​主题模式&#xff08;Topic&#xff09;​​​​路由规则​​无条件复制到所有绑定队列精确匹配 Routing Key通配符匹配…...

多模态大语言模型arxiv论文略读(五十五)

MoMA: Multimodal LLM Adapter for Fast Personalized Image Generation ➡️ 论文标题&#xff1a;MoMA: Multimodal LLM Adapter for Fast Personalized Image Generation ➡️ 论文作者&#xff1a;Kunpeng Song, Yizhe Zhu, Bingchen Liu, Qing Yan, Ahmed Elgammal, Xiao…...

TMI投稿指南(四):投稿相关网址

TMI官网&#xff1a;https://ieeetmi.org/ 模版选择器&#xff1a;选择合适的latex模版 IEEE-Template Selector 评审过程状态查看&#xff1a;​​​​​​ScholarOne Manuscripts AE assigns reviewers&#xff1a;副编辑已经开始选择和邀请审稿人&#xff0c;但同意审稿…...

Oracle无法正常OPEN(三)

在Oracle数据库中&#xff0c;如果几个数据文件丢失&#xff0c;导致数据库无法启动&#xff0c;报错“ORA-01157: cannot identify/lock data file 2 - see DBWR trace file”&#xff0c;如果没有物理备份的情况下&#xff0c;位于丢失数据文件的数据是无法找回的&#xff0c…...

SQL语句练习 自学SQL网 在查询中使用表达式 统计

目录 Day 9 在查询中使用表达式 Day 10 在查询中进行统计 聚合函数 Day 11 在查询中进行统计 HAVING关键字 Day12 查询执行顺序 Day 9 在查询中使用表达式 SELECT id , Title , (International_salesDomestic_sales)/1000000 AS International_sales FROM moviesLEFT JOIN …...

当LLM遇上Agent:AI三大流派的“复仇者联盟”

你一定听说过ChatGPT和DeepSeek&#xff0c;也知道它们背后的LLM&#xff08;大语言模型&#xff09;有多牛——能写诗、写代码、甚至假装人类。但如果你以为这就是AI的极限&#xff0c;那你就too young too simple了&#xff01; 最近&#xff0c;**Agent&#xff08;智能体&a…...