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

相关推荐
是小蟹呀^1 小时前
Spring Security + JWT 面试题整理
java·jwt·springsecurity
spencer_tseng3 小时前
Redis + Nacos.bat
java·windows·dos
霸道流氓气质4 小时前
SpringBoot中通用工具类库(Utils)封装与使用实践
spring boot·后端·python
troyzhxu4 小时前
列表查询的 GraphQL —— 一行代码终结你的 if-else 地狱!
java·springboot·graphql
孫治AllenSun5 小时前
【DataX】生产环境搭建DataX集群案例
java·开发语言·jvm
好好沉淀6 小时前
@NotBlank(message = “{xxx}“) 注解中花括号的含义
java
fīɡЙtīиɡ ℡6 小时前
内存泄漏产生的原因
java·spring·servlet
hkj88086 小时前
Ubuntu 切换java版本
java·linux·ubuntu