成功解决@Async注解不生效的问题,异步任务处理问题

首先,有这样一个异步监听方法

然后配置好了异步线程池

复制代码
package com.fdw.study.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;


@ComponentScan(basePackages = {"com.fdw.study.event", "com.fdw.study.eventListener"})
@Configuration
public class EventConfig {

    //自定义线程池
    @Bean
    public ThreadPoolTaskExecutor asyncThreadPoolExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        // 核心线程数
        taskExecutor.setCorePoolSize(4);
        // 线程池维护线程的最大数量,只有在缓冲队列满了之后才会申请超过核心线程数的线程
        taskExecutor.setMaxPoolSize(20);
        // 缓存队列
        taskExecutor.setQueueCapacity(50);
        // 空闲时间,当超过了核心线程数之外的线程在空闲时间到达之后会被销毁
        taskExecutor.setKeepAliveSeconds(200);
        // 异步方法内部线程名称
        taskExecutor.setThreadNamePrefix("fdw-async-executor-");

        /**
         * 当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize,如果还有任务到来就会采取任务拒绝策略
         * 通常有以下四种策略:
         * ThreadPoolExecutor.AbortPolicy:丢弃任务,抛出RejectedExecutionException异常。
         * ThreadPoolExecutor.DiscardPolicy:丢弃任务,但不抛出异常。
         * ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试重新执行任务。
         * ThreadPoolExecutor.CallerRunsPolicy:重试添加当前的任务,自动重复调用 execute() 方法,直到成功。
         */
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        taskExecutor.initialize();
        return taskExecutor;
    }

}

执行测试

复制代码
package com.fdw.study.test;

import com.fdw.study.config.EventConfig;
import com.fdw.study.event.UserChangePasswordEvent;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class EventTest {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(EventConfig.class);
        context.publishEvent(new UserChangePasswordEvent("145623"));

    }
}

发现还是走的main线程,没有实现异步

原因:后来发现是配置类缺少了**@EnableAsync**注解,加上后再测试

现在才是真的异步

相关推荐
龙侠九重天8 分钟前
C# 构建 AI Agent 系统 — 我的实践笔记
开发语言·人工智能·语言模型·自然语言处理·大模型·agent·智能体
SilentSamsara8 分钟前
Pandas 工程化:多层索引、分组聚合与窗口函数的进阶用法
开发语言·python·青少年编程·pandas
何以解忧,唯有..9 分钟前
Python 字符串完全指南:从基础到高级操作
开发语言·python
kiss strong11 分钟前
自制请求工具
开发语言·python·lua
scan72413 分钟前
短期记忆记忆存储在内存里,一个会话里的多轮对话
开发语言·c#
小锋java123433 分钟前
【技术专题】LangChain4j 开发Java Agent智能体 - 嵌入模型与向量数据库
java·人工智能
程序员皮皮林39 分钟前
Dubbo 的 SPI 和 JDK 的 SPI 有什么区别?
java·开发语言·dubbo
小锋java123440 分钟前
10分钟学会Java16新特性record
java
是多巴胺不是尼古丁42 分钟前
java‘期末复习--多态
java·开发语言
瑞雪兆丰年兮1 小时前
[从0开始学Java|第二十五天]项目阶段(综合练习&斗地主小游戏)
java·windows