【java】spring中时间机制以及与MQ对比

news2024/12/20 10:23:08

事件机制

背景

  • 场景 1:在项目管理平台中,当单子的属性发生变更时,异步发送消息给相关变更人。
  • 场景 2:外部上报某对象到服务器,该对象某字段的值需要到第三方获取后填充。

观察者模式

定义了对象之间的一种一对多依赖关系。当一个对象状态改变时,所有依赖于它的对象都会收到通知并自动更新。

实现方式

  1. 注册:观察者注册到被观察对象中,被观察对象将观察者存放在容器中。
  2. 通知:被观察对象发生变化时,获取容器中所有注册的观察者并通知。
  3. 撤销注册:观察者可撤销注册,被观察对象从容器中移除该观察者。

Spring 事件机制概述

Spring 事件机制是观察者模式的一种实现,支持事件的发布和订阅,解耦组件之间的逻辑。

示例:订单支付事件

在电商系统中,当订单完成支付后,可以发布一个事件,触发以下响应:

  • 发送通知给用户。
  • 更新库存。

事件相关的重要概念

事件(ApplicationEvent

  • 所有事件的基类,继承自 java.util.EventObject
  • 自定义事件需要继承 ApplicationEvent
    示例:定义订单支付事件:
import org.springframework.context.ApplicationEvent;

public class OrderPaidEvent extends ApplicationEvent {
    private Order order;

    public OrderPaidEvent(Order order) {
        super(order);
        this.order = order;
    }

    public Order getOrder() {
        return order;
    }
}

事件发布者(ApplicationEventPublisher

  • 功能:用于发布事件。通过 publishEvent 方法发布自定义事件。
  • 示例:订单服务中发布支付成功事件:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;

public class OrderService {
    @Autowired
    private ApplicationEventPublisher publisher;

    public void paySuccess(Order order) {
        // 更新订单状态等业务逻辑
        publisher.publishEvent(new OrderPaidEvent(order));
    }
}

事件监听器(ApplicationListener

  • 功能:监听并处理事件,需实现 ApplicationListener 接口。
  • 示例:通知监听器处理订单支付事件:
import org.springframework.context.ApplicationListener;

public class NotificationListener implements ApplicationListener<OrderPaidEvent> {
    @Override
    public void onApplicationEvent(OrderPaidEvent event) {
        Order order = event.getOrder();
        // 发送通知给用户(邮件、短信等)
    }
}

事件发布和监听的流程

  1. 事件发布:发布者调用 publishEvent 发布事件。
  2. 事件广播:Spring 查找注册的监听器。
  3. 事件处理:调用监听器的 onApplicationEvent 方法处理事件。

Spring 事件机制的优缺点

优点

  1. 松耦合
    • 事件发布者和事件监听器之间没有直接依赖,降低了模块之间的耦合性。
    • 方便后续扩展和维护。
  2. 内置支持
    • 完全集成在 Spring 框架中,无需额外配置即可使用。
  3. 异步能力
    • 借助 @Async 注解轻松实现异步事件处理,提升性能。
  4. 便捷性
    • 通过简单的注解(如 @EventListener)实现监听器,无需额外代码。

缺点

  1. 受限于容器
    • 依赖 Spring 容器运行,无法跨系统或分布式使用。
  2. 可靠性不足
    • 缺乏内置的持久化和重试机制,容易丢失未处理的事件。
  3. 适用场景局限
    • 更适合单体应用中的事件处理,不适用于高并发、大规模分布式场景。

MQ 的优缺点

优点

  1. 高可靠性
    • 提供消息持久化和 ACK 确认机制,确保消息不会丢失。
  2. 跨系统支持
    • 支持分布式部署,适合跨语言、跨系统的通信。
  3. 高并发处理
    • 设计为支持大规模消息传递,能应对高流量场景。
  4. 事务支持
    • 提供强大的事务管理能力,例如 Kafka 的事务 API。
  5. 消息顺序保证
    • 通过分区或队列设计,支持严格的消息顺序。

缺点

  1. 复杂性
    • 部署和运维成本高,尤其是在分布式部署中。
  2. 开发成本
    • 消费者与生产者的逻辑设计复杂,尤其是需要保证事务一致性时。
  3. 性能瓶颈
    • 在高并发下,需优化 MQ 的配置和资源,可能会增加硬件成本。

适用场景对比

场景Spring 事件机制消息队列(MQ)
单体应用内部事件传递✅ 适合,低延迟❌ 过于复杂,性能未必优于直接调用
分布式系统通信❌ 需额外实现跨容器事件传递✅ 天然支持分布式,适合跨系统通信
高可靠性场景❌ 容器故障可能导致事件丢失✅ 提供持久化和重试机制,确保消息不丢失
大规模并发消息处理❌ 不支持高并发场景✅ 专为高并发设计,支持海量消息传递
事务一致性要求高的场景❌ 无原生事务支持,需手动处理✅ 提供事务机制(如 Kafka 事务 API)
消息顺序严格要求的场景❌ 无顺序性保障✅ 支持消息顺序(如 Kafka 分区内消息有序)

总结

  1. Spring 事件机制

    • 简单易用,适合单体应用内部的轻量级事件处理。
    • 更适合解耦应用内部的模块之间的业务逻辑。
  2. 消息队列(MQ)

    • 功能强大,适合分布式、高并发和高可靠性场景。
    • 更适合跨系统通信、大规模消息传递以及严格的事务需求。

选择使用哪种机制,应根据实际的业务场景需求进行权衡。

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

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

相关文章

【Ubuntu】设置静态Ip

查看网卡 ifconfig | grep -A 5 -B 2 192 修改配置文件 sudo vim /etc/netplan/00-installer-config.yamlnetwork:ethernets:enp0s3:dhcp4: noaddresses:- 192.168.1.100/24gateway4: 192.168.1.1nameservers:addresses:- 8.8.8.8- 8.8.4.4​​​​​

演员念真主演电视剧《依依向北风》获奖

2024年12月17日&#xff0c;南京广播电视集团和江苏12家城市台的领导、嘉宾&#xff0c;全国其他省市电视台嘉宾&#xff0c;影视公司代表、项目主创团队代表等&#xff0c;相聚南京国际青年会议酒店&#xff0c;举行江苏城市联合公司“城市之星”项目资源推介会暨2024年度“城…

Word使用分隔符实现页面部分分栏

文章目录 Word使用分隔符实现页面部分分栏分隔符使用页面设置 Word使用分隔符实现页面部分分栏 分隔符使用 word中的分隔符&#xff1a; 前面不分栏&#xff0c;后面分栏(或前面分栏&#xff0c;后面不分栏)&#xff0c;只需要在分隔位置处插入分隔符&#xff1a;“连续”即…

Sensapex 微纳米显微平台:高精度、低漂移、模块化的科研引擎

Sensapex微纳米显微平台以其卓越的技术性能&#xff0c;成为科研领域的重要工具。其高精度定位技术确保了实验结果的可靠性&#xff0c;低漂移设计适应了长时间复杂实验的需求。模块化设计为用户提供了灵活性&#xff0c;可根据不同实验需求自由组合。Sensapex微纳米显微平台广…

江协科技 OLED库 OLED_Print( )函数自动换行

void OLED_Printf(int16_t X, int16_t Y, uint8_t FontSize, char *format, ...) {char String[256]; //定义字符数组va_list arg; //定义可变参数列表数据类型的变量argva_start(arg, format); //从format开始&#xff0c;接收参数列表到arg变量vsprintf(Strin…

探索 Seaborn Palette 的奥秘:为数据可视化增色添彩

一、引言 在数据科学的世界里&#xff0c;视觉传达是不可或缺的一环。一个好的数据可视化不仅能传递信息&#xff0c;还能引发共鸣。Seaborn 是 Python 中一款广受欢迎的可视化库&#xff0c;而它的调色板&#xff08;palette&#xff09;功能&#xff0c;则为我们提供了调配绚…

领域驱动设计的学习分享

DDD 是什么 领域驱动设计(Domain Driven Design) 是一种从系统分析到软件建模的一套方法论。以领域为核心驱动力的设计体系。 为什么使用 面向对象设计&#xff0c;数据行为绑定&#xff0c;告别贫血模型优先考虑领域模型&#xff0c;而不是切割数据和行为准确传达业务规则…

Three.js推荐-可以和Three.js结合的动画库

在 Three.js 中&#xff0c;3D 模型、相机、光照等对象的变换&#xff08;如位置、旋转、缩放&#xff09;通常需要通过动画进行控制&#xff0c;以实现更加生动和富有表现力的效果。然而&#xff0c;Three.js 本身并没有内置的强大动画管理系统&#xff0c;尽管可以通过关键帧…

vue+springboot+cas配置及cookie传递问题

cookie的注意事项 前边的文章已经介绍过cookie的基本信息&#xff0c;这里再次说明一点&#xff1a;cookie是无法进行跨域传递的&#xff0c;很多时候cookie无法设置和传递都是因为跨域问题&#xff0c;ip/端口不一致。 主要就是&#xff1a;被设置cookie和要传递cookie的地址…

Mac升级macOS 15 Sequoia后,无法ssh连接本地虚拟机

现象 macOS 15后&#xff0c;无法ssh连接本地启动的虚拟机&#xff0c;提示错误&#xff1a; No route to host&#xff0c;也ping不通。包括UTM、Parallels Desktop这两个虚拟机软件。之前都是没问题的&#xff0c;通过一些简单排查&#xff0c;目前没发现什么问题。 在虚拟…

使用 NVIDIA DALI 计算视频的光流

引言 光流&#xff08;Optical Flow&#xff09;是计算机视觉中的一种技术&#xff0c;主要用于估计视频中连续帧之间的运动信息。它通过分析像素在时间维度上的移动来预测运动场&#xff0c;广泛应用于目标跟踪、动作识别、视频稳定等领域。 光流的计算传统上依赖 CPU 或 GP…

c语言----顺序结构

顺序结构的基本概念 定义&#xff1a;顺序结构是C语言程序中最基本的结构&#xff0c;它按照语句的先后顺序依次执行。就像我们日常做事一样&#xff0c;一步一步地按照顺序来完成任务。在C语言程序中&#xff0c;从程序的第一条语句开始&#xff0c;逐句向下执行&#xff0c;…

基于base32的兑换码算法(思路)

base32编码指的是基于32个可打印字符对任意字节数据进行编码&#xff1a;大写字母A-Z以及数字2-7。 兑换码要求:长度为10个字符 如果将这32个字符依次放到一个base数组中&#xff0c;那么最大的下标就是31。我们将要编码的任意字节数据按照五个bit为一组进行划分&#xff0c;…

python学opencv|读取图像(十六)修改HSV图像HSV值

【1】引言 前序学习进程中&#xff0c;我们已经掌握了对HSV通道和BGR通道的拆分和合并&#xff0c;并通过自由组合的形式&#xff0c;获得了和初始图像完全不一样的新图像&#xff0c;相关文章可以参考下述链接&#xff1a; python学opencv|读取图像&#xff08;十四&#xf…

用QT制作的倒计时软件

一、pro代码 RC_ICONS countdown.ico 二、mainwindow.cpp代码 #include "mainwindow.h" #include "ui_mainwindow.h"#include <QDateTime> #include <QMessageBox> #include <QSettings>MainWindow::MainWindow(QWidget *parent): QM…

VScode MAC按任意键关闭终端 想要访问桌面文件

说明 最近配置MAC上CPP的运行环境&#xff0c;在安装必要的CPP插件后&#xff0c;配置launch和task等json文件后&#xff0c;点击运行三角形&#xff0c;每次都会跳出main想要访问桌面上的文件。并且输出也是在调试控制台&#xff0c;非常逆天。 尝试 尝试1:尽管我尝试将ta…

【一本通】线段

【一本通】线段 C语言代码Java代码C代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 数轴上有 n条线段&#xff0c;选取其中 k条线段使得这 k条线段两两没有重合部分&#xff0c;问最大的k为多少? 输入 输入文件segment.in的第一行为…

学习日志024--opencv中处理轮廓的函数

目录 前言​​​​​​​ 一、 梯度处理的sobel算子函数 功能 参数 返回值 代码演示 二、梯度处理拉普拉斯算子 功能 参数 返回值 代码演示 三、Canny算子 功能 参数 返回值 代码演示 四、findContours函数与drawContours函数 功能 参数 返回值 代码演示 …

关于分页的样式问题

在最近写网页的时候遇到了一个关于样式的问题&#xff0c;今天我来跟大家来说一下。像是分页中的颜色效果&#xff0c;斑马纹颜色要注意颜色不要过于深。 这种的颜色就有一点深看着很不舒服&#xff0c;应将当前的颜色改为淡一点的&#xff0c;也可以利用rgba调整透明度&#x…

机器学习周报(12.9-12.15)

文章目录 摘要Abstract 1 Swin Transformer1.1 输入1.2 Patch Partition1.3 Linear Embedding1.4 Patch Merging1.5 Swin Transformer Block1.6 代码总结 摘要 本篇博客介绍了采用类似于卷积核的移动窗口进行图像特征提取的Swin Transformer网络模型&#xff0c;这是一种基于T…