转载:mp.weixin.qq.com/s?__biz=Mzg…
现象
升级了基础组件,原本领域驱动设计中的领域事件同步执行变长了异步执行,导致业务运行出错。
事件执行原理
看一下源码: org.springframework.context.event.SimpleApplicationEventMulticaster#multicastEvent(org.springframework.context.ApplicationEvent, org.springframework.core.ResolvableType) @Override public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) { ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event)); Executor executor = getTaskExecutor(); for (ApplicationListener<?> listener : getApplicationListeners(event, type)) { if (executor != null) { executor.execute(() -> invokeListener(listener, event)); } else { invokeListener(listener, event); } } }
在事件执行的时候,是根据线程池的配置与否来决定是同步执行还是异步执行。
@Nullable private Executor taskExecutor;
线程池在类SimpleApplicationEventMulticaster中是可以为null的。
我们看一下SimpleApplicationEventMulticaster的创建时机: org.springframework.context.support.AbstractApplicationContext#initApplicationEventMulticaster 图片
如果此容器中没定义ApplicationEventMulticaster,使用默认的SimpleApplicationEventMulticaster,实例化过程中没有配置线程池,即事件会同步执行。
结论
spring中的事件是同步执行还是异步执行,是可以调整的,默认情况下是同步执行,但是一旦实现了自己的事件分发器,配置了线程池(线程池大小不为1),或者对默认的事件分发器配置了线程池,事件的执行就变长了异步。
源码出处:spring-cloud-context-3.1.1
关注公众号,回复:【代码的艺术】获取链接及提取码