From 0df34a1a20811d4a03032d03dac146c59bd52b34 Mon Sep 17 00:00:00 2001 From: Albumen Kevin Date: Thu, 22 Dec 2022 10:02:22 +0800 Subject: [PATCH] Remove ExtensionLoader getExtension usage (#10971) --- .../org/apache/dubbo/common/Parameters.java | 16 ++ .../convert/multiple/MultiValueConverter.java | 11 +- .../component/param/DynamicParamTable.java | 4 +- .../AbstractServiceRestMetadataResolver.java | 10 +- .../DefaultServiceRestMetadataResolver.java | 5 + .../JAXRSServiceRestMetadataResolver.java | 4 + .../SpringMvcServiceRestMetadataResolver.java | 5 + .../JAXRSServiceRestMetadataResolverTest.java | 3 +- ...ingMvcServiceRestMetadataResolverTest.java | 3 +- .../builder/TypeDefinitionBuilder.java | 6 +- .../AbstractServiceRestMetadataResolver.java | 5 +- ...erviceRestMetadataAnnotationProcessor.java | 6 +- .../dubbo/DubboMonitorFactoryTest.java | 3 +- .../monitor/dubbo/MetricsFilterTest.java | 5 +- .../dubbo/remoting/exchange/Exchangers.java | 4 +- .../support/ExchangeHandlerAdapter.java | 4 + .../support/ExchangeHandlerDispatcher.java | 11 +- .../telnet/support/TelnetHandlerAdapter.java | 7 +- .../support/command/HelpTelnetHandler.java | 7 +- .../dubbo/remoting/ChanelHandlerTest.java | 2 + .../dubbo/remoting/PerformanceClientTest.java | 4 + .../dubbo/remoting/PerformanceServerTest.java | 5 +- .../telnet/support/HelpTelnetHandlerTest.java | 3 +- .../support/TelnetHandlerAdapterTest.java | 3 +- .../transport/netty/ClientReconnectTest.java | 5 + .../transport/netty4/ClientReconnectTest.java | 5 + .../rpc/protocol/dubbo/DubboProtocol.java | 235 +++++++++--------- .../dubbo/status/ThreadPoolStatusChecker.java | 10 +- .../dubbo/DubboInvokerAvailableTest.java | 3 +- .../dubbo/decode/DubboTelnetDecodeTest.java | 12 +- .../status/ThreadPoolStatusCheckerTest.java | 3 +- .../rpc/protocol/grpc/GrpcOptionsUtils.java | 4 +- .../actuate/health/DubboHealthIndicator.java | 4 +- .../context/MockSpringInitCustomizer.java | 4 +- 34 files changed, 253 insertions(+), 168 deletions(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/Parameters.java b/dubbo-common/src/main/java/org/apache/dubbo/common/Parameters.java index 711a64ea61..42f7bd5459 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/Parameters.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/Parameters.java @@ -62,21 +62,37 @@ public class Parameters { return parameters; } + /** + * @deprecated will be removed in 3.3.0 + */ + @Deprecated public T getExtension(Class type, String key) { String name = getParameter(key); return ExtensionLoader.getExtensionLoader(type).getExtension(name); } + /** + * @deprecated will be removed in 3.3.0 + */ + @Deprecated public T getExtension(Class type, String key, String defaultValue) { String name = getParameter(key, defaultValue); return ExtensionLoader.getExtensionLoader(type).getExtension(name); } + /** + * @deprecated will be removed in 3.3.0 + */ + @Deprecated public T getMethodExtension(Class type, String method, String key) { String name = getMethodParameter(method, key); return ExtensionLoader.getExtensionLoader(type).getExtension(name); } + /** + * @deprecated will be removed in 3.3.0 + */ + @Deprecated public T getMethodExtension(Class type, String method, String key, String defaultValue) { String name = getMethodParameter(method, key, defaultValue); return ExtensionLoader.getExtensionLoader(type).getExtension(name); diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/MultiValueConverter.java b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/MultiValueConverter.java index 9b5210d541..358f56d360 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/MultiValueConverter.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/convert/multiple/MultiValueConverter.java @@ -20,10 +20,10 @@ import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.common.extension.ExtensionScope; import org.apache.dubbo.common.extension.SPI; import org.apache.dubbo.common.lang.Prioritized; +import org.apache.dubbo.rpc.model.FrameworkModel; import java.util.Collection; -import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader; import static org.apache.dubbo.common.utils.TypeUtils.findActualTypeArgument; /** @@ -72,9 +72,12 @@ public interface MultiValueConverter extends Prioritized { * @return null if not found * @see ExtensionLoader#getSupportedExtensionInstances() * @since 2.7.8 + * @deprecated will be removed in 3.3.0 */ + @Deprecated static MultiValueConverter find(Class sourceType, Class targetType) { - return getExtensionLoader(MultiValueConverter.class) + return FrameworkModel.defaultModel() + .getExtensionLoader(MultiValueConverter.class) .getSupportedExtensionInstances() .stream() .filter(converter -> converter.accept(sourceType, targetType)) @@ -82,6 +85,10 @@ public interface MultiValueConverter extends Prioritized { .orElse(null); } + /** + * @deprecated will be removed in 3.3.0 + */ + @Deprecated static T convertIfPossible(Object source, Class multiValueType, Class elementType) { Class sourceType = source.getClass(); MultiValueConverter converter = find(sourceType, multiValueType); diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/param/DynamicParamTable.java b/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/param/DynamicParamTable.java index a86919ff94..56fa54079b 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/param/DynamicParamTable.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/param/DynamicParamTable.java @@ -16,7 +16,7 @@ */ package org.apache.dubbo.common.url.component.param; -import org.apache.dubbo.common.extension.ExtensionLoader; +import org.apache.dubbo.rpc.model.FrameworkModel; import java.util.Arrays; import java.util.Comparator; @@ -89,7 +89,7 @@ public final class DynamicParamTable { keys.add(""); values.add(new DynamicValues(null)); - ExtensionLoader.getExtensionLoader(DynamicParamSource.class) + FrameworkModel.defaultModel().getExtensionLoader(DynamicParamSource.class) .getSupportedExtensionInstances().forEach(source -> source.init(keys, values)); TreeMap resultMap = new TreeMap<>(Comparator.comparingInt(System::identityHashCode)); diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/AbstractServiceRestMetadataResolver.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/AbstractServiceRestMetadataResolver.java index eb48bdaa21..70434278da 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/AbstractServiceRestMetadataResolver.java +++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/AbstractServiceRestMetadataResolver.java @@ -22,6 +22,7 @@ import org.apache.dubbo.config.annotation.DubboService; import org.apache.dubbo.config.annotation.Service; import org.apache.dubbo.metadata.definition.MethodDefinitionBuilder; import org.apache.dubbo.metadata.definition.model.MethodDefinition; +import org.apache.dubbo.rpc.model.ApplicationModel; import java.lang.annotation.Annotation; import java.lang.reflect.Method; @@ -38,7 +39,6 @@ import java.util.function.Consumer; import static java.util.Collections.emptyList; import static java.util.Collections.sort; import static java.util.Collections.unmodifiableMap; -import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader; import static org.apache.dubbo.common.function.ThrowableFunction.execute; import static org.apache.dubbo.common.utils.AnnotationUtils.isAnyAnnotationPresent; import static org.apache.dubbo.common.utils.ClassUtils.forName; @@ -57,8 +57,8 @@ public abstract class AbstractServiceRestMetadataResolver implements ServiceRest private final Map> parameterProcessorsMap; - public AbstractServiceRestMetadataResolver() { - this.parameterProcessorsMap = loadAnnotatedMethodParameterProcessors(); + public AbstractServiceRestMetadataResolver(ApplicationModel applicationModel) { + this.parameterProcessorsMap = loadAnnotatedMethodParameterProcessors(applicationModel); } @Override @@ -329,9 +329,9 @@ public abstract class AbstractServiceRestMetadataResolver implements ServiceRest Class serviceInterfaceClass, RestMethodMetadata metadata) { } - private static Map> loadAnnotatedMethodParameterProcessors() { + private static Map> loadAnnotatedMethodParameterProcessors(ApplicationModel applicationModel) { Map> parameterProcessorsMap = new LinkedHashMap<>(); - getExtensionLoader(AnnotatedMethodParameterProcessor.class) + applicationModel.getExtensionLoader(AnnotatedMethodParameterProcessor.class) .getSupportedExtensionInstances() .forEach(processor -> { List processors = diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/DefaultServiceRestMetadataResolver.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/DefaultServiceRestMetadataResolver.java index ce53dd883e..926fc64d4c 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/DefaultServiceRestMetadataResolver.java +++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/DefaultServiceRestMetadataResolver.java @@ -16,6 +16,8 @@ */ package org.apache.dubbo.metadata.rest; +import org.apache.dubbo.rpc.model.ApplicationModel; + import java.lang.reflect.Method; import java.util.Set; @@ -26,6 +28,9 @@ import java.util.Set; * @since 2.7.6 */ public class DefaultServiceRestMetadataResolver extends AbstractServiceRestMetadataResolver { + public DefaultServiceRestMetadataResolver(ApplicationModel applicationModel) { + super(applicationModel); + } @Override protected boolean supports0(Class serviceType) { diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/jaxrs/JAXRSServiceRestMetadataResolver.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/jaxrs/JAXRSServiceRestMetadataResolver.java index 78d174e05e..35df2e7a7a 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/jaxrs/JAXRSServiceRestMetadataResolver.java +++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/jaxrs/JAXRSServiceRestMetadataResolver.java @@ -18,6 +18,7 @@ package org.apache.dubbo.metadata.rest.jaxrs; import org.apache.dubbo.metadata.rest.AbstractServiceRestMetadataResolver; import org.apache.dubbo.metadata.rest.ServiceRestMetadataResolver; +import org.apache.dubbo.rpc.model.ApplicationModel; import java.lang.annotation.Annotation; import java.lang.reflect.Method; @@ -40,6 +41,9 @@ import static org.apache.dubbo.metadata.rest.RestMetadataConstants.JAX_RS.PRODUC * @since 2.7.6 */ public class JAXRSServiceRestMetadataResolver extends AbstractServiceRestMetadataResolver { + public JAXRSServiceRestMetadataResolver(ApplicationModel applicationModel) { + super(applicationModel); + } @Override protected boolean supports0(Class serviceType) { diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/springmvc/SpringMvcServiceRestMetadataResolver.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/springmvc/SpringMvcServiceRestMetadataResolver.java index de64592ab8..bd94509e7a 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/springmvc/SpringMvcServiceRestMetadataResolver.java +++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/springmvc/SpringMvcServiceRestMetadataResolver.java @@ -18,6 +18,7 @@ package org.apache.dubbo.metadata.rest.springmvc; import org.apache.dubbo.metadata.rest.AbstractServiceRestMetadataResolver; import org.apache.dubbo.metadata.rest.ServiceRestMetadataResolver; +import org.apache.dubbo.rpc.model.ApplicationModel; import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; @@ -48,6 +49,10 @@ public class SpringMvcServiceRestMetadataResolver extends AbstractServiceRestMet private static final int FIRST_ELEMENT_INDEX = 0; + public SpringMvcServiceRestMetadataResolver(ApplicationModel applicationModel) { + super(applicationModel); + } + @Override protected boolean supports0(Class serviceType) { return isAnnotationPresent(serviceType, CONTROLLER_ANNOTATION_CLASS); diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/rest/jaxrs/JAXRSServiceRestMetadataResolverTest.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/rest/jaxrs/JAXRSServiceRestMetadataResolverTest.java index 1e1acb1cf3..fe18bbb5c4 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/rest/jaxrs/JAXRSServiceRestMetadataResolverTest.java +++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/rest/jaxrs/JAXRSServiceRestMetadataResolverTest.java @@ -23,6 +23,7 @@ import org.apache.dubbo.metadata.rest.RestService; import org.apache.dubbo.metadata.rest.ServiceRestMetadata; import org.apache.dubbo.metadata.rest.SpringRestService; import org.apache.dubbo.metadata.rest.StandardRestService; +import org.apache.dubbo.rpc.model.ApplicationModel; import org.junit.jupiter.api.Test; @@ -39,7 +40,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; */ class JAXRSServiceRestMetadataResolverTest { - private JAXRSServiceRestMetadataResolver instance = new JAXRSServiceRestMetadataResolver(); + private JAXRSServiceRestMetadataResolver instance = new JAXRSServiceRestMetadataResolver(ApplicationModel.defaultModel()); @Test void testSupports() { diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/rest/springmvc/SpringMvcServiceRestMetadataResolverTest.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/rest/springmvc/SpringMvcServiceRestMetadataResolverTest.java index e7d0ba42ca..388030d4d9 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/rest/springmvc/SpringMvcServiceRestMetadataResolverTest.java +++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/rest/springmvc/SpringMvcServiceRestMetadataResolverTest.java @@ -23,6 +23,7 @@ import org.apache.dubbo.metadata.rest.RestService; import org.apache.dubbo.metadata.rest.ServiceRestMetadata; import org.apache.dubbo.metadata.rest.SpringRestService; import org.apache.dubbo.metadata.rest.StandardRestService; +import org.apache.dubbo.rpc.model.ApplicationModel; import org.junit.jupiter.api.Test; @@ -39,7 +40,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; */ class SpringMvcServiceRestMetadataResolverTest { - private SpringMvcServiceRestMetadataResolver instance = new SpringMvcServiceRestMetadataResolver(); + private SpringMvcServiceRestMetadataResolver instance = new SpringMvcServiceRestMetadataResolver(ApplicationModel.defaultModel()); @Test void testSupports() { diff --git a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/TypeDefinitionBuilder.java b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/TypeDefinitionBuilder.java index ff389ae976..b717037145 100644 --- a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/TypeDefinitionBuilder.java +++ b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/builder/TypeDefinitionBuilder.java @@ -18,14 +18,13 @@ package org.apache.dubbo.metadata.annotation.processing.builder; import org.apache.dubbo.common.lang.Prioritized; import org.apache.dubbo.metadata.definition.model.TypeDefinition; +import org.apache.dubbo.rpc.model.ApplicationModel; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; import javax.lang.model.type.TypeMirror; import java.util.Map; -import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader; - /** * A class builds the instance of {@link TypeDefinition} * @@ -57,7 +56,8 @@ public interface TypeDefinitionBuilder extends Prioritized static TypeDefinition build(ProcessingEnvironment processingEnv, TypeMirror type, Map typeCache) { // Build by all instances of TypeDefinitionBuilder that were loaded By Java SPI - TypeDefinition typeDefinition = getExtensionLoader(TypeBuilder.class) + TypeDefinition typeDefinition = ApplicationModel.defaultModel() + .getExtensionLoader(TypeBuilder.class) .getSupportedExtensionInstances() .stream() // load(TypeDefinitionBuilder.class, TypeDefinitionBuilder.class.getClassLoader()) diff --git a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/rest/AbstractServiceRestMetadataResolver.java b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/rest/AbstractServiceRestMetadataResolver.java index 9609d93b6d..c4d85e98a9 100644 --- a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/rest/AbstractServiceRestMetadataResolver.java +++ b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/rest/AbstractServiceRestMetadataResolver.java @@ -21,6 +21,7 @@ import org.apache.dubbo.metadata.definition.model.MethodDefinition; import org.apache.dubbo.metadata.rest.RequestMetadata; import org.apache.dubbo.metadata.rest.RestMethodMetadata; import org.apache.dubbo.metadata.rest.ServiceRestMetadata; +import org.apache.dubbo.rpc.model.ApplicationModel; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.AnnotationMirror; @@ -44,7 +45,6 @@ import static java.util.Collections.emptyList; import static java.util.Collections.sort; import static java.util.Optional.empty; import static java.util.Optional.of; -import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader; import static org.apache.dubbo.metadata.annotation.processing.builder.MethodDefinitionBuilder.build; import static org.apache.dubbo.metadata.annotation.processing.util.LoggerUtils.info; import static org.apache.dubbo.metadata.annotation.processing.util.MethodUtils.getOverrideMethod; @@ -268,7 +268,8 @@ public abstract class AbstractServiceRestMetadataResolver implements ServiceRest // load(AnnotatedMethodParameterProcessor.class, AnnotatedMethodParameterProcessor.class.getClassLoader()) - getExtensionLoader(AnnotatedMethodParameterProcessor.class) + ApplicationModel.defaultModel() + .getExtensionLoader(AnnotatedMethodParameterProcessor.class) .getSupportedExtensionInstances() .forEach(processor -> { List processors = diff --git a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/rest/ServiceRestMetadataAnnotationProcessor.java b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/rest/ServiceRestMetadataAnnotationProcessor.java index 739c813dfb..e4d904a1cb 100644 --- a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/rest/ServiceRestMetadataAnnotationProcessor.java +++ b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/rest/ServiceRestMetadataAnnotationProcessor.java @@ -18,6 +18,7 @@ package org.apache.dubbo.metadata.annotation.processing.rest; import org.apache.dubbo.metadata.annotation.processing.AbstractServiceAnnotationProcessor; import org.apache.dubbo.metadata.rest.ServiceRestMetadata; +import org.apache.dubbo.rpc.model.ApplicationModel; import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.Processor; @@ -28,7 +29,6 @@ import java.util.LinkedHashSet; import java.util.Set; import static javax.lang.model.util.ElementFilter.typesIn; -import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader; import static org.apache.dubbo.metadata.annotation.processing.util.ServiceAnnotationUtils.isServiceAnnotationPresent; /** @@ -49,7 +49,9 @@ public class ServiceRestMetadataAnnotationProcessor extends AbstractServiceAnnot @Override public synchronized void init(ProcessingEnvironment processingEnv) { super.init(processingEnv); - this.metadataProcessors = getExtensionLoader(ServiceRestMetadataResolver.class).getSupportedExtensionInstances(); + this.metadataProcessors = ApplicationModel.defaultModel() + .getExtensionLoader(ServiceRestMetadataResolver.class) + .getSupportedExtensionInstances(); this.serviceRestMetadataWriter = new ServiceRestMetadataStorage(processingEnv); } diff --git a/dubbo-monitor/dubbo-monitor-default/src/test/java/org/apache/dubbo/monitor/dubbo/DubboMonitorFactoryTest.java b/dubbo-monitor/dubbo-monitor-default/src/test/java/org/apache/dubbo/monitor/dubbo/DubboMonitorFactoryTest.java index f7b1f0734b..d5fdb3b4a6 100644 --- a/dubbo-monitor/dubbo-monitor-default/src/test/java/org/apache/dubbo/monitor/dubbo/DubboMonitorFactoryTest.java +++ b/dubbo-monitor/dubbo-monitor-default/src/test/java/org/apache/dubbo/monitor/dubbo/DubboMonitorFactoryTest.java @@ -20,6 +20,7 @@ import org.apache.dubbo.common.URL; import org.apache.dubbo.monitor.Monitor; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.ProxyFactory; +import org.apache.dubbo.rpc.model.FrameworkModel; import org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol; import org.junit.jupiter.api.BeforeEach; @@ -45,7 +46,7 @@ class DubboMonitorFactoryTest { public void setUp() throws Exception { initMocks(this); this.dubboMonitorFactory = new DubboMonitorFactory(); - this.dubboMonitorFactory.setProtocol(new DubboProtocol()); + this.dubboMonitorFactory.setProtocol(new DubboProtocol(FrameworkModel.defaultModel())); this.dubboMonitorFactory.setProxyFactory(proxyFactory); } diff --git a/dubbo-monitor/dubbo-monitor-default/src/test/java/org/apache/dubbo/monitor/dubbo/MetricsFilterTest.java b/dubbo-monitor/dubbo-monitor-default/src/test/java/org/apache/dubbo/monitor/dubbo/MetricsFilterTest.java index 154e0848c3..d1ec4113f7 100644 --- a/dubbo-monitor/dubbo-monitor-default/src/test/java/org/apache/dubbo/monitor/dubbo/MetricsFilterTest.java +++ b/dubbo-monitor/dubbo-monitor-default/src/test/java/org/apache/dubbo/monitor/dubbo/MetricsFilterTest.java @@ -28,6 +28,7 @@ import org.apache.dubbo.rpc.RpcContext; import org.apache.dubbo.rpc.RpcException; import org.apache.dubbo.rpc.RpcInvocation; import org.apache.dubbo.rpc.model.ApplicationModel; +import org.apache.dubbo.rpc.model.FrameworkModel; import org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol; import com.alibaba.metrics.FastCompass; @@ -247,7 +248,7 @@ class MetricsFilterTest { //ignore } } - Protocol protocol = new DubboProtocol(); + Protocol protocol = new DubboProtocol(FrameworkModel.defaultModel()); // using host name might cause connection failure because multiple addresses might be configured to the same name! url = URL.valueOf("dubbo://" + NetUtils.getLocalHost() + ":" + port + "/" + MetricsService.class.getName()); Invoker invoker = protocol.refer(MetricsService.class, url); @@ -306,7 +307,7 @@ class MetricsFilterTest { } } - Protocol protocol = new DubboProtocol(); + Protocol protocol = new DubboProtocol(FrameworkModel.defaultModel()); // using host name might cause connection failure because multiple addresses might be configured to the same name! url = URL.valueOf("dubbo://" + NetUtils.getLocalHost() + ":" + port + "/" + MetricsService.class.getName()); Invoker invoker = protocol.refer(MetricsService.class, url); diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/Exchangers.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/Exchangers.java index 2d181dd451..950b06ac48 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/Exchangers.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/Exchangers.java @@ -51,7 +51,7 @@ public class Exchangers { } public static ExchangeServer bind(URL url, ChannelHandler handler, Replier replier) throws RemotingException { - return bind(url, new ExchangeHandlerDispatcher(replier, handler)); + return bind(url, new ExchangeHandlerDispatcher(url.getOrDefaultFrameworkModel(), replier, handler)); } public static ExchangeServer bind(String url, ExchangeHandler handler) throws RemotingException { @@ -90,7 +90,7 @@ public class Exchangers { } public static ExchangeClient connect(URL url, ChannelHandler handler, Replier replier) throws RemotingException { - return connect(url, new ExchangeHandlerDispatcher(replier, handler)); + return connect(url, new ExchangeHandlerDispatcher(url.getOrDefaultFrameworkModel(), replier, handler)); } public static ExchangeClient connect(String url, ExchangeHandler handler) throws RemotingException { diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/ExchangeHandlerAdapter.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/ExchangeHandlerAdapter.java index bc3e33ae5e..6b923cfb5e 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/ExchangeHandlerAdapter.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/ExchangeHandlerAdapter.java @@ -20,6 +20,7 @@ import org.apache.dubbo.remoting.RemotingException; import org.apache.dubbo.remoting.exchange.ExchangeChannel; import org.apache.dubbo.remoting.exchange.ExchangeHandler; import org.apache.dubbo.remoting.telnet.support.TelnetHandlerAdapter; +import org.apache.dubbo.rpc.model.FrameworkModel; import java.util.concurrent.CompletableFuture; @@ -27,6 +28,9 @@ import java.util.concurrent.CompletableFuture; * ExchangeHandlerAdapter */ public abstract class ExchangeHandlerAdapter extends TelnetHandlerAdapter implements ExchangeHandler { + public ExchangeHandlerAdapter(FrameworkModel frameworkModel) { + super(frameworkModel); + } @Override public CompletableFuture reply(ExchangeChannel channel, Object msg) throws RemotingException { diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/ExchangeHandlerDispatcher.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/ExchangeHandlerDispatcher.java index ea1736c2af..066c700187 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/ExchangeHandlerDispatcher.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/ExchangeHandlerDispatcher.java @@ -24,6 +24,7 @@ import org.apache.dubbo.remoting.exchange.ExchangeHandler; import org.apache.dubbo.remoting.telnet.TelnetHandler; import org.apache.dubbo.remoting.telnet.support.TelnetHandlerAdapter; import org.apache.dubbo.remoting.transport.ChannelHandlerDispatcher; +import org.apache.dubbo.rpc.model.FrameworkModel; import java.util.concurrent.CompletableFuture; @@ -39,21 +40,21 @@ public class ExchangeHandlerDispatcher implements ExchangeHandler { private final TelnetHandler telnetHandler; public ExchangeHandlerDispatcher() { - this(null, null); + this(FrameworkModel.defaultModel(), null, (ChannelHandler) null); } public ExchangeHandlerDispatcher(Replier replier) { - this(replier, null); + this(FrameworkModel.defaultModel(), replier, (ChannelHandler) null); } public ExchangeHandlerDispatcher(ChannelHandler... handlers) { - this(null, handlers); + this(FrameworkModel.defaultModel(), null, handlers); } - public ExchangeHandlerDispatcher(Replier replier, ChannelHandler... handlers) { + public ExchangeHandlerDispatcher(FrameworkModel frameworkModel, Replier replier, ChannelHandler... handlers) { replierDispatcher = new ReplierDispatcher(replier); handlerDispatcher = new ChannelHandlerDispatcher(handlers); - telnetHandler = new TelnetHandlerAdapter(); + telnetHandler = new TelnetHandlerAdapter(frameworkModel); } public ExchangeHandlerDispatcher addChannelHandler(ChannelHandler handler) { diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/telnet/support/TelnetHandlerAdapter.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/telnet/support/TelnetHandlerAdapter.java index 9168a87c05..cb18ed7cb1 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/telnet/support/TelnetHandlerAdapter.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/telnet/support/TelnetHandlerAdapter.java @@ -24,13 +24,18 @@ import org.apache.dubbo.remoting.Constants; import org.apache.dubbo.remoting.RemotingException; import org.apache.dubbo.remoting.telnet.TelnetHandler; import org.apache.dubbo.remoting.transport.ChannelHandlerAdapter; +import org.apache.dubbo.rpc.model.FrameworkModel; import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN; import static org.apache.dubbo.remoting.Constants.TELNET_KEY; public class TelnetHandlerAdapter extends ChannelHandlerAdapter implements TelnetHandler { - private final ExtensionLoader extensionLoader = ExtensionLoader.getExtensionLoader(TelnetHandler.class); + private final ExtensionLoader extensionLoader; + + public TelnetHandlerAdapter(FrameworkModel frameworkModel) { + extensionLoader = frameworkModel.getExtensionLoader(TelnetHandler.class); + } @Override public String telnet(Channel channel, String message) throws RemotingException { diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/telnet/support/command/HelpTelnetHandler.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/telnet/support/command/HelpTelnetHandler.java index 720b0efeb0..04c8142766 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/telnet/support/command/HelpTelnetHandler.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/telnet/support/command/HelpTelnetHandler.java @@ -23,6 +23,7 @@ import org.apache.dubbo.remoting.Channel; import org.apache.dubbo.remoting.telnet.TelnetHandler; import org.apache.dubbo.remoting.telnet.support.Help; import org.apache.dubbo.remoting.telnet.support.TelnetUtils; +import org.apache.dubbo.rpc.model.FrameworkModel; import java.util.ArrayList; import java.util.List; @@ -36,12 +37,16 @@ import java.util.WeakHashMap; @Help(parameter = "[command]", summary = "Show help.", detail = "Show help.") public class HelpTelnetHandler implements TelnetHandler { - private final ExtensionLoader extensionLoader = ExtensionLoader.getExtensionLoader(TelnetHandler.class); + private final ExtensionLoader extensionLoader; private static final String MAIN_HELP = "mainHelp"; private static Map processedTable = new WeakHashMap<>(); + public HelpTelnetHandler(FrameworkModel frameworkModel) { + extensionLoader = frameworkModel.getExtensionLoader(TelnetHandler.class); + } + @Override public String telnet(Channel channel, String message) { if (message.length() > 0) { diff --git a/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/ChanelHandlerTest.java b/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/ChanelHandlerTest.java index e9ce85825c..f17bced5ca 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/ChanelHandlerTest.java +++ b/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/ChanelHandlerTest.java @@ -22,6 +22,7 @@ import org.apache.dubbo.common.serialize.support.DefaultSerializationSelector; import org.apache.dubbo.remoting.exchange.ExchangeClient; import org.apache.dubbo.remoting.exchange.Exchangers; import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerAdapter; +import org.apache.dubbo.rpc.model.FrameworkModel; import org.junit.jupiter.api.Test; @@ -100,6 +101,7 @@ class ChanelHandlerTest { * @param url */ public PeformanceTestHandler(String url) { + super(FrameworkModel.defaultModel()); this.url = url; } diff --git a/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/PerformanceClientTest.java b/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/PerformanceClientTest.java index 152d6c5dd9..a81b835ec8 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/PerformanceClientTest.java +++ b/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/PerformanceClientTest.java @@ -22,6 +22,7 @@ import org.apache.dubbo.common.serialize.support.DefaultSerializationSelector; import org.apache.dubbo.remoting.exchange.ExchangeClient; import org.apache.dubbo.remoting.exchange.Exchangers; import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerAdapter; +import org.apache.dubbo.rpc.model.FrameworkModel; import org.junit.jupiter.api.Test; @@ -218,6 +219,9 @@ class PerformanceClientTest { } static class PeformanceTestHandler extends ExchangeHandlerAdapter { + public PeformanceTestHandler() { + super(FrameworkModel.defaultModel()); + } @Override public void connected(Channel channel) throws RemotingException { diff --git a/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/PerformanceServerTest.java b/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/PerformanceServerTest.java index 5298f449e1..90af441c7a 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/PerformanceServerTest.java +++ b/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/PerformanceServerTest.java @@ -24,6 +24,7 @@ import org.apache.dubbo.remoting.exchange.ExchangeServer; import org.apache.dubbo.remoting.exchange.Exchangers; import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerAdapter; import org.apache.dubbo.remoting.transport.dispatcher.execution.ExecutionDispatcher; +import org.apache.dubbo.rpc.model.FrameworkModel; import org.junit.jupiter.api.Test; @@ -82,7 +83,7 @@ class PerformanceServerTest { ExchangeServer server = Exchangers.bind("exchange://0.0.0.0:" + port + "?transporter=" + transporter + "&serialization=" + serialization + "&threadpool=" + threadpool - + "&threads=" + threads + "&iothreads=" + iothreads + "&buffer=" + buffer + "&channel.handler=" + channelHandler, new ExchangeHandlerAdapter() { + + "&threads=" + threads + "&iothreads=" + iothreads + "&buffer=" + buffer + "&channel.handler=" + channelHandler, new ExchangeHandlerAdapter(FrameworkModel.defaultModel()) { public String telnet(Channel channel, String message) throws RemotingException { return "echo: " + message + "\r\ntelnet> "; } @@ -106,7 +107,7 @@ class PerformanceServerTest { private static ExchangeServer statTelnetServer(int port) throws Exception { // Start server - ExchangeServer telnetserver = Exchangers.bind("exchange://0.0.0.0:" + port, new ExchangeHandlerAdapter() { + ExchangeServer telnetserver = Exchangers.bind("exchange://0.0.0.0:" + port, new ExchangeHandlerAdapter(FrameworkModel.defaultModel()) { public String telnet(Channel channel, String message) throws RemotingException { if (message.equals("help")) { return "support cmd: \r\n\tstart \r\n\tstop \r\n\tshutdown \r\n\trestart times [alive] [sleep] \r\ntelnet>"; diff --git a/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/telnet/support/HelpTelnetHandlerTest.java b/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/telnet/support/HelpTelnetHandlerTest.java index 45193504eb..a5b77dd8ef 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/telnet/support/HelpTelnetHandlerTest.java +++ b/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/telnet/support/HelpTelnetHandlerTest.java @@ -19,6 +19,7 @@ package org.apache.dubbo.remoting.telnet.support; import org.apache.dubbo.common.URL; import org.apache.dubbo.remoting.Channel; import org.apache.dubbo.remoting.telnet.support.command.HelpTelnetHandler; +import org.apache.dubbo.rpc.model.FrameworkModel; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -30,7 +31,7 @@ class HelpTelnetHandlerTest { Channel channel = Mockito.mock(Channel.class); Mockito.when(channel.getUrl()).thenReturn(URL.valueOf("dubbo://127.0.0.1:12345")); - HelpTelnetHandler helpTelnetHandler = new HelpTelnetHandler(); + HelpTelnetHandler helpTelnetHandler = new HelpTelnetHandler(FrameworkModel.defaultModel()); // default output String prompt = "Please input \"help [command]\" show detail.\r\n"; Assertions.assertTrue(helpTelnetHandler.telnet(channel, "").contains(prompt)); diff --git a/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/telnet/support/TelnetHandlerAdapterTest.java b/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/telnet/support/TelnetHandlerAdapterTest.java index b530827980..40afb734be 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/telnet/support/TelnetHandlerAdapterTest.java +++ b/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/telnet/support/TelnetHandlerAdapterTest.java @@ -20,6 +20,7 @@ import org.apache.dubbo.common.URL; import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.remoting.Channel; import org.apache.dubbo.remoting.RemotingException; +import org.apache.dubbo.rpc.model.FrameworkModel; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -38,7 +39,7 @@ class TelnetHandlerAdapterTest { param.put("telnet", "status"); URL url = new URL("p1", "127.0.0.1", 12345, "path1", param); Mockito.when(channel.getUrl()).thenReturn(url); - TelnetHandlerAdapter telnetHandlerAdapter = new TelnetHandlerAdapter(); + TelnetHandlerAdapter telnetHandlerAdapter = new TelnetHandlerAdapter(FrameworkModel.defaultModel()); String message = "--no-prompt status "; String expectedResult = "OK\r\n"; diff --git a/dubbo-remoting/dubbo-remoting-netty/src/test/java/org/apache/dubbo/remoting/transport/netty/ClientReconnectTest.java b/dubbo-remoting/dubbo-remoting-netty/src/test/java/org/apache/dubbo/remoting/transport/netty/ClientReconnectTest.java index 81717a0e1e..a90828dbad 100644 --- a/dubbo-remoting/dubbo-remoting-netty/src/test/java/org/apache/dubbo/remoting/transport/netty/ClientReconnectTest.java +++ b/dubbo-remoting/dubbo-remoting-netty/src/test/java/org/apache/dubbo/remoting/transport/netty/ClientReconnectTest.java @@ -25,6 +25,7 @@ import org.apache.dubbo.remoting.RemotingException; import org.apache.dubbo.remoting.RemotingServer; import org.apache.dubbo.remoting.exchange.Exchangers; import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerAdapter; +import org.apache.dubbo.rpc.model.FrameworkModel; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -81,6 +82,10 @@ class ClientReconnectTest { } static class HandlerAdapter extends ExchangeHandlerAdapter { + public HandlerAdapter() { + super(FrameworkModel.defaultModel()); + } + @Override public void connected(Channel channel) throws RemotingException { } diff --git a/dubbo-remoting/dubbo-remoting-netty4/src/test/java/org/apache/dubbo/remoting/transport/netty4/ClientReconnectTest.java b/dubbo-remoting/dubbo-remoting-netty4/src/test/java/org/apache/dubbo/remoting/transport/netty4/ClientReconnectTest.java index 6bccd39fb1..03918da077 100644 --- a/dubbo-remoting/dubbo-remoting-netty4/src/test/java/org/apache/dubbo/remoting/transport/netty4/ClientReconnectTest.java +++ b/dubbo-remoting/dubbo-remoting-netty4/src/test/java/org/apache/dubbo/remoting/transport/netty4/ClientReconnectTest.java @@ -25,6 +25,7 @@ import org.apache.dubbo.remoting.RemotingException; import org.apache.dubbo.remoting.RemotingServer; import org.apache.dubbo.remoting.exchange.Exchangers; import org.apache.dubbo.remoting.exchange.support.ExchangeHandlerAdapter; +import org.apache.dubbo.rpc.model.FrameworkModel; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -83,6 +84,10 @@ class ClientReconnectTest { } static class HandlerAdapter extends ExchangeHandlerAdapter { + public HandlerAdapter() { + super(FrameworkModel.defaultModel()); + } + @Override public void connected(Channel channel) throws RemotingException { } diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocol.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocol.java index 7952143f62..eb17a4f1e4 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocol.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocol.java @@ -19,7 +19,6 @@ package org.apache.dubbo.rpc.protocol.dubbo; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.URLBuilder; import org.apache.dubbo.common.config.ConfigurationUtils; -import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.common.url.component.ServiceConfigURL; import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.common.utils.NetUtils; @@ -44,6 +43,7 @@ import org.apache.dubbo.rpc.Result; import org.apache.dubbo.rpc.RpcContext; import org.apache.dubbo.rpc.RpcException; import org.apache.dubbo.rpc.RpcInvocation; +import org.apache.dubbo.rpc.model.FrameworkModel; import org.apache.dubbo.rpc.model.ScopeModel; import org.apache.dubbo.rpc.protocol.AbstractProtocol; @@ -111,132 +111,133 @@ public class DubboProtocol extends AbstractProtocol { private final AtomicBoolean destroyed = new AtomicBoolean(); - private final ExchangeHandler requestHandler = new ExchangeHandlerAdapter() { + private final ExchangeHandler requestHandler; - @Override - public CompletableFuture reply(ExchangeChannel channel, Object message) throws RemotingException { + public DubboProtocol(FrameworkModel frameworkModel) { + requestHandler = new ExchangeHandlerAdapter(frameworkModel) { - if (!(message instanceof Invocation)) { - throw new RemotingException(channel, "Unsupported request: " - + (message == null ? null : (message.getClass().getName() + ": " + message)) - + ", channel: consumer: " + channel.getRemoteAddress() + " --> provider: " + channel.getLocalAddress()); - } + @Override + public CompletableFuture reply(ExchangeChannel channel, Object message) throws RemotingException { - Invocation inv = (Invocation) message; - Invoker invoker = getInvoker(channel, inv); - inv.setServiceModel(invoker.getUrl().getServiceModel()); - // switch TCCL - if (invoker.getUrl().getServiceModel() != null) { - Thread.currentThread().setContextClassLoader(invoker.getUrl().getServiceModel().getClassLoader()); - } - // need to consider backward-compatibility if it's a callback - if (Boolean.TRUE.toString().equals(inv.getObjectAttachmentWithoutConvert(IS_CALLBACK_SERVICE_INVOKE))) { - String methodsStr = invoker.getUrl().getParameters().get("methods"); - boolean hasMethod = false; - if (methodsStr == null || !methodsStr.contains(",")) { - hasMethod = inv.getMethodName().equals(methodsStr); - } else { - String[] methods = methodsStr.split(","); - for (String method : methods) { - if (inv.getMethodName().equals(method)) { - hasMethod = true; - break; + if (!(message instanceof Invocation)) { + throw new RemotingException(channel, "Unsupported request: " + + (message == null ? null : (message.getClass().getName() + ": " + message)) + + ", channel: consumer: " + channel.getRemoteAddress() + " --> provider: " + channel.getLocalAddress()); + } + + Invocation inv = (Invocation) message; + Invoker invoker = getInvoker(channel, inv); + inv.setServiceModel(invoker.getUrl().getServiceModel()); + // switch TCCL + if (invoker.getUrl().getServiceModel() != null) { + Thread.currentThread().setContextClassLoader(invoker.getUrl().getServiceModel().getClassLoader()); + } + // need to consider backward-compatibility if it's a callback + if (Boolean.TRUE.toString().equals(inv.getObjectAttachmentWithoutConvert(IS_CALLBACK_SERVICE_INVOKE))) { + String methodsStr = invoker.getUrl().getParameters().get("methods"); + boolean hasMethod = false; + if (methodsStr == null || !methodsStr.contains(",")) { + hasMethod = inv.getMethodName().equals(methodsStr); + } else { + String[] methods = methodsStr.split(","); + for (String method : methods) { + if (inv.getMethodName().equals(method)) { + hasMethod = true; + break; + } } } + if (!hasMethod) { + logger.warn(PROTOCOL_FAILED_REFER_INVOKER, "", "", new IllegalStateException("The methodName " + inv.getMethodName() + + " not found in callback service interface ,invoke will be ignored." + + " please update the api interface. url is:" + + invoker.getUrl()) + " ,invocation is :" + inv); + return null; + } } - if (!hasMethod) { - logger.warn(PROTOCOL_FAILED_REFER_INVOKER, "", "", new IllegalStateException("The methodName " + inv.getMethodName() - + " not found in callback service interface ,invoke will be ignored." - + " please update the api interface. url is:" - + invoker.getUrl()) + " ,invocation is :" + inv); + RpcContext.getServiceContext().setRemoteAddress(channel.getRemoteAddress()); + Result result = invoker.invoke(inv); + return result.thenApply(Function.identity()); + } + + @Override + public void received(Channel channel, Object message) throws RemotingException { + if (message instanceof Invocation) { + reply((ExchangeChannel) channel, message); + + } else { + super.received(channel, message); + } + } + + @Override + public void connected(Channel channel) throws RemotingException { + invoke(channel, ON_CONNECT_KEY); + } + + @Override + public void disconnected(Channel channel) throws RemotingException { + if (logger.isDebugEnabled()) { + logger.debug("disconnected from " + channel.getRemoteAddress() + ",url:" + channel.getUrl()); + } + invoke(channel, ON_DISCONNECT_KEY); + } + + private void invoke(Channel channel, String methodKey) { + Invocation invocation = createInvocation(channel, channel.getUrl(), methodKey); + if (invocation != null) { + try { + if (Boolean.TRUE.toString().equals(invocation.getAttachment(STUB_EVENT_KEY))) { + tryToGetStubService(channel, invocation); + } + received(channel, invocation); + } catch (Throwable t) { + logger.warn(PROTOCOL_FAILED_REFER_INVOKER, "", "", "Failed to invoke event method " + invocation.getMethodName() + "(), cause: " + t.getMessage(), t); + } + } + } + + private void tryToGetStubService(Channel channel, Invocation invocation) throws RemotingException { + try { + Invoker invoker = getInvoker(channel, invocation); + } catch (RemotingException e) { + String serviceKey = serviceKey( + 0, + (String) invocation.getObjectAttachmentWithoutConvert(PATH_KEY), + (String) invocation.getObjectAttachmentWithoutConvert(VERSION_KEY), + (String) invocation.getObjectAttachmentWithoutConvert(GROUP_KEY) + ); + throw new RemotingException(channel, "The stub service[" + serviceKey + "] is not found, it may not be exported yet"); + } + } + + /** + * FIXME channel.getUrl() always binds to a fixed service, and this service is random. + * we can choose to use a common service to carry onConnect event if there's no easy way to get the specific + * service this connection is binding to. + * @param channel + * @param url + * @param methodKey + * @return + */ + private Invocation createInvocation(Channel channel, URL url, String methodKey) { + String method = url.getParameter(methodKey); + if (method == null || method.length() == 0) { return null; } - } - RpcContext.getServiceContext().setRemoteAddress(channel.getRemoteAddress()); - Result result = invoker.invoke(inv); - return result.thenApply(Function.identity()); - } - @Override - public void received(Channel channel, Object message) throws RemotingException { - if (message instanceof Invocation) { - reply((ExchangeChannel) channel, message); - - } else { - super.received(channel, message); - } - } - - @Override - public void connected(Channel channel) throws RemotingException { - invoke(channel, ON_CONNECT_KEY); - } - - @Override - public void disconnected(Channel channel) throws RemotingException { - if (logger.isDebugEnabled()) { - logger.debug("disconnected from " + channel.getRemoteAddress() + ",url:" + channel.getUrl()); - } - invoke(channel, ON_DISCONNECT_KEY); - } - - private void invoke(Channel channel, String methodKey) { - Invocation invocation = createInvocation(channel, channel.getUrl(), methodKey); - if (invocation != null) { - try { - if (Boolean.TRUE.toString().equals(invocation.getAttachment(STUB_EVENT_KEY))) { - tryToGetStubService(channel, invocation); - } - received(channel, invocation); - } catch (Throwable t) { - logger.warn(PROTOCOL_FAILED_REFER_INVOKER, "", "", "Failed to invoke event method " + invocation.getMethodName() + "(), cause: " + t.getMessage(), t); + RpcInvocation invocation = new RpcInvocation(url.getServiceModel(), method, url.getParameter(INTERFACE_KEY), "", new Class[0], new Object[0]); + invocation.setAttachment(PATH_KEY, url.getPath()); + invocation.setAttachment(GROUP_KEY, url.getGroup()); + invocation.setAttachment(INTERFACE_KEY, url.getParameter(INTERFACE_KEY)); + invocation.setAttachment(VERSION_KEY, url.getVersion()); + if (url.getParameter(STUB_EVENT_KEY, false)) { + invocation.setAttachment(STUB_EVENT_KEY, Boolean.TRUE.toString()); } + + return invocation; } - } - - private void tryToGetStubService(Channel channel, Invocation invocation) throws RemotingException { - try { - Invoker invoker = getInvoker(channel, invocation); - } catch (RemotingException e) { - String serviceKey = serviceKey( - 0, - (String) invocation.getObjectAttachmentWithoutConvert(PATH_KEY), - (String) invocation.getObjectAttachmentWithoutConvert(VERSION_KEY), - (String) invocation.getObjectAttachmentWithoutConvert(GROUP_KEY) - ); - throw new RemotingException(channel, "The stub service[" + serviceKey + "] is not found, it may not be exported yet"); - } - } - - /** - * FIXME channel.getUrl() always binds to a fixed service, and this service is random. - * we can choose to use a common service to carry onConnect event if there's no easy way to get the specific - * service this connection is binding to. - * @param channel - * @param url - * @param methodKey - * @return - */ - private Invocation createInvocation(Channel channel, URL url, String methodKey) { - String method = url.getParameter(methodKey); - if (method == null || method.length() == 0) { - return null; - } - - RpcInvocation invocation = new RpcInvocation(url.getServiceModel(), method, url.getParameter(INTERFACE_KEY), "", new Class[0], new Object[0]); - invocation.setAttachment(PATH_KEY, url.getPath()); - invocation.setAttachment(GROUP_KEY, url.getGroup()); - invocation.setAttachment(INTERFACE_KEY, url.getParameter(INTERFACE_KEY)); - invocation.setAttachment(VERSION_KEY, url.getVersion()); - if (url.getParameter(STUB_EVENT_KEY, false)) { - invocation.setAttachment(STUB_EVENT_KEY, Boolean.TRUE.toString()); - } - - return invocation; - } - }; - - public DubboProtocol() { + }; } /** @@ -244,7 +245,7 @@ public class DubboProtocol extends AbstractProtocol { */ @Deprecated public static DubboProtocol getDubboProtocol() { - return (DubboProtocol) ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(DubboProtocol.NAME, false); + return (DubboProtocol) FrameworkModel.defaultModel().getExtensionLoader(Protocol.class).getExtension(DubboProtocol.NAME, false); } public static DubboProtocol getDubboProtocol(ScopeModel scopeModel) { diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/status/ThreadPoolStatusChecker.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/status/ThreadPoolStatusChecker.java index d6c1a12fe2..cccf18f733 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/status/ThreadPoolStatusChecker.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/status/ThreadPoolStatusChecker.java @@ -18,10 +18,10 @@ package org.apache.dubbo.rpc.protocol.dubbo.status; import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.common.extension.Activate; -import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.common.status.Status; import org.apache.dubbo.common.status.StatusChecker; import org.apache.dubbo.common.store.DataStore; +import org.apache.dubbo.rpc.model.ApplicationModel; import java.util.Map; import java.util.concurrent.ExecutorService; @@ -33,9 +33,15 @@ import java.util.concurrent.ThreadPoolExecutor; @Activate public class ThreadPoolStatusChecker implements StatusChecker { + private final ApplicationModel applicationModel; + + public ThreadPoolStatusChecker(ApplicationModel applicationModel) { + this.applicationModel = applicationModel; + } + @Override public Status check() { - DataStore dataStore = ExtensionLoader.getExtensionLoader(DataStore.class).getDefaultExtension(); + DataStore dataStore = applicationModel.getExtensionLoader(DataStore.class).getDefaultExtension(); Map executors = dataStore.get(CommonConstants.EXECUTOR_SERVICE_COMPONENT_KEY); StringBuilder msg = new StringBuilder(); diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvokerAvailableTest.java b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvokerAvailableTest.java index 3f01cbc2fb..96ca315069 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvokerAvailableTest.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvokerAvailableTest.java @@ -25,6 +25,7 @@ import org.apache.dubbo.remoting.exchange.ExchangeClient; import org.apache.dubbo.rpc.Exporter; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.ProxyFactory; +import org.apache.dubbo.rpc.model.FrameworkModel; import org.apache.dubbo.rpc.protocol.dubbo.support.ProtocolUtils; import org.junit.jupiter.api.AfterAll; @@ -51,7 +52,7 @@ class DubboInvokerAvailableTest { @BeforeEach public void setUp() throws Exception { - protocol = new DubboProtocol(); + protocol = new DubboProtocol(FrameworkModel.defaultModel()); } @AfterAll diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/decode/DubboTelnetDecodeTest.java b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/decode/DubboTelnetDecodeTest.java index f6f08ab3ec..cecc45dad9 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/decode/DubboTelnetDecodeTest.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/decode/DubboTelnetDecodeTest.java @@ -106,7 +106,7 @@ class DubboTelnetDecodeTest { MockHandler mockHandler = new MockHandler(null, new MultiMessageHandler( new DecodeHandler( - new HeaderExchangeHandler(new ExchangeHandlerAdapter() { + new HeaderExchangeHandler(new ExchangeHandlerAdapter(FrameworkModel.defaultModel()) { @Override public CompletableFuture reply(ExchangeChannel channel, Object msg) { if (checkDubboDecoded(msg)) { @@ -157,7 +157,7 @@ class DubboTelnetDecodeTest { }, new MultiMessageHandler( new DecodeHandler( - new HeaderExchangeHandler(new ExchangeHandlerAdapter() { + new HeaderExchangeHandler(new ExchangeHandlerAdapter(FrameworkModel.defaultModel()) { @Override public CompletableFuture reply(ExchangeChannel channel, Object msg) { return getDefaultFuture(); @@ -220,7 +220,7 @@ class DubboTelnetDecodeTest { }, new MultiMessageHandler( new DecodeHandler( - new HeaderExchangeHandler(new ExchangeHandlerAdapter() { + new HeaderExchangeHandler(new ExchangeHandlerAdapter(FrameworkModel.defaultModel()) { @Override public CompletableFuture reply(ExchangeChannel channel, Object msg) { if (checkDubboDecoded(msg)) { @@ -292,7 +292,7 @@ class DubboTelnetDecodeTest { }, new MultiMessageHandler( new DecodeHandler( - new HeaderExchangeHandler(new ExchangeHandlerAdapter() { + new HeaderExchangeHandler(new ExchangeHandlerAdapter(FrameworkModel.defaultModel()) { @Override public CompletableFuture reply(ExchangeChannel channel, Object msg) { return getDefaultFuture(); @@ -359,7 +359,7 @@ class DubboTelnetDecodeTest { MockHandler mockHandler = new MockHandler(null, new MultiMessageHandler( new DecodeHandler( - new HeaderExchangeHandler(new ExchangeHandlerAdapter() { + new HeaderExchangeHandler(new ExchangeHandlerAdapter(FrameworkModel.defaultModel()) { @Override public CompletableFuture reply(ExchangeChannel channel, Object msg) { if (checkDubboDecoded(msg)) { @@ -430,7 +430,7 @@ class DubboTelnetDecodeTest { }, new MultiMessageHandler( new DecodeHandler( - new HeaderExchangeHandler(new ExchangeHandlerAdapter() { + new HeaderExchangeHandler(new ExchangeHandlerAdapter(FrameworkModel.defaultModel()) { @Override public CompletableFuture reply(ExchangeChannel channel, Object msg) { if (checkDubboDecoded(msg)) { diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/status/ThreadPoolStatusCheckerTest.java b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/status/ThreadPoolStatusCheckerTest.java index 246c3a9c48..6b26f368d3 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/status/ThreadPoolStatusCheckerTest.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/status/ThreadPoolStatusCheckerTest.java @@ -20,6 +20,7 @@ import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.common.status.Status; import org.apache.dubbo.common.store.DataStore; +import org.apache.dubbo.rpc.model.ApplicationModel; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -40,7 +41,7 @@ class ThreadPoolStatusCheckerTest { dataStore.put(CommonConstants.EXECUTOR_SERVICE_COMPONENT_KEY, "8888", executorService1); dataStore.put(CommonConstants.EXECUTOR_SERVICE_COMPONENT_KEY, "8889", executorService2); - ThreadPoolStatusChecker threadPoolStatusChecker = new ThreadPoolStatusChecker(); + ThreadPoolStatusChecker threadPoolStatusChecker = new ThreadPoolStatusChecker(ApplicationModel.defaultModel()); Status status = threadPoolStatusChecker.check(); Assertions.assertEquals(status.getLevel(), Status.Level.WARN); Assertions.assertEquals(status.getMessage(), diff --git a/dubbo-rpc/dubbo-rpc-grpc/src/main/java/org/apache/dubbo/rpc/protocol/grpc/GrpcOptionsUtils.java b/dubbo-rpc/dubbo-rpc-grpc/src/main/java/org/apache/dubbo/rpc/protocol/grpc/GrpcOptionsUtils.java index a0685b2da7..ea8b34c964 100644 --- a/dubbo-rpc/dubbo-rpc-grpc/src/main/java/org/apache/dubbo/rpc/protocol/grpc/GrpcOptionsUtils.java +++ b/dubbo-rpc/dubbo-rpc-grpc/src/main/java/org/apache/dubbo/rpc/protocol/grpc/GrpcOptionsUtils.java @@ -17,13 +17,13 @@ package org.apache.dubbo.rpc.protocol.grpc; import org.apache.dubbo.common.URL; -import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.threadpool.ThreadPool; import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.config.SslConfig; import org.apache.dubbo.config.context.ConfigManager; +import org.apache.dubbo.rpc.model.FrameworkModel; import org.apache.dubbo.rpc.protocol.grpc.interceptors.ClientInterceptor; import org.apache.dubbo.rpc.protocol.grpc.interceptors.GrpcConfigurator; import org.apache.dubbo.rpc.protocol.grpc.interceptors.ServerInterceptor; @@ -236,7 +236,7 @@ public class GrpcOptionsUtils { private static Optional getConfigurator() { // Give users the chance to customize ServerBuilder - Set configurators = ExtensionLoader.getExtensionLoader(GrpcConfigurator.class) + Set configurators = FrameworkModel.defaultModel().getExtensionLoader(GrpcConfigurator.class) .getSupportedExtensionInstances(); if (CollectionUtils.isNotEmpty(configurators)) { return Optional.of(configurators.iterator().next()); diff --git a/dubbo-spring-boot/dubbo-spring-boot-compatible/actuator/src/main/java/org/apache/dubbo/spring/boot/actuate/health/DubboHealthIndicator.java b/dubbo-spring-boot/dubbo-spring-boot-compatible/actuator/src/main/java/org/apache/dubbo/spring/boot/actuate/health/DubboHealthIndicator.java index 58f4c5a424..135ef96f8f 100644 --- a/dubbo-spring-boot/dubbo-spring-boot-compatible/actuator/src/main/java/org/apache/dubbo/spring/boot/actuate/health/DubboHealthIndicator.java +++ b/dubbo-spring-boot/dubbo-spring-boot-compatible/actuator/src/main/java/org/apache/dubbo/spring/boot/actuate/health/DubboHealthIndicator.java @@ -35,8 +35,6 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; -import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader; - /** * Dubbo {@link HealthIndicator} * @@ -63,7 +61,7 @@ public class DubboHealthIndicator extends AbstractHealthIndicator { @Override protected void doHealthCheck(Health.Builder builder) throws Exception { - ExtensionLoader extensionLoader = getExtensionLoader(StatusChecker.class); + ExtensionLoader extensionLoader = applicationModel.getExtensionLoader(StatusChecker.class); Map statusCheckerNamesMap = resolveStatusCheckerNamesMap(); diff --git a/dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/context/MockSpringInitCustomizer.java b/dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/context/MockSpringInitCustomizer.java index c4a055f25d..e2ec79e800 100644 --- a/dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/context/MockSpringInitCustomizer.java +++ b/dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/context/MockSpringInitCustomizer.java @@ -16,9 +16,9 @@ */ package org.apache.dubbo.test.spring.context; -import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.config.spring.context.DubboSpringInitContext; import org.apache.dubbo.config.spring.context.DubboSpringInitCustomizer; +import org.apache.dubbo.rpc.model.FrameworkModel; import org.junit.jupiter.api.Assertions; import org.springframework.beans.BeansException; @@ -61,7 +61,7 @@ public class MockSpringInitCustomizer implements DubboSpringInitCustomizer { } public static void checkCustomizer(ConfigurableApplicationContext applicationContext) { - Set customizers = ExtensionLoader + Set customizers = FrameworkModel.defaultModel() .getExtensionLoader(DubboSpringInitCustomizer.class) .getSupportedExtensionInstances();