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

Java设计模式之观察者模式:从入门到架构级实践

一、观察者模式的核心价值

观察者模式(Observer Pattern)是行为型设计模式中的经典之作,它建立了对象间的一对多依赖关系,让多个观察者对象能够自动感知被观察对象的状态变化。这种模式在事件驱动系统、实时数据推送、GUI事件处理等场景中广泛应用,是实现松耦合设计的利器。

核心价值体现

  • 解耦生产者(被观察者)与消费者(观察者)

  • 支持动态的观察者注册与注销

  • 实现广播通信机制

  • 符合开放-封闭原则(对扩展开放,对修改关闭)

二、模式结构深度解析

2.1 核心角色分解

  1. Subject(抽象主题)

    • 维护观察者列表(List<Observer>)

    • 提供观察者的注册(attach)和注销(detach)方法

    • 定义通知方法(notifyObservers)

  2. ConcreteSubject(具体主题)

    • 维护具体状态信息

    • 状态改变时调用父类的通知方法

    • 可提供获取状态的接口

  3. Observer(抽象观察者)

    • 定义更新接口(update方法)

  4. ConcreteObserver(具体观察者)

    • 实现具体的更新逻辑

    • 可持有主题引用以获取更多状态信息

2.2 两种通知模型对比

模型类型数据传递方式优点缺点
推模型主题主动推送详细数据给观察者实时性强,响应快可能传递冗余数据
拉模型观察者收到通知后主动拉取数据按需获取,灵活性高增加主题的访问压力

三、基础实现代码示例

3.1 自定义实现版本

// 抽象主题
interface Subject {void register(Observer o);void remove(Observer o);void notifyObservers();
}// 具体主题(气象站)
class WeatherStation implements Subject {private List<Observer> observers = new ArrayList<>();private float temperature;public void setMeasurements(float temp) {this.temperature = temp;notifyObservers();}@Overridepublic void register(Observer o) { observers.add(o); }@Overridepublic void remove(Observer o) { observers.remove(o); }@Overridepublic void notifyObservers() {for (Observer o : observers) {o.update(temperature);}}
}// 抽象观察者
interface Observer {void update(float temp);
}// 具体观察者(手机显示)
class PhoneDisplay implements Observer {@Overridepublic void update(float temp) {System.out.println("手机显示温度更新:" + temp + "℃");}
}

3.2 Java内置实现

Java自带的java.util.Observable类和Observer接口:

class WeatherData extends Observable {private float temperature;public void measurementsChanged() {setChanged();  // 必须调用此方法notifyObservers();}public void setMeasurements(float temp) {this.temperature = temp;measurementsChanged();}// 供观察者拉取数据public float getTemperature() {return temperature;}
}class TVDisplay implements Observer {@Overridepublic void update(Observable o, Object arg) {if (o instanceof WeatherData) {WeatherData wd = (WeatherData) o;System.out.println("电视显示当前温度:" + wd.getTemperature());}}
}

四、高级架构实践

4.1 异步观察者模式

ExecutorService executor = Executors.newCachedThreadPool();class AsyncNotifier {public void notifyAsync(List<Observer> observers) {observers.forEach(observer -> executor.submit(() -> observer.update()));}
}

注意事项

  • 线程安全性问题

  • 通知顺序无法保证

  • 异常处理机制

