Closed theonefx closed 3 years ago
dubbo2.7.8 中已经有事件通知机制了吧,你能举个例子详细说明下现在的问题吗?
Spring Cloud Alibaba 集成 Dubbo 时,对 DubboBootstrap 启动完成是有一个强依赖的。 目前在 SCA 里的做法是通过 spring 的 runner 来实现,但是如果开启了异步事件处理,很可能让这个功能失效。 所以需要一个明确的 Dubbo 启动完成的通知,这样在 Spring Cloud Alibaba 中才好做后续的集成流程。
梳理下代码,DubboBootstrap 确实没有对外提供通知接口。 我是准备加一个接口:
/**
DubboBootstrap Lifecycle */
@SPI
public interface DubboBootstrapLifecycleListener {
/**
* before dubboBootstrap start
*
* @return current {@link DubboBootstrapLifecycleListener}
*/
void beforeDubboBootstrapStart();
/**
* after dubboBootstrap start
* @throws IllegalStateException
*/
void afterDubboBootstrapStart();
/**
* before dubboBootstrap destroy
*
*/
void beforeDubboBootstrapDestroy();
/**
* after dubboBootstrap destroy
*
*/
void afterDubboBootstrapDestroy();
}
在 DubboBootstrap.start 加上如下代码,例如:
public DubboBootstrap start() { if (started.compareAndSet(false, true)) { ready.set(false); dubboBootstrapLifecycleHandle(DubboBootstrapLifecycleStateType.BEFORE_START); initialize(); ...
referServices();
if (asyncExportingFutures.size() > 0) {
new Thread(() -> {
try {
this.awaitFinish();
} catch (Exception e) {
logger.warn(NAME + " exportAsync occurred an exception.");
}
ready.set(true);
dubboBootstrapLifecycleHandle(DubboBootstrapLifecycleStateType.AFTER_STAR);
if (logger.isInfoEnabled()) {
logger.info(NAME + " is ready.");
}
}).start();
} else {
ready.set(true);
dubboBootstrapLifecycleHandle(DubboBootstrapLifecycleStateType.AFTER_STAR);
...
}
}
return this;
}
如果觉得这个方案可行,我就提交一个 pr。
目前的 DubboBootstrap 并不对外通知任何事件,只能通过方法是方法按是否运行完成来判断启动成功。 对于系统间的集成,例如同 Spring Cloud Alibaba 集成,很难保证顺序以及准确性。
所以建议增加一套事件触发和监听机制,以方便下游系统的集成。