之前在分析dubbo服务暴露流程时候,忽略了服务的延迟暴露
- 延迟(配了delay参数)暴露服务是在
ServiceBean
的afterPropertiesSet
方法(bean初始化时)中执行export(),然后通过延时任务(ScheduledExecutor
)来触发服务暴露的。 - 非延迟(未配置delay参数)暴露服务是在
ServiceBean
的onApplicationEvent
方法(spring容器初始化完成时)中执行export()来立即触发服务暴露的。
Dubbo 2.6.5 版本以后,如果我们的服务启动过程需要平滑发布事件,就可以使用delay进行服务延迟暴露。只需在服务提供者的<dubbo:service/>标签中添加delay属性。
正数:单位为毫秒,表示在提供者对象创建完毕后的指定时间后再发布服务。
-1:表示在Spring容器初始化完毕后再向注册中心暴露服务
那么spring的事件发布又是怎样的原理呢?
容器创建的对象的时候->Refresh()->finishRefresh(),即在容器刷新完成的时候执行监听器
原理分析:
1)、refresh;
2)、finishRefresh()
3)、publishEvent:事件发布的流程
getApplicationEventMulticaster().multicastEvent(applicationEvent,eventType);
3.1)、getApplicationEventMulticaster(): 获取事件的多播器(派发器),多播器怎么来的呢?
在容器 refresh()的时候,会执行initApplicationEventMulticaster()方法
3.2)、 multicastEvent 派发事件
先获取到所有的ApplicationListeners
如果有Executor,可以支持使用Executor进行异步派发,否则同步得方式执行派发
、最终执行事件: