springboot自定义事件发布及监听

自定义线程池

java 复制代码
@Configuration
public class MyThreadPool {
    //ThreadPoolTaskExecutor不会自动创建ThreadPoolExecutor,需要手动调initialize才会创建。如果@Bean就不需手动,会自动InitializingBean的afterPropertiesSet来调initialize
    @Bean("myExecutor")
    public Executor createJobExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 线程池活跃的线程数
        executor.setCorePoolSize(20);
        // 设置线程队列最大线程数
        executor.setMaxPoolSize(40);
        // 设置等待队列大小
        executor.setQueueCapacity(200);
        // 线程池维护线程所允许的空闲时间
        executor.setKeepAliveSeconds(60);
        // 线程前缀名称
        executor.setThreadNamePrefix("myExecutor---: ");
        executor.initialize();
        return executor;
    }
}

实体类

java 复制代码
public class StudentEvent extends ApplicationEvent{

	private String id;

	private String name;
	
	public StudentEvent(Object source, String id,String name) {
		super(source);
		this.id = id;
		this.name = name;
	}
}

事件发布

sevice层

java 复制代码
public interface StudentService {
	 void sendStudentEvent(String id, String name);
}

serviceImpl层

java 复制代码
@Service
public class StudentServiceImpl implements StudentService {
    @Autowired
    ApplicationEventPublisher eventPublisher;
	
	@Override
    @Async("myExecutor")
	public void sendStudentEvent(String id, String name){
		StudentEvent studentEvent = new StudentEvent(this,id,name);
		eventPublisher.publishEvent(studentEvent);
	}
}

事件监听

java 复制代码
@Component
public class MyStudentEventListener {

    @EventListener
    @Async("myExecutor")
    public void handleStudentEvent(StudentEvent studentEvent) {
        // 处理事件
    }
}

监听器的执行顺序
如果应用程序中有多个事件监听器,可以通过@Order 注解,指定它们的执行顺序。例如:

java 复制代码
@Component
public class MyEventListener1 {

    @EventListener
    @Order(1)
    public void handleEvent(MyEvent event) {
        // 处理事件
    }
}

@Component
public class MyEventListener2 {

    @EventListener
    @Order(2)
    public void handleEvent(MyEvent event) {
        // 处理事件
    }
}

监听器的条件

只想在特定条件下才执行事件监听器,可以使用 @ConditionalOnProperty 注解:

java 复制代码
@Component
@ConditionalOnProperty(name = "myapp.event.listener.enabled", havingValue = "true")
public class MyEventListener {

    @EventListener
    public void handleEvent(MyEvent event) {
        // 处理事件
    }
}

参考博客:https://blog.csdn.net/albert_xjf/article/details/131326148

相关推荐
子兮曰5 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
小羊没烦恼!5 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
子兮曰5 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
俊昭喜喜里5 天前
java中的继承和多态的区别
java
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
爱勇宝5 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
譕痕5 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码5 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖5 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时5 天前
01-06-A-JVM排查实战详解
java·jvm