自定义线程池
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