长见识!!!Java中除了消息队列之外,竟然还能这样实现异步任务

今年IT寒冬,大厂都裁员或者准备裁员,作为开猿节流主要目标之一,我们更应该时刻保持竞争力。为了抱团取暖,林老师开通了知识星球,并邀请我阿里、快手、腾讯等的朋友加入,分享八股文、项目经验、管理经验等,帮助大家提升技能,安稳度过这个寒冬,快加入我们吧!星球地址​

什么是Java事件

在Java中,"event"(事件)通常用于指代一种在特定条件下触发的通知或者信号。在Java编程中,事件代表着程序中发生的某种动作或改变,例如用户的交互操作、状态的转换,或者其他外部因素触发的通知。Java中的事件通常与事件监听器(Event Listener)和事件处理器(Event Handler)一起使用,以便在特定事件发生时,能够触发相应的响应和处理。

事件可以用在什么地方

事件和消息队列很像,都可以用来处理异步任务,但是虽然现在MQ中间件很盛行,但是如果系统中没有MQ中间件或者业务非常轻量级的话,可以优先考虑利用事件的方式实现。

业务场景

  • 业务中需要发送邮件的场景

  • 业务中需要发送告警通知的场景

  • 业务中需要异步执行任务的场景

在量不多,甚至非常少的情况下,可以优先考虑采用Java事件的实现方式,但是需要注意服务重启丢失的可能性,做好相关的兜底方案。

SpringBoot中如何实现事件

步骤一:定义事件

在Spring中一个事件可以由任何Java对象表示,但是通常会继承ApplicationEvent类。

import org.springframework.context.ApplicationEvent;public class CustomSpringEvent extends ApplicationEvent {private String message;public CustomSpringEvent(Object source, String message) {super(source);this.message = message;}public String getMessage() {return message;}
}

步骤二:定义事件发布者

事件发布者是用来发布事件的组件。在Spring中,可以很容易地通过ApplicationEventPublisher接口来发布事件。

import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Component;@Componentpublic
class CustomEventPublisher implements ApplicationEventPublisherAware {private ApplicationEventPublisher publisher;@Overridepublicvoid setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.publisher = applicationEventPublisher;}public void publishCustomEvent(final String message) {CustomSpringEvent customSpringEvent = new CustomSpringEvent(this, message);publisher.publishEvent(customSpringEvent);}
}

步骤三:定义事件监听器

监听器会响应事件。在Spring中,通过@EventListener注解来定义一个监听器方法。

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;@Componentpublic class CustomSpringEventListener {
@EventListenerpublic void handleCustomSpringEvent(CustomSpringEvent event) {System.out.println("Handling custom Spring event. "event.getMessage());}
}

步骤四:触发事件