  • 资源释放管理

4.2 基于Java Flow的响应式实现

Java 9+ 引入的响应式流API:

class TemperaturePublisher implements Publisher<Float> {private final SubmissionPublisher<Float> publisher = new SubmissionPublisher<>();public void publish(float temp) {publisher.submit(temp);}@Overridepublic void subscribe(Subscriber<? super Float> subscriber) {publisher.subscribe(subscriber);}
}class FlowDisplay implements Subscriber<Float> {private Subscription subscription;@Overridepublic void onSubscribe(Subscription s) {this.subscription = s;s.request(1);}@Overridepublic void onNext(Float temp) {System.out.println("Flow显示温度:" + temp);subscription.request(1);}
}

五、典型应用场景

5.1 电商订单系统

class OrderService {private List<OrderObserver> observers = new CopyOnWriteArrayList<>();public void placeOrder(Order order) {// 创建订单逻辑...notifyObservers(order);}private void notifyObservers(Order order) {observers.forEach(observer -> {try {observer.onOrderCreated(order);} catch (Exception e) {// 异常处理}});}
}interface OrderObserver {void onOrderCreated(Order order);
}// 库存扣减观察者
class InventoryObserver implements OrderObserver {@Overridepublic void onOrderCreated(Order order) {inventoryService.reduceStock(order.getItems());}
}

5.2 微服务配置中心

@RestController
public class ConfigController {private final ConfigSubject configSubject;@PostMapping("/update-config")public void updateConfig(@RequestBody Config newConfig) {configSubject.updateConfig(newConfig);}
}@Service
class ConfigSubject {private List<ConfigObserver> observers = new ArrayList<>();private Config currentConfig;public synchronized void updateConfig(Config newConfig) {this.currentConfig = newConfig;notifyObservers();}private void notifyObservers() {observers.forEach(observer -> observer.onConfigChanged(currentConfig));}
}

六、生产环境最佳实践

  1. 性能优化策略

    • 采用CopyOnWriteArrayList避免并发修改异常

    • 使用Guava的EventBus进行事件分发

    • 实现观察者优先级机制

    • 添加批处理通知功能

  2. 可靠性增强

    • 引入死信队列处理失败通知

    • 实现幂等性处理

    • 添加事务消息支持

    • 建立监控指标体系(QPS、失败率等)

  3. 扩展性设计

    • 支持观察者过滤器

    • 实现主题分组机制

    • 添加消息持久化能力

    • 支持跨进程观察(分布式观察者)

七、常见陷阱与解决方案

典型问题1:内存泄漏

  • 现象:观察者未及时注销导致无法回收

  • 解决方案:

    // 使用弱引用
    class WeakObserver implements Observer {WeakReference<Observer> ref;public WeakObserver(Observer real) {this.ref = new WeakReference<>(real);}// 实现代理方法...
    }

典型问题2:循环通知

  • 现象:A通知B,B又通知A导致死循环

  • 解决方案:

    class SafeSubject implements Subject {private boolean notifying = false;public void notifyObservers() {if (notifying) return;notifying = true;try {// 执行通知...} finally {notifying = false;}}
    }

典型问题3:性能瓶颈

  • 现象:同步通知大量观察者导致响应延迟

  • 解决方案:

    // 分片异步通知
    List<List<Observer>> shards = partition(observers, 10);
    shards.forEach(shard -> executor.execute(() -> shard.forEach(Observer::update))
    );

八、模式演进与变种

  1. 中介者模式结合

    • 通过中介者统一管理观察关系

    • 实现更复杂的消息路由

  2. 响应式扩展

    • 结合RxJava实现流式处理

    • 支持背压(Backpressure)机制

  3. 领域事件模式

    • 在DDD中应用观察者模式

    • 实现领域事件的发布/订阅

  4. CQRS架构集成

    • 将命令与查询分离

    • 通过观察者维护读模型

九、总结与展望

观察者模式作为解耦利器,在现代架构中展现出强大的生命力。随着响应式编程的兴起,观察者模式正在与以下新技术深度融合:

  1. 云原生架构:跨服务的观察者模式实现

  2. Serverless:事件驱动的函数计算

  3. 物联网(IoT):海量设备的状态同步

  4. 实时数据分析:流式计算中的事件处理

建议开发者根据具体场景选择合适的实现方式:

  • 简单场景:直接使用语言内置支持

  • 复杂系统:采用成熟的响应式框架(如RxJava、Reactor)

