Spring Boot 项目中使用事件发布和监听来实现消息推送和处理

devtools/2024/9/23 19:26:43/

对于在 Spring Boot 项目内部不同函数间或不同线程间的消息推送和处理机制,您可以使用 Spring 内置的事件发布/订阅机制。这种机制允许不同组件之间异步通信,而不需要它们彼此直接依赖。

以下是一个示例,展示了如何在 Spring Boot 项目中使用事件发布和监听来实现消息推送和处理。

1. 定义事件类

首先,定义一个事件类,该类继承自 ApplicationEvent

java">package com.example.demo.events;import org.springframework.context.ApplicationEvent;public class CustomEvent extends ApplicationEvent {private final String message;public CustomEvent(Object source, String message) {super(source);this.message = message;}public String getMessage() {return message;}
}

2. 创建事件发布者

接下来,创建一个事件发布者类,使用 ApplicationEventPublisher 发布事件:

java">package com.example.demo.publishers;import com.example.demo.events.CustomEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;@Component
public class EventPublisher {private final ApplicationEventPublisher publisher;public EventPublisher(ApplicationEventPublisher publisher) {this.publisher = publisher;}public void publishEvent(String message) {CustomEvent customEvent = new CustomEvent(this, message);publisher.publishEvent(customEvent);}
}

3. 创建事件监听器

然后,创建一个事件监听器类,使用 @EventListener 注解来监听事件:

java">package com.example.demo.listeners;import com.example.demo.events.CustomEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;@Component
public class EventListenerExample {@EventListenerpublic void handleCustomEvent(CustomEvent event) {System.out.println("Received event - " + event.getMessage());}
}

4. 使用事件发布者

最后,在任何需要的地方使用事件发布者来发布事件:

java">package com.example.demo;import com.example.demo.publishers.EventPublisher;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}@Beanpublic CommandLineRunner commandLineRunner(ApplicationContext ctx) {return args -> {EventPublisher publisher = ctx.getBean(EventPublisher.class);publisher.publishEvent("Hello, Event Driven World!");};}
}

5. 运行应用

启动 Spring Boot 应用,您会看到事件监听器捕获到发布的事件并处理它。

这个示例展示了如何在 Spring Boot 应用中使用事件发布和监听机制来实现内部的消息推送和处理。不同的组件可以通过发布和监听事件进行异步通信,而不需要直接依赖彼此,从而实现解耦和更灵活的设计。

后续建议:
a. 添加更多的事件类型和对应的监听器来处理不同类型的事件。
b. 结合异步处理,使用 @Async 注解使事件处理器方法异步执行,提高性能。


http://www.ppmy.cn/devtools/85452.html

相关文章

Ansible的脚本-----playbook剧本【上】

目录 1.playbook剧本组成 2.playbook剧本实战演练 2.1 实战演练一:给被管理主机安装httpd服务 2.2 实战演练二:定义、引用变量 2.3 实战演练三:指定远程主机sudo切换用户 2.4 实战演练四:when条件判断 2.5 实战演练五&…

【BUG】已解决:ERROR: No matching distribution found for PIL

ERROR: No matching distribution found for PIL 目录 ERROR: No matching distribution found for PIL 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身&#xff0…

嵌入式初学-C语言-二

进制转换 我们目前接触到的进制有 二进制、八进制、十进制、十六进制 其他进制 转 十进制: 按权相加 1. (1234)10 4 * 10的0次方 3 * 10的1次方2 * 10的2次方 1 * 10的3次方 2. (0x1234)16 4 * 160次方 3 * 16的1次方 2 * 16的2次方1 * 16的3次方 1&#xff…

【黑科技】:Laravel 项目性能提升 20 倍

令人激动的黑科技:Laravel 项目性能提升 20 倍 这个项目能够在无需修改任何代码且无需第三方扩展的前提下,将你的 Laravel 项目性能提高 20 倍。它仅依赖于 PHP 原生的 pcntl、posix、fiber 和 sockets。 项目灵感 起因是看到官方发布的 PHP 8.1 更新…

Android13 控制设置界面 双栏显示或单栏显示

Android 13 设置界面会判断当前屏幕的大小,如果是大屏,则为双栏显示! 我的博客 ./packages/apps/Settings/src/com/android/settings/homepage/SettingsHomepageActivity.javaOverrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState…

C# 时间、空间复杂度

栏目总目录 在软件开发中,评估算法的性能是一个至关重要的环节。算法的性能主要通过两个指标来衡量:时间复杂度和空间复杂度。本文将详细介绍这两个概念的定义、计算方法,并通过C#示例代码来展示常见的复杂度情况。 一、时间复杂度的概念与计…

【前端逆向】最佳JS反编译利器,原来就是chrome!

有时候需要反编译别人的 min.js。 比如简单改库、看看别人的 min,js 干了什么,有没有重复加载?此时就需要去反编译Javascript。 Vscode 里面有一些反编译插件,某某Beautify等等。但这些插件看人品,运气不好搞的话,反…

GitHub 详解教程

1. 引言 GitHub 是一个用于版本控制和协作的代码托管平台,基于 Git 构建。它提供了强大的功能,使开发者可以轻松管理代码、追踪问题、进行代码审查和协作开发。 2. Git 与 GitHub 的区别 Git 是一个分布式版本控制系统,用于跟踪文件的更改…