首页 > 其他分享 >【Spring】spring事件监听异步处理

【Spring】spring事件监听异步处理

时间:2024-02-24 17:11:24浏览次数:26  
标签:异步 Spring org springframework public spring import event

在Spring框架中,ApplicationEventMulticaster接口是用于发布事件的核心组件。要支持异步处理事件,可以通过配置一个能够执行异步任务的TaskExecutorSimpleApplicationEventMulticaster配合使用。以下是一个配置示例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.event.SimpleApplicationEventMulticaster;
import org.springframework.context.event.EventListener;

@Configuration
public class AsyncEventConfig {

    @Bean(name = "applicationEventMulticaster")
    public SimpleApplicationEventMulticaster simpleApplicationEventMulticaster(TaskExecutor taskExecutor) {
        SimpleApplicationEventMulticaster multicaster = new SimpleApplicationEventMulticaster();
        multicaster.setTaskExecutor(taskExecutor);
        return multicaster;
    }

    @Bean
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 配置线程池参数,比如核心线程数、最大线程数、队列容量等
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(20);
        executor.initialize();
        return executor;
    }

    // 示例监听器,处理CustomEvent类型的事件
    @Component
    public static class CustomEventListener {

        @Async // 这个注解让方法异步执行,需要在类上启用@EnableAsync
        @EventListener
        public void handleCustomEvent(CustomEvent event) {
            System.out.println("Received custom event asynchronously: " + event.getMessage());
            // 在此处执行具体的异步事件处理逻辑
        }
    }
}

// 启用异步方法支持
@Configuration
@EnableAsync
public class AsyncConfig { }

注意:

  • 上述代码中的@EnableAsync注解会开启对异步方法调用的支持,并通过代理方式实现。
  • handleCustomEvent方法上添加了@Async注解,这表示该方法应该被异步调用。
  • 将自定义的SimpleApplicationEventMulticaster设置为应用上下文的默认事件多播器,这样发布的事件将由配置好的线程池异步执行。

发布事件时仍然按照常规方式进行,例如在某个服务类中:

@Autowired
private ApplicationEventPublisher publisher;

public void publishCustomEvent(String message) {
    CustomEvent event = new CustomEvent(this, message);
    publisher.publishEvent(event);
}

当调用publishCustomEvent方法发布事件时,由于已经设置了异步的ApplicationEventMulticaster,所以监听该事件的CustomEventListener类的handleCustomEvent方法将在单独的线程中执行,从而实现了事件的异步处理。

标签:异步,Spring,org,springframework,public,spring,import,event
From: https://www.cnblogs.com/cuipengchong/p/18031293

相关文章

  • 【spring】spring事件监听机制
    Spring框架的事件监听机制是基于观察者模式设计的,它允许应用程序的不同组件之间通过发布和订阅事件进行松散耦合的通信。以下是对Spring事件监听机制的基本流程和技术要点:ApplicationEvent:Spring中的所有事件都必须继承自org.springframework.context.ApplicationEvent类,这个......
  • SpringBoot + Redis 的配置及使用
    一、SpringBoot配置Redis1.1pom引入spring-boot-starter-data-redis包<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></......
  • 异步线程处理request,导致参数获取为null
    原文链接:千万不要把Request传递到异步线程里面!有坑!一、post接口接口参数: 后端代码:@PostMapping("/postTest")publicStringpostTest(HttpServletRequestrequest,HttpServletResponseresponse){//AsyncContextasyncContext=request.startAsync(request,re......
  • Spring Boot 入门
    1、基本介绍简化Spring应用开发的一个框架、整个Spring技术栈的一个大整合;J2EE开发的一站式解决方案;优点:快速创建独立运行的Spring项目以及与主流框架集成;使用嵌入式的Servlet容器,应用无需打成WAR包;starters自动依赖与版本控制;大量的自动配置,简化开发,也可修改默认值;无......
  • java 异步导出zip压缩包
    需求:图片文件太大,采用压缩包下载/** *图片zip压缩包下载 *@paramresponse *@paramzipName压缩包名字 *@paramurls文件图片下载URL路径 *@paramimagesUrlsURL与对应文件名字map *@throwsException */publicstaticvoidexportZip(HttpServletRespon......
  • SpringMVC学习
    SpringMVC是Spring提供的用于简化web开发的框架。 1.5 Servlet能够响应请求的对象。接收请求,返回响应SpringMVC可以认为是Servlet的封装。  1.6SpringMVC开发流程回顾各种配置。Controller,DispatchServlet, 1.7......
  • Spring集成Nacos配置中心
    spring版本4.2.8  nacos:1.1.0 jdk1.8引入依赖<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-spring-context</artifactId><version>1.1.1</version>......
  • 玩转SpringBoot:动态排除Starter配置,轻松部署
    引言在软件开发中,进行本地单元测试是一项常规且必要的任务。然而,在进行单元测试时,有时需要启动一些中间件服务,如Kafka、Elasticjob等。举例来说,我曾经遇到过一个问题:项目中使用了Redisson锁,但由于Redisson版本较低,在Mac环境下偶尔会报错#RedisConnectionException:Unabletoin......
  • shiro 整合 spring 实战及源码详解
    序言前面我们学习了如下内容:5分钟入门shiro安全框架实战笔记shiro整合spring实战及源码详解相信大家对于shiro已经有了最基本的认识,这一节我们一起来学习写如何将shiro与spring进行整合。spring整合maven依赖<dependencies><dependency><group......
  • 使用注解@Async实现异步执行未生效的解决办法
    使用注解@Async实现异步执行未生效的解决办法1、第一种:未在启动类上标注开启异步执行的注解 启动类 @SpringBootApplication@EnableScheduling@EnableAsync@EnableRedisHttpSession(maxInactiveIntervalInSeconds=3600*4)@MapperScan("com.*")publicclassApplicati......