现在可以在你的应用中注入CustomEventPublisher并用它来发布事件。这可以通过REST控制器,服务类或者Spring Boot的命令行运行器来完成。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;@Componentpublic class CustomEventTrigger implements CommandLineRunner {
@Autowiredprivate CustomEventPublisher publisher;
@Overridepublic void run(String... args) throws Exception {// 发布事件publisher.publishCustomEvent("Hello, this is a custom Spring event!");}
}

这个CommandLineRunner实现会在Spring应用启动时运行,并且发布了一个自定义事件。

重要的是要记得, 如果使用异步事件处理,需要确保你的应用已经开启异步支持。你可以通过在一个配置类或启动类上使用@EnableAsync来做到这一点,并且在监听器方法上使用@Async注解。

import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.context.ApplicationListener;@EnableAsync@Componentpublic class CustomSpringEventListener implements ApplicationListener<CustomSpringEvent> {
@Override@Asyncpublic void onApplicationEvent(CustomSpringEvent event) {// 处理事件}
}

这样配置之后,事件监听器将会在不同的线程中异步执行,不阻塞发布事件的过程。记住,这需要你管理线程相关的资源和可能的并发问题。

将这些代码片段放入你的Spring Boot项目中的相应位置,就可以实现自定义事件的发布和处理了。记得在Spring中事件处理默认是同步的,如果你处理事件的逻辑比较耗时,或者你想要让事件处理并发进行,你应该使用@Async@EnableAsync来进行异步处理。

总结来说,Spring Framework通过ApplicationEvent类和ApplicationEventPublisher接口提供了一个简化版本的观察者模式实现,这使得应用组件能够以一种松耦合的方式进行通信。利用这个功能,你可以构建更清晰、更灵活的Spring应用程序。


 《 林老师带你学编程 知识星球,创始人由工作 10年以上的一线大厂人员组成,希望通过我们的分享,帮助大家少走弯路,可以在技术领域不断突破和发展。

具体的加入方式

  • 直接访问链接:https://t.zsxq.com/14F2uGap7

星球内容涵盖:Java技术栈、Python、大数据、项目实战、面试指导等主题。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java进阶四-深入理解泛型和注解

泛型和注解是框架技术必备的技能 5 泛型5.1泛型理解5.1.1 泛型概念5.1.2 泛型的特点5.1.3 如何理解Java中的泛型是伪泛型&#xff1f;5.1.4 泛型的价值 5.2 泛型语法5.2.1 泛型类5.2.2 泛型接口3.2.3 泛型方法3.2.4泛型的上下边界3.2.5创建泛型数组 5.3泛型应用场景5.3.1数据库…

SQL Server注入之攻防技战法

那天下着很大的雨&#xff0c;母亲从城里走回来的时候&#xff0c;浑身就是一个泥人&#xff0c;那一刻我就知道我没有别的选择了 1.Mssql报错注入 0.判断数据库类型 1.爆当前用户名 2.爆版本 3.爆服务器名 4.判断数据库个数 5.获取全部数据库 语句只适合>2005 爆当前数据…

Windows下Jenkins自动化部署SpringBoot应用

Windows下Jenkins自动化部署SpringBoot应用 1、下载安装包 下载地址&#xff1a; 一个是 msi 程序&#xff1a; https://mirrors.aliyun.com/jenkins/windows/ 一个是 war 程序&#xff1a; https://get.jenkins.io/war-stable/ https://mirrors.jenkins.io/war/ 这里我…

机器人动力学一些笔记

动力学方程中&#xff0c;Q和q的关系(Q是sita) Q其实是一个向量&#xff0c;q(Q1&#xff0c;Q2&#xff0c;Q3&#xff0c;Q4&#xff0c;Q5&#xff0c;Q6)&#xff08;假如6个关节&#xff09; https://zhuanlan.zhihu.com/p/25789930 举个浅显易懂的例子&#xff0c;你在房…

GO语言笔记1-安装与hello world

SDK开发工具包下载 Go语言官网地址&#xff1a;golang.org&#xff0c;无法访问Golang中文社区&#xff1a;首页 - Go语言中文网 - Golang中文社区下载地址&#xff1a;Go下载 - Go语言中文网 - Golang中文社区 尽量去下载稳定版本&#xff0c;根据使用系统下载压缩包格式的安装…

西北工业大学计算机组成原理实验报告——verilog前两次

说明 为了有较好的可读性&#xff0c;报告仅仅粘贴关键代码。该PDF带有大纲功能&#xff0c;点击大纲中的对应标题&#xff0c;可以快速跳转。 实验目标 掌握单周期CPU执行指令的流程和原理&#xff1b;学习使用verilog HDL语言实现单周期CPU, 并通过功能仿真&#xff1b;提…

【教学类-43-14】 20240103 (4宫格数独:正确版:576套) 不重复的基础模板数量:576套

作品展示&#xff1a;&#xff1a;——4宫格 576套不重复模板&#xff08;48页*12套题&#xff09; 背景需求&#xff1a; 生成4宫格基础模板768套&#xff0c;观看64页内容时&#xff0c;明显看到有错误 【教学类-43-13】 20240103 &#xff08;4宫格数独&#xff1a;错误版…

如何做好档案数字化前的鉴定工作

要做好档案数字化前的鉴定工作&#xff0c;可以按照以下步骤进行&#xff1a; 1. 确定鉴定目标&#xff1a;明确要鉴定的档案的内容、数量和性质&#xff0c;确定鉴定的范围和目标。 2. 进行档案清点&#xff1a;对档案进行全面清点和登记&#xff0c;包括数量、种类、状况等信…

洗地机怎么选?哪款洗地机好用?

选择洗地机前&#xff0c;我们需要对自己购买洗地机的需求做一个清洗的判断&#xff0c;吸尘器和扫地机智能解决地面基本的清洁问题&#xff0c;作为新兴的清洁工具洗地机越来越受大家的喜欢&#xff0c;洗地机的品类很多&#xff0c;洗地机到底该买哪款呢?我们先来看看挑选洗…

pod篇:

pod环节&#xff1a; pod是k8s中最小的资源管理组件 pod也是最小化运行容器化的应用的资源对象 pod是一个抽象的概念&#xff0c;可与理解为一个或者多个容器化应用的集合 在一个pod当中运行一个容器是最常用的方式。 再一个pod当中可以同时运行多个容器&#xff0c;在一个…

【Mybatis】深入学习MyBatis:CRUD操作与动态SQL实战指南

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; Mybatis ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 一基本用法 1 CRUD操作 1. 增加&#xff08;Create&#xff09; 2. 查询&#xff08;Read&#xff09; 3. 更新&#x…

深度思考,AI项目的人工智能到底引领的是什么?

项目深度思考&#xff0c;人工智能到底引领的是什么&#xff1f; 人工智能引领技术之舞&#xff1a;项目深度思考项目背景&#xff1a;人工智能的魔法时代技术选择的深度思考&#xff1a;AI大决战团队协作的深度思考&#xff1a;AI联盟大会用户体验的深度思考&#xff1a;AI之光…