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

在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() + " thread name:" + Thread.currentThread());
            
            // 在此处执行具体的异步事件处理逻辑
        }
    }
}

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

注意:

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

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

@Autowired
private ApplicationEventPublisher publisher;

public void publishCustomEvent(String message) {
    System.out.println("publishEvent thread name:" + Thread.currentThread());
    CustomEvent event = new CustomEvent(this, message);
    publisher.publishEvent(event);
}
publishEvent thread name:Thread[http-nio-8081-exec-2,5,main]
Received custom event asynchronously: A custom message thread name:Thread[taskExecutor-6,5,main]

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

posted @   忱康  阅读(235)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示