【Java】SpringBoot实现事件监听(异步执行)

这篇具有很好参考价值的文章主要介绍了【Java】SpringBoot实现事件监听(异步执行)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        在Spring Boot中,事件监听是一种机制,通过该机制,你可以定义和触发自定义的事件,以及在应用程序中注册监听器来响应这些事件,提供了一种解耦的方式来处理应用程序中的事件。

文末有源码gitee地址!拉取可进行测试。

事件监听的主要组件包括:

  1. 事件(Event):

    • 事件是一个普通的Java对象,用于封装与应用程序中发生的某个动作或状态变化相关的信息。
  2. 事件发布器(Event Publisher):

    • 事件发布器是一个负责将事件发布给注册的监听器的组件。在Spring中,ApplicationEventPublisher接口定义了事件发布器的标准。
  3. 事件监听器(Event Listener):

    • 事件监听器是用于监听和响应特定事件的组件。在Spring中,通过ApplicationListener接口或使用@EventListener注解来定义事件监听器。

在Spring Boot中实现事件监听的步骤如下:

  1. 定义事件类:

    • 创建一个普通的Java类,用于表示特定的事件。该类通常继承自ApplicationEvent或其子类。
  2. 定义事件发布器(可选):

    • 可以在需要的地方注入ApplicationEventPublisher并使用它来发布事件,或者直接通过Spring容器(ApplicationContext)发布事件。
  3. 定义事件监听器:

    • 创建一个实现ApplicationListener接口或使用@EventListener注解的类,用于监听特定的事件,并在事件发生时执行相应的逻辑。
  4. 注册监听器:

    • 将事件监听器注册到Spring容器中,可以通过注解、Java配置或XML配置来完成。

以下是一个简单的示例,演示了如何在Spring Boot中实现事件监听(主要代码展示):

代码层级结构:

springboot 异步事件,Java,SpringBoot整合,spring boot,java,后端

1.自定义事件类 CoursesTestEvent继承ApplicationEvent

package com.example.springbootredis.event;

import lombok.Getter;
import lombok.Setter;
import org.springframework.context.ApplicationEvent;

/**
 * 课程事件类,继承自 ApplicationEvent,表示课程相关的事件。
 */
@Setter
@Getter
public class CoursesTestEvent extends ApplicationEvent {

    private Integer id;
    /**
     * 课程标题
     */
    private String title;
    /**
     * 课程封面
     */
    private String thumb;
    /**
     * 课程价格(分)
     */
    private Integer charge;
    /**
     * 随便传递几个参数
     * */
    public CoursesTestEvent(Object source, String title, String thumb) {
        super(source);
        this.title = title;
        this.thumb = thumb;
    }

}

2.创建一个事件监听器类 CoursesTestListener:

package com.example.springbootredis.listener;

import com.example.springbootredis.event.CoursesTestEvent;
import com.example.springbootredis.service.CoursesService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

/**
 * 用于测试监听事务,异步执行方法
 * 课程事件监听器类,用于异步更新课程信息。
 */
@Component
@Slf4j
public class CoursesTestListener {

    //根据实际的需求进行注入
    @Autowired
    private CoursesService coursesService;

    /**
     * 异步事件监听方法,用于监听CoursesTestEvent进行更新课程相关信息。
     * @param event 触发的课程的事件。
     */
//    @Async("myTaskExecutor") // 异步执行的注解,线程池
//    @Async() // 异步执行的注解
    @EventListener  // 事件监听器的注解
    public void updateLoginInfo(CoursesTestEvent event)  {
        //检查是否能够获取到CoursesTestEvent
        System.out.println("title:"+event.getTitle());
        System.out.println("thumb:"+event.getThumb());
        System.out.println(3);
        // 打印当前线程的信息
        System.out.println("执行当前线程的名称3: " + Thread.currentThread().getName());
    }
}

3.在业务逻辑中进行测试事件监听:

