You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
public <T> TgetExtension(Class<T> type, Stringname) {
//SPI never get from spring bean factoryif (type.isInterface() && type.isAnnotationPresent(SPI.class)) {
ExtensionLoader<T> loader = ExtensionLoader.getExtensionLoader(type);
if (!loader.getSupportedExtensions().isEmpty()) {
returnloader.getAdaptiveExtension();
}
returnnull;
}
for (ApplicationContextcontext : contexts) {
if (context.containsBean(name)) {
Objectbean = context.getBean(name);
if (type.isInstance(bean)) {
return (T) bean;
}
}
}
logger.warn("No spring extension(bean) named:" + name + ", try to find an extension(bean) of type " + type.getName());
for (ApplicationContextcontext : contexts) {
try {
returncontext.getBean(type);
} catch (NoUniqueBeanDefinitionExceptionmultiBeanExe) {
throwmultiBeanExe;
} catch (NoSuchBeanDefinitionExceptionnoBeanExe) {
if (logger.isDebugEnabled()) {
logger.debug("Error when get spring extension(bean) for type:" + type.getName(), noBeanExe);
}
}
}
logger.warn("No spring extension(bean) named:" + name + ", type:" + type.getName() + " found, stop get bean.");
returnnull;
}
既然改成这样了为什么要打警告 WARN c.a.d.c.s.e.SpringExtensionFactory:63] [DUBBO] No spring extension(bean) named:defaultCompiler, try to find an extension(bean) of type java.lang.String
dubbo 整合spring boot,在启动的时候发生死锁。在MulticastRegistry 在registered的时候。创建invoker过程中 ,会将MonitorFacotry注入MonitorFilter中。在取MonitorFacotry值时,首先会去SpiExtensionFactory 获取值,如果这里没有获取到;会到SpringExtensionFactory获取,SpringExtensionFactory 这个时候会触发ObjectFactory提前初始化。
这里会锁住所有对象,而被controller注解的,就是其中一员。
这个时候就可能产生死锁。因为main 线程可能正在执行创建bean
被 SPI 注解的接口不应该从SpringExtensionFactory 中获取代理对象。
所以这里修改了SpringExtensionFactory 的getExtension 的方法。
这个是demo的地址,dubbo provider 使用的是dubbo 2.7.0-SNAPSHOT 中的dubbo-demo-provider。
The text was updated successfully, but these errors were encountered: