接着上章所讲的EventPublishingRunListener的构造方法:

SimpleApplicationEventMulticaster是ApplicationEventMulticaster接口的简单实现。它将所有事件多播到所有注册的监听器,让监听器忽略他们不感兴趣的事件。监听器通常会对传入的事件对象执行相应的instanceof检查。默认情况下,所有监听器监听器都在调用线程中调用,这会增加恶意监听器阻塞整个应用程序的危险性。所以最好指定一个替代任务执行器,让监听器在不同的线程中执行,例如从线程池中执行。
public class SimpleApplicationEventMulticaster extends AbstractApplicationEventMulticaster {
@Nullable
private Executor taskExecutor;
@Nullable
private ErrorHandler errorHandler;
@Nullable
private volatile Log lazyLogger;
/**
* 创建一个新的 SimpleApplicationEventMulticaster。
*/
public SimpleApplicationEventMulticaster() {
}
/**
* 为给定的 BeanFactory 创建一个新的 SimpleApplicationEventMulticaster。
*/
public SimpleApplicationEventMulticaster(BeanFactory beanFactory) {
setBeanFactory(beanFactory);
}
/**
* 设置一个自定义执行器(通常是org.springframework.core.task.TaskExecutor )来调用每个监听器。
* 默认相当于org.springframework.core.task.SyncTaskExecutor ,在调用线程中同步执行所有监听器。
* 考虑在此处指定一个异步任务执行器,以在所有监听器都已执行之前不阻塞调用者。但是,请注意,异步执行不会参与调用者的线程上下文(类加载器、事务关联),除非 TaskExecutor 明确支持这一点。
*/
public void setTaskExecutor(@Nullable Executor taskExecutor) {
this.taskExecutor = taskExecutor;
}
/**
* 返回此多播器的当前任务执行器。
*/
@Nullable
protected Executor getTaskExecutor() {
return this.taskExecutor;
}
/**
* 设置ErrorHandler以在侦听器抛出异常时调用。默认值为无,侦听器异常会停止当前多播并传播到当前事件的发布者。
* 如果指定了任务执行器,则每个单独的侦听器异常都会传播到执行器,但不一定会停止其他侦听器的执行。
* 考虑设置一个捕获和记录异常的ErrorHandler实现(例如org.springframework.scheduling.support.TaskUtils.LOG_AND_SUPPRESS_ERROR_HANDLER )或一个在传播异常的同时记录异常的实现(例如org.springframework.scheduling.support.TaskUtils.LOG_AND_PROPAGATE_ERROR_HANDLER )。
*/
public void setErrorHandler(@Nullable ErrorHandler errorHandler) {
this.errorHandler = errorHandler;
}
/**
* 返回此多播器的当前错误处理程序。
*/
@Nullable
protected ErrorHandler getErrorHandler() {
return this.errorHandler;
}
@Override
public void multicastEvent(ApplicationEvent event) {
multicastEvent(event, resolveDefaultEventType(event));
}
@Override
public void multicastEvent(final ApplicationEvent event,

本文介绍了Spring框架中的SimpleApplicationEventMulticaster类,如何构造、配置任务执行器与错误处理,以及如何处理监听器的实例化和多播过程。特别关注了线程安全和异常处理策略。
最低0.47元/天 解锁文章
2654

被折叠的 条评论
为什么被折叠?