package com.example.springbootredis.service.impl;

import com.example.springbootredis.domain.Courses;
import com.example.springbootredis.event.CoursesTestEvent;
import com.example.springbootredis.mapper.CoursesMapper;
import com.example.springbootredis.service.CoursesService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
@Slf4j
public class CoursesServiceImpl implements CoursesService {

    @Autowired
    private CoursesMapper coursesMapper;

    //用于管理和维护Bean以及处理Bean之间依赖关系的核心容器。
    @Autowired
    private ApplicationContext applicationContext;

    //进行异步测试
    @Override
    public List<Courses> asyTest() {

        List<Courses> courses = coursesMapper.findAll();
        System.out.println(1);
        // 打印当前线程的信息
        System.out.println("执行当前线程的名称1: " + Thread.currentThread().getName());
        // 发布自定义的课程测试事件
        applicationContext.publishEvent(new CoursesTestEvent(this,courses.get(0).getTitle(),courses.get(0).getThumb()));
        System.out.println(2);
        System.out.println("执行当前线程的名称2: " + Thread.currentThread().getName());
        return courses;
    }

}

4.代码执行结果(没有使用异步):

springboot 异步事件,Java,SpringBoot整合,spring boot,java,后端

测试达到了监听的效果了,但是都是同一个线程执行,按照顺序进行执行,没有达到异步的效果。为了增加响应的效率,对监听事件进行异步的执行。

Spring Boot的异步任务通常使用以下几个核心注解:

    @EnableAsync:
        在Spring Boot应用程序的配置类上添加@EnableAsync注解,以启用异步任务支持。这样Spring会为异步方法创建一个代理,允许它们在单独的线程中执行。

package com.example.springbootredis;


import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication
@MapperScan("com.example.springbootredis.mapper")
@EnableAsync //开启异步任务支持(主要)
public class SpringbootRedisApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootRedisApplication.class, args);
    }

}

    @Async:
        在需要异步执行的方法上添加@Async注解。这告诉Spring框架将这个方法的调用包装在一个新的线程中执行。

package com.example.springbootredis.listener;

import com.example.springbootredis.event.CoursesTestEvent;
import com.example.springbootredis.service.CoursesService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

/**
 * 用于测试监听事务,异步执行方法
 * 课程事件监听器类,用于异步更新课程信息。
 */
@Component
@Slf4j
public class CoursesTestListener {

    //根据实际的需求进行注入
    @Autowired
    private CoursesService coursesService;

    /**
     * 异步事件监听方法,用于监听CoursesTestEvent进行更新课程相关信息。
     * @param event 触发的课程的事件。
     */
//    @Async("myTaskExecutor") // 异步执行的注解,线程池
    @Async() // 异步执行的注解
    @EventListener  // 事件监听器的注解
    public void updateLoginInfo(CoursesTestEvent event)  {
        //检查是否能够获取到CoursesTestEvent
        System.out.println("title:"+event.getTitle());
        System.out.println("thumb:"+event.getThumb());
        System.out.println(3);
        // 打印当前线程的信息
        System.out.println("执行当前线程的名称3: " + Thread.currentThread().getName());
    }
}

再进行测试(异步):

springboot 异步事件,Java,SpringBoot整合,spring boot,java,后端

这样就达到异步的效果了,对监听事件进行异步执行。如果想直接进行测试,下面是gitee地址:创建一个数据库将courses.sql文件进行执行,启动即可测试:https://gitee.com/sophisticatedxin/springboot-asy-demo.git文章来源地址https://www.toymoban.com/news/detail-854520.html