  • 分布式环境:使用消息中间件(如Kafka、RabbitMQ)

掌握观察者模式的精髓,将使你的系统架构具备更好的扩展性和灵活性,从容应对各种复杂的业务需求变化。

相关文章:

Java设计模式之观察者模式:从入门到架构级实践

一、观察者模式的核心价值 观察者模式&#xff08;Observer Pattern&#xff09;是行为型设计模式中的经典之作&#xff0c;它建立了对象间的一对多依赖关系&#xff0c;让多个观察者对象能够自动感知被观察对象的状态变化。这种模式在事件驱动系统、实时数据推送、GUI事件处理…...

【双指针】专题:LeetCode 202题解——快乐数

快乐数 一、题目链接二、题目三、题目解析四、算法原理扩展 五、编写代码 一、题目链接 快乐数 二、题目 三、题目解析 快乐数的定义中第二点最重要&#xff0c;只有两种情况&#xff0c;分别拿示例1、示例2分析吧&#xff1a; 示例1中一旦出现1了&#xff0c;继续重复过程就…...

深度学习占用大量内存空间解决办法

应该是缓存的问题&#xff0c;关机重启内存多了10G&#xff0c;暂时没找到别的方法 重启前 关机重启后...

[LeetCode 1871] 跳跃游戏 7(Ⅶ)

题面&#xff1a; 数据范围&#xff1a; 2 ≤ s . l e n g t h ≤ 1 0 5 2 \le s.length \le 10^5 2≤s.length≤105 s [ i ] s[i] s[i] 要么是 ′ 0 ′ 0 ′0′ &#xff0c;要么是 ′ 1 ′ 1 ′1′ s [ 0 ] 0 s[0] 0 s[0]0 1 ≤ m i n J u m p ≤ m a x J u m p <…...

同济大学轻量化低成本具身导航!COSMO:基于选择性记忆组合的低开销视觉语言导航

作者&#xff1a;Siqi Zhang 1 ^{1} 1, Yanyuan Qiao 3 ^{3} 3, Qunbo Wang 2 ^{2} 2, Zike Yan 4 ^{4} 4, Qi Wu 3 ^{3} 3, Zhihua Wei 1 ^{1} 1, Jing Liu 1 ^{1} 1单位&#xff1a; 1 ^{1} 1同济大学计算机科学与技术学院&#xff0c; 2 ^{2} 2中科院自动化研究所&#xff0…...

【Ubuntu | 网络】Vmware虚拟机里的Ubuntu开机后没有网络接口、也没有网络图标

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f60e;金句分享&#x1f60e;&a…...

第二十一讲 XGBoost 回归建模 + SHAP 可解释性分析(利用R语言内置数据集)

下面我将使用 R 语言内置的 mtcars 数据集&#xff0c;模拟一个完整的 XGBoost 回归建模 SHAP 可解释性分析 实战流程。我们将以预测汽车的油耗&#xff08;mpg&#xff09;为目标变量&#xff0c;构建 XGBoost 模型&#xff0c;并用 SHAP 来解释模型输出。 &#x1f697; 示例…...

HP惠普打印机:解决每次打印后额外产生@PJL SET USERNAME=文档的情况

情况描述 惠普商用打印机型号&#xff1a;Color LaserJet Managed MFP E78223 在每次打印文档后都会出现包含我个人电脑用户名的额外文档&#xff1a; 这不是我希望的&#xff0c;因此我联系了惠普官方客服&#xff0c;并得到了解决 解决方案 原因 具客服所说&#xff0c;这些是…...

MariaDB MaxScale 的用途与实现细节

MaxScale 主要用途 MariaDB MaxScale 是一个智能数据库代理&#xff08;proxy&#xff09;&#xff0c;主要用于增强 MySQL/MariaDB 数据库的高可用性、可扩展性和安全性&#xff0c;同时简化应用程序与数据库基础设施之间的交互。它的核心功能包括&#xff1a; 负载均衡&…...

CTF--eval

一、原网页&#xff1a; 二、步骤&#xff1a; 1.代码分析&#xff1a; <?phpinclude "flag.php"; // 引入一个文件&#xff0c;该文件可能定义了一些变量&#xff08;例如 $flag&#xff09;$a $_REQUEST[hello]; // 从用户请求中获取参数 hello 的值&#x…...

Android学习总结之算法篇七(图和矩阵)

有向图的深度优先搜索&#xff08;DFS&#xff09;和广度优先搜索&#xff08;BFS&#xff09;的示例&#xff0c;以此来模拟遍历 GC Root 引用链这种有向图结构&#xff1a; 一、深度优先搜索&#xff08;DFS&#xff09; import java.util.*;public class GraphDFS {privat…...

vmcore分析锁问题实例(x86-64)

问题描述&#xff1a;系统出现panic&#xff0c;dmesg有如下打印&#xff1a; [122061.197311] task:irq/181-ice-enp state:D stack:0 pid:3134 ppid:2 flags:0x00004000 [122061.197315] Call Trace: [122061.197317] <TASK> [122061.197318] __schedule0…...

【vue3】vue3+express实现图片/pdf等资源文件的下载

文件资源的下载&#xff0c;是我们业务开发中常见的需求。作为前端开发&#xff0c;学习下如何自己使用node的express框架来实现资源的下载操作。 实现效果 代码实现 前端 1.封装的请求后端下载接口的方法,需求配置aixos的请求参数里面的返回数据类型为blob // 下载 export…...

【BUG】Redis RDB快照持久化及写操作禁止问题排查与解决

1 问题描述 在使用Redis 的过程中&#xff0c;遇到如下报错&#xff0c;错误信息是 “MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk...”&#xff0c;记录下问题排查过程。 2 问题排查与解决 该错误提示表明&#…...

【HD-RK3576-PI】定制用户升级固件

硬件&#xff1a;HD-RK3576-PI 软件&#xff1a;Linux6.1Ubuntu22.04 在进行 Rockchip 相关开发时&#xff0c;制作自定义的烧写固件是一项常见且重要的操作。这里主要介绍文件系统的修改以及打包成完整update包升级的过程。 一、修改文件系统镜像&#xff08;Ubuntu环境操作&…...

【AI学习】李宏毅老师讲AI Agent摘要

在b站听了李宏毅2025最新的AI Agent教程&#xff0c;简单易懂&#xff0c;而且紧跟发展&#xff0c;有大量最新的研究进展。 教程中引用了大量论文&#xff0c;为了方便将来阅读相关论文&#xff0c;进一步深入理解&#xff0c;做了截屏纪录。 同时也做一下分享。 根据经验调整…...

狂神SQL学习笔记十:修改和删除数据表字段

1、修改与删除表 alter 修改表的名称&#xff1a; 增加表的字段&#xff1a; 修改表的字段&#xff08;重命名&#xff0c;修改约束&#xff09;&#xff1a; 修改约束 重命名 删除表的字段 删除表...

OSPF综合实验

一、网络拓扑 二、实验要求 1&#xff0c;R5为ISP&#xff0c;其上只能配置IP地址;R4作为企业边界路由器&#xff1b; 2&#xff0c;整个0SPF环境IP基于172.16.0.8/16划分; 3&#xff0c;所有设备均可访问R5的环回; 4&#xff0c;减少LSA的更新量&#xff0c;加快收敛&#xf…...

2025 cs144 Lab Checkpoint 2 小白超详细版

文章目录 1 环形索引的实现1.1 wrap类wrapunwrap 2 实现tcp_receiver2.1 tcp_receiver的功能2.2 传输的报文格式TCPSenderMessageTCPReceiverMessage 2.3 如何实现函数receive&#xff08;&#xff09;send&#xff08;&#xff09; 1 环形索引的实现 范围是0~2^32-1 需要有SY…...

VMware虚拟机安装Ubuntu 22.04.2

一、我的虚拟机版本 二、浏览器搜索Ubuntu 三、下载Ubuntu桌面版 四、下这个 五、创建新的虚拟机 六、选择典型&#xff0c;然后下一步 七、选择稍后安装操作系统&#xff0c;然后下一步 八、选择Linux ,版本选择Ubuntu 64位 九、选择好安装位置 十、磁盘大小一般选20G就够用了…...

XSS漏洞及常见处理方案

文章背景&#xff1a; 在近期项目安全测试中&#xff0c;安全团队发现了一处潜在的 跨站脚本攻击&#xff08;XSS&#xff09;漏洞&#xff0c;该漏洞可能导致用户数据被篡改或会话劫持等安全风险。针对这一问题&#xff0c;项目组迅速响应&#xff0c;通过代码修复、输入过滤、…...

TCP标志位抓包

说明 TCP协议的Header信息&#xff0c;URG、ACK、PSH、RST、SYN、FIN这6个字段在14字节的位置&#xff0c;对应的是tcp[13]&#xff0c;因为字节数是从[0]开始数的&#xff0c;14字节对应的就是tcp[13]&#xff0c;因此在抓这几个标志位的数据包时就要明确范围在tcp[13] 示例1…...

C/C++条件判断

条件判断 if语句的三种形态 if(a<b){} 、 if(a<b){}else{} 、 if(a<b){}else if(a>b) else{} if语句的嵌套 嵌套的常见错误&#xff08;配对错误&#xff09;,与前面最近的&#xff0c;而且还没有配对的if匹配 错误避免方法&#xff1a;严格使用 { }、先写&am…...

单位门户网站被攻击后的安全防护策略

政府网站安全现状与挑战 近年来&#xff0c;随着数字化进程的加速&#xff0c;政府门户网站已成为政务公开和服务公众的重要窗口。然而&#xff0c;网络安全形势却日益严峻。国家互联网应急中心的数据显示&#xff0c;政府网站已成为黑客攻击的重点目标&#xff0c;被篡改和被…...

# 工具记录

工具记录 键盘操作可视化工具openark64系统工具dufs-webui文件共享zotero文献查看cff explorerNoFencesfreeplane开源思维导图...

C/C++运算

C语言字符串的比较 #include <string.h> int strcmp( const char *str1, const char *str2 );例如: int ret; ret strcmp(str1, str2);返回值&#xff1a; str1 < str2时&#xff0c; 返回值< 0&#xff08;有些编译器返回 -1&#xff09; str1 > str2时…...

CloudWeGo 技术沙龙·深圳站回顾:云原生 × AI 时代的微服务架构与技术实践

2025 年 3 月 22 日&#xff0c;CloudWeGo “云原生 AI 时代的微服务架构与技术实践”主题沙龙在深圳圆满落幕。作为云原生与 AI 微服务融合领域的深度技术聚会&#xff0c;本次活动吸引了来自企业、开发者社区的百余位参与者&#xff0c;共同探讨如何通过开源技术应对智能时代…...

STM32移植文件系统FATFS——片外SPI FLASH

一、电路连接 主控芯片选型为&#xff1a;STM32F407ZGT6&#xff0c;SPI FLASH选型为&#xff1a;W25Q256JV。 采用了两片32MB的片外SPI FLASH&#xff0c;电路如图所示。 SPI FLASH与主控芯片的连接方式如表所示。 STM32F407GT6W25Q256JVPB3SPI1_SCKPB4SPI1_MISOPB5SPI1_MOSI…...

华为HG8546M光猫宽带密码破解

首先进光猫管理界面 将password改成text就可以看到加密后的密码了 复制密码到下面代码里 import hashlibdef sha256(todo):return hashlib.sha256(str(todo).encode()).hexdigest()def md5(todo):return hashlib.md5(str(todo).encode()).hexdigest()def find_secret(secret,…...

驱动-兼容不同设备-container_of

驱动兼容不同类型设备 在 Linux 驱动开发中&#xff0c;container_of 宏常被用来实现一个驱动兼容多种不同设备的架构。这种设计模式在 Linux 内核中非常常见&#xff0c;特别 是在设备驱动模型中。linux内核的主要开发语言是C&#xff0c;但是现在内核的框架使用了非常多的面向…...

UE5 检测球形范围的所有Actor

和Untiiy不同&#xff0c;不需要复杂的调用 首选确保角色添加了Sphere Collision 然后直接把sphere拖入蓝图&#xff0c;调用GetOverlappingActors来获取碰撞范围内的所有Actor...

AI大模型学习十:‌Ubuntu 22.04.5 调整根目录大小,解决根目录磁盘不够问题

一、说明 由于默认安装时导致home和根目录大小一样&#xff0c;导致根目录不够&#xff0c;所以我们调整下 二、调整 # 确认/home和/是否为独立逻辑卷&#xff0c;并属于同一卷组&#xff08;VG&#xff09; rootnode1:~# lsblk NAME MAJ:MIN RM SIZE…...

在ros2上使用opencv显示一张图片

1.先将图片放到桌面上 2.打开终端ctrlaltT&#xff0c;查看自己是否已安装opencv 3.创建工作环境 4.进入工作目录并创建ROS2包添加OpenCV依赖项 5.进入/home/kong/opencv_ws/opencv_use/src目录创建.cpp文件并编辑 6.代码如下 my_opencv.cpp #include <cstdio> #include…...

训练神经网络的原理(前向传播、反向传播、优化、迭代)

训练神经网络的原理 通过前向传播计算预测值和损失&#xff0c;利用反向传播计算梯度&#xff0c;然后通过优化算法更新参数&#xff0c;最终使模型在给定任务上表现更好。 核心&#xff1a;通过计算损失函数&#xff08;通常是模型预测与真实值之间的差距&#xff09;对模型参…...

每日一题(小白)暴力娱乐篇30

顺时针旋转&#xff0c;从上图中不难看出行列进行了变换。因为这是一道暴力可以解决的问题&#xff0c;我们直接尝试使用行列转换看能不能得到想要的结果。 public static void main(String[] args) {Scanner scan new Scanner(System.in);int nscan.nextInt();int mscan.next…...

【HTTPS】免费SSL证书配置Let‘s Encrypt自动续期

【HTTPS】免费SSL证书配置Lets Encrypt自动续期 1. 安装Certbot1.1 snapd1.2 certbot2. 申请泛域名证书使用 DNS 验证申请泛域名证书3.配置nginx申请的 SSL 证书文件所在目录nginx配置证书示例查看证书信息和剩余时间4.自动续期手动自动5.不同服务器使用1. 安装Certbot 1.1 sn…...

企业应如何防范 AI 驱动的网络安全威胁?

互联网技术和 AI 科技为世界开启了一个新的发展篇章。同时&#xff0c;网络攻击也呈现出愈发强势的发展势头&#xff1a;高级持续性威胁 &#xff08;APT&#xff1a;Advanced Persistent Threat&#xff09;组织采用新的战术、技术和程序 (TTP)、AI 驱动下攻击数量和速度的提高…...

决策树简介

【理解】决策树例子 决策树算法是一种监督学习算法&#xff0c;英文是Decision tree。 决策树思想的来源非常朴素&#xff0c;试想每个人的大脑都有类似于if-else这样的逻辑判断&#xff0c;这其中的if表示的是条件&#xff0c;if之后的else就是一种选择或决策。程序设计中的…...

ScrollView(滚动视图)详解和按钮点击事件

文章目录 **ScrollView&#xff08;滚动视图&#xff09;详解****1. 核心特性****2. 基本用法****XML 示例&#xff1a;简单滚动布局** **3. 水平滚动&#xff1a;HorizontalScrollView****4. 高级用法****(1) 嵌套滚动控件****(2) 动态添加内容****(3) 监听滚动事件** **5. 注…...

2025年3月,再上中科院1区TOP,“等级熵+状态识别、故障诊断”

引言 2025年3月&#xff0c;研究者在国际机械领域顶级期刊《Mechanical Systems and Signal Processing》&#xff08;JCR 1区&#xff0c;中科院1区 Top&#xff0c;IF&#xff1a;7.9&#xff09;上以“Rating entropy and its multivariate version”为题发表科学研究成果。…...

根据pdf文档生成问答并进行评估

目标是根据pdf文档生成问答&#xff0c;并进行评估。 首先&#xff0c;安装依赖 pip install PyPDF2 pandas tqdm openai -q 具体过程如下&#xff1a; 1、将pdf放在opeai_blog_pdfs目录下&#xff0c;引用依赖 2、上传pdf文件&#xff0c;创建向量库 3、单个提问的向量检索…...

计算机网络 - 四次挥手相关问题

通过一些问题来讨论 TCP 的四次挥手断开连接 说一下四次挥手的过程&#xff1f;为什么需要四次呢&#xff1f;time-wait干嘛的&#xff0c;close-wait干嘛的&#xff0c;在哪一个阶段&#xff1f;状态CLOSE_WAIT在什么时候转换成下一个状态呢&#xff1f;为什么 TIME-WAIT 状态…...

SLAM | 两组时间戳不同但同时开始的imu如何对齐

场景&#xff1a; 两个手机在支架上&#xff0c;同时开始采集数据 需求&#xff1a; 对齐两个数据集的imu数据 做到A图片 B imu 做法&#xff1a; 取出来两组imu数据到excel表中&#xff0c;画图 A组 B组&#xff1a; x轴 &#xff1a; 所有imu的时间戳减去第一个时间…...

code review时线程池的使用

一、多线程的作用 多个任务并行执行可以提升效率异步&#xff0c;让与主业务无关的逻辑异步执行&#xff0c;不阻塞主业务 二、问题描述 insertSelective()方法是一个并发度比较高的业务&#xff0c;主要是插入task到任务表里&#xff0c;新建task&#xff0c;并且insertSele…...

物流网络暗战升级DHL新布局将如何影响eBay卖家库存分布策略?

物流网络暗战升级&#xff1a;DHL新布局将如何影响eBay卖家库存分布策略&#xff1f; 跨境电商发展迅猛&#xff0c;卖家对物流的依赖程度不言而喻。尤其是平台型卖家&#xff0c;例如在eBay上经营多站点的卖家&#xff0c;物流成本和时效几乎直接决定了利润空间与客户满意度。…...

JAMA Netw. Open:机器学习解码大脑:精准预测PTSD症状新突破

创伤后应激障碍&#xff08;PTSD&#xff09;是一种常见的心理健康状况&#xff0c;它可以在人们经历或目睹创伤性事件&#xff08;如战争、严重事故、自然灾害、暴力攻击等&#xff09;后发展。PTSD的症状可能包括 flashbacks&#xff08;闪回&#xff09;、噩梦、严重的焦虑、…...

域控制器升级的先决条件验证失败,证书服务器已安装

出现“证书服务器已安装”导致域控制器升级失败时&#xff0c;核心解决方法是卸载已安装的证书服务‌。具体操作如下&#xff1a;‌ ‌卸载证书服务‌ 以管理员身份打开PowerShell&#xff0c;执行命令&#xff1a; Remove-WindowsFeature -Name AD-Certificate该命令会移除A…...

Node.js入门

Node.js入门 html,css,js 30年了 nodejs环境 09年出现 15年 nodejs为我们解决了2个方面的问题&#xff1a; 【锦上添花】让我们前端工程师拥有了后端开发能力&#xff08;开接口&#xff0c;访问数据库&#xff09; - 大公司BFF&#xff08;50&#xff09;【✔️】前端工程…...

使用CubeMX新建EXTI外部中断工程——不使用回调函数

具体的使用CubeMX新建工程的步骤看这里&#xff1a;STM32CubeMX学习笔记&#xff08;3&#xff09;——EXTI(外部中断)接口使用_cubemx exti-CSDN博客 之前一直都是在看野火的视频没有亲手使用CubeMX生成工程&#xff0c;而且野火给的例程代码框架和自动生成的框架也不一样&…...

Verilog的整数除法

1、可变系数除法实现----利用除法的本质 timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2025/04/15 13:45:39 // Design Name: // Module Name: divide_1 // Project Name: // Target Devices: // Tool Versions: // Description: // // Depe…...