到了这里,关于【Java】SpringBoot实现事件监听(异步执行)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot自定义事件发布及监听

    自定义线程池 实体类 事件发布 sevice层 serviceImpl层 事件监听 监听器的执行顺序 如果应用程序中有多个事件监听器,可以通过@Order 注解,指定它们的执行顺序。例如: 监听器的条件 只想在特定条件下才执行事件监听器,可以使用 @ConditionalOnProperty 注解: 参考博客:https://bl

    2024年02月10日
    浏览(40)
  • SpringBoot异步执行方法

    1. 源码跟踪 1.简单描述 在SpringBoot2.0.9之前需要手动自定义线程池(如下2.1), 然后指定线程池的名称 SpringBoot2.0.9以及之前的版本,使用的线程池默认是 SimpleAsyncTaskExcutor , , 之后的版本使用的是 ThreadpoolTaskExecutor 并且不需要手动的创建当前线程池(但往往我们还是会手动指定,具体原

    2024年02月07日
    浏览(35)
  • springboot 异步执行方法详细介绍

            在Spring Boot中,异步执行方法是一种提高应用程序性能和响应性的技术。通过异步执行,你可以在处理耗时的业务逻辑时,不需要阻塞当前线程,从而提高应用程序的吞吐量和并发处理能力。         基本概念         在Spring中,异步执行通常是通过`@Asy

    2024年02月21日
    浏览(36)
  • springboot监听Redis 缓存过期(Key 失效)事件

    事件通过 Redis 的订阅与发布功能(pub/sub)来进行分发, 故需要开启 redis 的事件监听与发布 修改 redis.conf 文件(Windows上是redis.windows.conf和redis.windows-service.conf) 通过开启key过期的事件通知,当key过期时,会发布过期事件;我们定义key过期事件的监听器,当key过期时,就能收到

    2024年02月12日
    浏览(39)
  • Flutter实现ControlExecutor进行多个异步任务执行时监听状态并可指定最后执行的异步并在指定的异步执行完毕后结束executor并回调。

    1.场景 当有多个接口请求时,且接口调用不是同时进行时,而且接口调用有可能时链式的,中间也有可能加入别的逻辑,但是需要在第一个接口调用时打开等待框,在最后一个接口调用完成时关闭等待框类似需求时,可以用到ControlExecutor进行接口执行过程的监听,并可标记最

    2024年02月09日
    浏览(37)
  • 【SpringBoot笔记34】Spring Events事件驱动编程之事件的发布和监听操作

    这篇文章,主要介绍Spring Events事件驱动编程之事件的发布和监听操作。 目录 一、基于接口实现 1.1、自定义事件 1.2、主动发布事件 1.3、监听事件对象

    2024年02月16日
    浏览(41)
  • 一文详解 springboot 项目启动时异步执行初始化逻辑

    你知道的越多,你不知道的越多 点赞再看,养成习惯 如果您有疑问或者见解,欢迎指教: 企鹅:869192208 前言 前面的工作中,为了提高地区数据的响应时间,需要加载全国区划数据到 redis 中缓存起来,这个过程希望在项目时启动。 由于初始化全国区划到 redis 中这个过程是

    2024年02月12日
    浏览(48)
  • 基于Java+SpringBoot+Vue前后端分离MES生产制造执行系统设计和实现

    博主介绍 : ✌ 全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作 ✌ 主要内容: SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、P

    2024年01月20日
    浏览(39)
  • java 实现事件监听EventListener的方式详解及分析

    我们开发中经常遇到监听事件,首先我们先来了解下事件相关知识: 使用场景(场景一):银行操作转账成功后需要给客户发送短信和邮件,使用事件就可以实现解耦并异步。 我们监听事件之前要有事件源source,创建事件源(Event),发布事件(publishEvent),然后才能到监听事

    2024年02月07日
    浏览(33)
  • SpringBoot 实现异步任务

    在多数的Java项目中,在很多的场景都是用同步的方式去实现模块间的相互调用,在模块调用间可能会造成一些延迟,本篇文章将使用SpringBoot 去实现异步之间的调用, 提高系统的并发性能、用户体验。 简单直观:同步任务的执行是顺序的,代码执行的流程清晰明了,易于理

    2024年02月10日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包