You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2018/08/27 04:36:39 UTC

[incubator-dubbo] 01/02: Merge branch 'master' into dev-metadata

This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch dev-metadata
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git

commit 3cd4603d0a7b8db8cfeb516e59d7b8cf3d091c25
Merge: 2b80c3e f720ccb
Author: ken.lj <ke...@gmail.com>
AuthorDate: Mon Aug 27 12:32:55 2018 +0800

    Merge branch 'master' into dev-metadata
    
    # Conflicts:
    #	dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/AbstractDirectory.java
    #	dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.RouterFactory
    #	dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java

 .travis.yml                                        |  14 +-
 LICENSE                                            |   6 +-
 README.md                                          |   8 +-
 {all => dubbo-all}/pom.xml                         |  29 -
 {bom => dubbo-bom}/pom.xml                         |  13 +-
 .../rpc/cluster/directory/AbstractDirectory.java   |  19 +-
 .../loadbalance/ConsistentHashLoadBalance.java     |   2 +-
 .../dubbo/rpc/cluster/router/tag/TagRouter.java    | 109 +++
 .../rpc/cluster/router/tag/TagRouterFactory.java   |  16 +-
 .../cluster/support/AbstractClusterInvoker.java    |  43 +-
 .../cluster/support/FailoverClusterInvoker.java    |   8 +-
 .../support/wrapper/MockClusterInvoker.java        |   2 +-
 .../org.apache.dubbo.rpc.cluster.RouterFactory     |   1 +
 .../rpc/cluster/router/tag/TagRouterTest.java      | 169 +++++
 .../support/AbstractClusterInvokerTest.java        |  17 +-
 dubbo-common/pom.xml                               |  10 +
 .../alibaba/dubbo/common/extension/Activate.java   |  88 +--
 .../java/org/apache/dubbo/common/Constants.java    |   4 +
 .../src/main/java/org/apache/dubbo/common/URL.java |  13 +-
 .../main/java/org/apache/dubbo/common/Version.java |   6 +-
 .../dubbo/common/concurrent/ListenableFuture.java  | 133 ----
 .../common/concurrent/ListenableFutureTask.java    |  91 ---
 .../apache/dubbo/common/extension/Activate.java    |   4 +
 .../dubbo/common/extension/ExtensionLoader.java    |  31 +-
 .../extension/support/ActivateComparator.java      |  60 +-
 .../apache/dubbo/common/logger/LoggerFactory.java  |  11 +-
 .../dubbo/common/logger/log4j2/Log4j2Logger.java   | 128 ++++
 .../common/logger/log4j2/Log4j2LoggerAdapter.java  | 107 +++
 .../dubbo/common/timer/HashedWheelTimer.java       | 805 +++++++++++++++++++++
 .../org/apache/dubbo/common/timer/Timeout.java     |  55 ++
 .../java/org/apache/dubbo/common/timer/Timer.java  |  48 ++
 .../org/apache/dubbo/common/timer/TimerTask.java   |  34 +
 .../org/apache/dubbo/common/utils/ClassHelper.java |  16 +-
 .../org/apache/dubbo/common/utils/NetUtils.java    |  89 ++-
 .../org/apache/dubbo/common/utils/StringUtils.java |   2 +-
 .../org/apache/dubbo/common/utils/UrlUtils.java    |  11 +-
 .../org.apache.dubbo.common.logger.LoggerAdapter   |   3 +-
 .../test/java/org/apache/dubbo/common/URLTest.java |  28 +
 ...askTest.java => CompletableFutureTaskTest.java} |  83 +--
 .../common/extension/ExtensionLoaderTest.java      |  10 +
 .../activate/impl/OldActivateExt1Impl2.java        |  14 +-
 .../activate/impl/OldActivateExt1Impl3.java        |  14 +-
 .../extension/support/ActivateComparatorTest.java  |   9 +-
 .../dubbo/common/extension/support/OldFilter0.java |  41 +-
 .../dubbo/common/extension/support/OldFilter5.java |  45 +-
 .../dubbo/common/logger/LoggerAdapterTest.java     |   5 +-
 .../dubbo/common/logger/slf4j/Slf4jLoggerTest.java |   1 -
 .../dubbo/common/timer/HashedWheelTimerTest.java   |  72 ++
 .../dubbo/common/utils/DubboAppenderTest.java      |   2 -
 .../apache/dubbo/common/utils/NetUtilsTest.java    |  29 +
 .../apache/dubbo/common/utils/UrlUtilsTest.java    |   6 +
 ...he.dubbo.common.extension.activate.ActivateExt1 |   4 +-
 ...g.apache.dubbo.common.extension.support.Filter0 |   3 +-
 dubbo-compatible/pom.xml                           |   6 +
 .../alibaba/dubbo/config/ApplicationConfig.java}   |  51 +-
 .../com/alibaba/dubbo/config/ArgumentConfig.java}  |  43 +-
 .../com/alibaba/dubbo/config/ConsumerConfig.java}  |  43 +-
 .../com/alibaba/dubbo/config/MethodConfig.java}    |  44 +-
 .../com/alibaba/dubbo/config/ModuleConfig.java}    |  50 +-
 .../com/alibaba/dubbo/config/MonitorConfig.java}   |  49 +-
 .../com/alibaba/dubbo/config/ProtocolConfig.java}  |  18 +-
 .../com/alibaba/dubbo/config/ReferenceConfig.java} |  16 +-
 .../com/alibaba/dubbo/config/RegistryConfig.java}  |  19 +-
 .../com/alibaba/dubbo/config/ServiceConfig.java}   |  16 +-
 .../alibaba/dubbo/config/annotation/Reference.java |   2 +-
 .../main/java/com/alibaba/dubbo/rpc/Invoker.java   |   8 +-
 .../dubbo/{compatible => }/cache/CacheTest.java    |   2 +-
 .../dubbo/{compatible => }/cache/MyCache.java      |   2 +-
 .../{compatible => }/cache/MyCacheFactory.java     |   2 +-
 .../common/extension/ExtensionTest.java            |   4 +-
 .../common/extension/MyExtensionFactory.java       |   2 +-
 .../apache/dubbo/config/ApplicationConfigTest.java | 180 +++++
 .../apache/dubbo/config/ArgumentConfigTest.java    |  65 ++
 .../java/org/apache/dubbo/config/ConfigTest.java   |  56 ++
 .../apache/dubbo/config/ConsumerConfigTest.java    |  55 ++
 .../org/apache/dubbo/config/MethodConfigTest.java  | 184 +++++
 .../org/apache/dubbo/config/ModuleConfigTest.java  | 113 +++
 .../apache/dubbo/config/ProtocolConfigTest.java    | 157 ++++
 .../apache/dubbo/config/ProviderConfigTest.java    | 187 +++++
 .../apache/dubbo/config/ReferenceConfigTest.java   |  16 +-
 .../apache/dubbo/config/RegistryConfigTest.java    | 175 +++++
 .../{compatible => }/echo/EchoServiceTest.java     |   7 +-
 .../dubbo/{compatible => }/filter/FilterTest.java  |   5 +-
 .../dubbo/{compatible => }/filter/MyFilter.java    |   2 +-
 .../dubbo/{compatible => }/filter/MyInvoker.java   |   4 +-
 .../generic/GenericServiceTest.java                |   7 +-
 .../serialization/MyObjectInput.java               |   2 +-
 .../serialization/MyObjectOutput.java              |   2 +-
 .../serialization/MySerialization.java             |   2 +-
 .../serialization/SerializationTest.java           |   2 +-
 .../{compatible => }/service/CustomArgument.java   |   2 +-
 .../{compatible => }/service/DemoService.java      |   2 +-
 .../{compatible => }/service/DemoServiceImpl.java  |   2 +-
 .../{compatible => }/service/MockInvocation.java   |   2 +-
 .../dubbo/{compatible => }/service/Person.java     |   2 +-
 .../dubbo/{compatible => }/service/Type.java       |   2 +-
 ...alibaba.dubbo.common.extension.ExtensionFactory |   2 +-
 .../dubbo/config/AbstractInterfaceConfig.java      |  10 +-
 .../dubbo/config/AbstractReferenceConfig.java      |   1 -
 .../apache/dubbo/config/AbstractServiceConfig.java |  10 +
 .../org/apache/dubbo/config/ApplicationConfig.java |   3 +
 .../org/apache/dubbo/config/ReferenceConfig.java   |   2 +
 .../apache/dubbo/config/annotation/Reference.java  |   2 +-
 .../apache/dubbo/config/annotation/Service.java    |   5 +
 .../apache/dubbo/config/ReferenceConfigTest.java   |  45 ++
 .../apache/dubbo/config/spring/AnnotationBean.java |  24 +-
 .../src/main/resources/META-INF/compat/dubbo.xsd   | 359 ++++-----
 .../src/main/resources/META-INF/dubbo.xsd          | 354 ++++-----
 .../AnnotationPropertyValuesAdapterTest.java       |   4 +-
 .../src/test/resources/applicationContext.xml      |  16 +
 .../test/resources/webapps/test/WEB-INF/web.xml    |  16 +
 .../test/resources/webapps/test2/WEB-INF/web.xml   |  16 +
 .../test/resources/webapps/test3/WEB-INF/web.xml   |  16 +
 .../org/apache/dubbo/demo/consumer/Consumer.java   |  13 +-
 .../org/apache/dubbo/demo/provider/Provider.java   |  10 +-
 .../pom.xml                                        |  34 +-
 {distribution => dubbo-distribution}/pom.xml       |   0
 .../src/assembly/bin-release.xml                   |   0
 .../src/assembly/source-release.xml                |   0
 dubbo-metrics/dubbo-metrics-api/pom.xml            |  17 +-
 .../apache/dubbo/metrics/MetricManagerTest.java    |  19 +-
 .../org/apache/dubbo/metrics/MetricNameTest.java   |  19 +-
 .../monitor/support/AbstractMonitorFactory.java    |  31 +-
 .../dubbo/qos/protocol/QosProtocolWrapper.java     |  18 +-
 .../command/decoder/HttpCommandDecoderTest.java    |  16 +
 .../command/decoder/TelnetCommandDecoderTest.java  |  16 +
 .../apache/dubbo/qos/command/impl/HelpTest.java    |  16 +
 .../org/apache/dubbo/qos/command/impl/LsTest.java  |  16 +
 .../apache/dubbo/qos/command/impl/OfflineTest.java |  16 +
 .../apache/dubbo/qos/command/impl/OnlineTest.java  |  16 +
 .../apache/dubbo/qos/command/impl/QuitTest.java    |  16 +
 .../qos/command/impl/TestRegistryFactory.java      |  16 +
 .../dubbo/qos/command/util/CommandHelperTest.java  |  16 +
 .../dubbo/qos/protocol/QosProtocolWrapperTest.java |  22 +-
 .../qos/server/handler/HttpProcessHandlerTest.java |  16 +
 .../server/handler/LocalHostPermitHandlerTest.java |  16 +
 .../qos/server/handler/QosProcessHandlerTest.java  |  16 +
 .../server/handler/TelnetProcessHandlerTest.java   |  16 +
 dubbo-registry/dubbo-registry-api/pom.xml          |   8 +-
 .../registry/integration/RegistryDirectory.java    |   2 +-
 .../registry/integration/RegistryProtocol.java     |  12 +-
 .../registry/support/AbstractRegistryTest.java     | 518 +++++++++++++
 .../registry/multicast/MulticastRegistry.java      |  76 +-
 .../registry/multicast/MulticastRegistryTest.java  |  10 +-
 .../java/org/apache/dubbo/remoting/Channel.java    |   3 -
 .../dubbo/remoting/exchange/ExchangeChannel.java   |   1 -
 .../apache/dubbo/remoting/exchange/Response.java   |   5 +
 .../remoting/exchange/support/DefaultFuture.java   | 121 +++-
 .../support/header/HeaderExchangeChannel.java      |   2 +-
 .../support/header/HeaderExchangeHandler.java      |   1 +
 .../dubbo/remoting/transport/AbstractChannel.java  |   1 -
 .../exchange/support/DefaultFutureTest.java        | 124 ++++
 dubbo-remoting/dubbo-remoting-http/pom.xml         |  14 +-
 .../dubbo/remoting/http/jetty/JettyHttpServer.java |  30 +-
 .../zookeeper/curator/CuratorZookeeperClient.java  |   4 +-
 .../zookeeper/zkclient/ZkClientWrapper.java        |  61 +-
 .../zkclient/ZkclientZookeeperClient.java          |   4 +-
 .../org/apache/dubbo/rpc/filter/ContextFilter.java |   2 +-
 .../java/org/apache/dubbo/rpc/RpcContextTest.java  |  16 +
 .../dubbo/rpc/filter/ClassLoaderFilterTest.java    |  17 +
 .../apache/dubbo/rpc/proxy/AbstractProxyTest.java  |  17 +
 .../dubbo/rpc/proxy/jdk/JdkProxyFactoryTest.java   |  16 +
 .../apache/dubbo/rpc/support/LocalException.java   |  17 +
 dubbo-rpc/dubbo-rpc-dubbo/pom.xml                  |   8 +-
 .../protocol/dubbo/telnet/InvokeTelnetHandler.java |  13 +
 .../protocol/dubbo/DubboInvokerAvilableTest.java   |   1 -
 .../dubbo/rpc/protocol/dubbo/MultiThreadTest.java  |  13 +-
 .../dubbo/ReferenceCountExchangeClientTest.java    |   8 +
 .../dubbo/rpc/protocol/dubbo/RpcFilterTest.java    |  14 +-
 .../rpc/protocol/dubbo/support/DemoService.java    |   2 +
 .../protocol/dubbo/support/DemoServiceImpl.java    |   6 +-
 .../dubbo/telnet/InvokerTelnetHandlerTest.java     |  40 +
 .../rpc/protocol/hessian/HessianProtocol.java      |   4 +-
 .../hessian/HttpClientConnectionFactory.java       |  15 +-
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |   2 +-
 .../dubbo/rpc/protocol/rest/RpcContextFilter.java  |  25 +-
 .../dubbo/rpc/protocol/rest/RestProtocolTest.java  |  21 +
 .../dubbo/rpc/protocol/thrift/ThriftCodecTest.java |   5 +-
 .../support/SerializableClassRegistry.java         |  23 +-
 .../support/SerializableClassRegistryTest.java     |   8 +-
 .../dubbo/common/serialize/fst/FstFactory.java     |   5 +-
 .../common/serialize/kryo/CompatibleKryo.java      |  18 +-
 .../serialize/kryo/utils/AbstractKryoFactory.java  |  16 +-
 .../serialize/kryo/utils/ReflectionUtils.java      |   4 +
 .../serialization/AbstractSerializationTest.java   |   7 +-
 pom.xml                                            |  20 +-
 186 files changed, 5460 insertions(+), 1357 deletions(-)

diff --cc dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/AbstractDirectory.java
index 00a4fa1,52f5811..49e44f4
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/AbstractDirectory.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/AbstractDirectory.java
@@@ -85,24 -92,23 +85,27 @@@ public abstract class AbstractDirectory
          return url;
      }
  
 -    public List<Router> getRouters() {
 -        return routers;
 +    public RouterChain<T> getRouterChain() {
 +        return routerChain;
 +    }
 +
 +    public void setRouterChain(RouterChain<T> routerChain) {
 +        this.routerChain = routerChain;
      }
  
 -    protected void setRouters(List<Router> routers) {
 +    protected void addRouters(List<Router> routers) {
          // copy list
-         routers = routers == null ? new ArrayList<>() : new ArrayList<>(routers);
-         routers.forEach(this::addRouter);
-     }
- 
-     protected void addRouter(Router router) {
-         routerChain.addRouter(router);
-         // FIXME append mock invoker selector
- //        routerChain.add(new MockInvokersSelector());
+         routers = routers == null ? new ArrayList<Router>() : new ArrayList<Router>(routers);
+         // append url router
 -        String routerKey = url.getParameter(Constants.ROUTER_KEY);
 -        if (routerKey != null && routerKey.length() > 0) {
 -            RouterFactory routerFactory = ExtensionLoader.getExtensionLoader(RouterFactory.class).getExtension(routerKey);
++        String routerkey = url.getParameter(Constants.ROUTER_KEY);
++        if (routerkey != null && routerkey.length() > 0) {
++            RouterFactory routerFactory = ExtensionLoader.getExtensionLoader(RouterFactory.class).getExtension(routerkey);
+             routers.add(routerFactory.getRouter(url));
+         }
+         // append mock invoker selector
+         routers.add(new MockInvokersSelector());
+         Collections.sort(routers);
+         this.routers = routers;
      }
  
      public URL getConsumerUrl() {
diff --cc dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.RouterFactory
index f8bd699,2d4717c..178feb6
--- a/dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.RouterFactory
+++ b/dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.RouterFactory
@@@ -1,5 -1,4 +1,6 @@@
  file=org.apache.dubbo.rpc.cluster.router.file.FileRouterFactory
  script=org.apache.dubbo.rpc.cluster.router.script.ScriptRouterFactory
  condition=org.apache.dubbo.rpc.cluster.router.condition.ConditionRouterFactory
 -tag=org.apache.dubbo.rpc.cluster.router.tag.TagRouterFactory
++tag=org.apache.dubbo.rpc.cluster.router.tag.TagRouterFactory
 +configcondition=org.apache.dubbo.rpc.cluster.router.condition.config.ConfigConditionRouterFactory
 +group=org.apache.dubbo.rpc.cluster.router.group.GroupRouterFactory
diff --cc dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java
index 9369939,86d4001..ec1f3b5
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java
@@@ -71,16 -71,15 +71,19 @@@ public class ApplicationConfig extends 
      // directory for saving thread dump
      private String dumpDirectory;
  
+     // whether to enable qos or not
      private Boolean qosEnable;
  
+     // the qos port to listen
      private Integer qosPort;
  
+     // should we accept foreign ip or not?
      private Boolean qosAcceptForeignIp;
  
 +    // used for dynamic configuration
 +    private String config;
 +    private String address;
 +
      // customized parameters
      private Map<String, String> parameters;
  
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
index 8bd469f,6374456..ec4bef4
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
@@@ -148,26 -129,22 +148,26 @@@ public class RegistryProtocol implement
  
      @Override
      public <T> Exporter<T> export(final Invoker<T> originInvoker) throws RpcException {
 -        //export invoker
 -        final ExporterChangeableWrapper<T> exporter = doLocalExport(originInvoker);
 -
          URL registryUrl = getRegistryUrl(originInvoker);
 +        initDynamicConfiguration(registryUrl);
  
 -        //registry provider
 -        final Registry registry = getRegistry(originInvoker);
 -        final URL registeredProviderUrl = getRegisteredProviderUrl(originInvoker);
 +        // url to export locally
 +        URL providerUrl = getProviderUrl(originInvoker);
 +        providerUrl = overrideUrlWithConfig(providerUrl);
  
 -        //to judge to delay publish whether or not
 -        boolean register = registeredProviderUrl.getParameter("register", true);
 +        //export invoker
 +        final ExporterChangeableWrapper<T> exporter = doLocalExport(originInvoker, providerUrl);
 +
 +        // url to registry
 +        final Registry registry = getRegistry(originInvoker);
-         final URL registedProviderUrl = getRegistedProviderUrl(providerUrl);
++        final URL registeredProviderUrl = getRegistedProviderUrl(providerUrl);
  
-         ProviderConsumerRegTable.registerProvider(originInvoker, registryUrl, registedProviderUrl);
+         ProviderConsumerRegTable.registerProvider(originInvoker, registryUrl, registeredProviderUrl);
  
 +        //to judge if we need to delay publish
-         boolean register = registedProviderUrl.getParameter("register", true);
++        boolean register = registeredProviderUrl.getParameter("register", true);
          if (register) {
-             register(registryUrl, registedProviderUrl);
+             register(registryUrl, registeredProviderUrl);
              ProviderConsumerRegTable.getProviderWrapper(originInvoker).setReg(true);
          }
  
@@@ -177,42 -154,12 +177,42 @@@
          final OverrideListener overrideSubscribeListener = new OverrideListener(overrideSubscribeUrl, originInvoker);
          overrideListeners.put(overrideSubscribeUrl, overrideSubscribeListener);
          registry.subscribe(overrideSubscribeUrl, overrideSubscribeListener);
 +
 +        dynamicConfiguration.addListener(overrideSubscribeUrl.getServiceKey() + Constants.CONFIGURATORS_SUFFIX, overrideSubscribeListener);
          //Ensure that a new exporter instance is returned every time export
-         return new DestroyableExporter<T>(exporter, originInvoker, overrideSubscribeUrl, registedProviderUrl);
+         return new DestroyableExporter<T>(exporter, originInvoker, overrideSubscribeUrl, registeredProviderUrl);
      }
  
 +    private <T> URL overrideUrlWithConfig(URL providerUrl) {
 +        List<Configurator> dynamicConfigurators = new LinkedList<>();
 +        String appRawConfig = dynamicConfiguration.getConfig(providerUrl.getParameter(Constants.APPLICATION_KEY) + Constants.CONFIGURATORS_SUFFIX, "dubbo");
 +        if (!StringUtils.isEmpty(appRawConfig)) {
 +            dynamicConfigurators.addAll(RegistryDirectory.configToConfiguratiors(appRawConfig));
 +        }
 +        String rawConfig = dynamicConfiguration.getConfig(providerUrl.getServiceKey() + Constants.CONFIGURATORS_SUFFIX, "dubbo");
 +        if (!StringUtils.isEmpty(rawConfig)) {
 +            dynamicConfigurators.addAll(RegistryDirectory.configToConfiguratiors(rawConfig));
 +        }
 +        providerUrl = getConfigedInvokerUrl(dynamicConfigurators, providerUrl);
 +        return providerUrl;
 +    }
 +
 +    private URL getConfigUrl(URL registryUrl) {
 +        URL url = registryUrl.removeParameters(EXPORT_KEY, REFER_KEY).setProtocol(CONFIG_PROTOCOL);
 +        String configType = registryUrl.getParameter(Constants.CONFIG_TYPE_KEY);
 +        if (StringUtils.isEmpty(configType)) {
 +            url = url.addParameter(Constants.CONFIG_TYPE_KEY, registryUrl.getProtocol());
 +        }
 +
 +        String configAddress = registryUrl.getParameter(Constants.CONFIG_ADDRESS_KEY);
 +        if (StringUtils.isNotEmpty(configAddress)) {
 +            url = url.setAddress(configAddress);
 +        }
 +        return url;
 +    }
 +
      @SuppressWarnings("unchecked")
 -    private <T> ExporterChangeableWrapper<T> doLocalExport(final Invoker<T> originInvoker) {
 +    private <T> ExporterChangeableWrapper<T> doLocalExport(final Invoker<T> originInvoker, URL providerUrl) {
          String key = getCacheKey(originInvoker);
          ExporterChangeableWrapper<T> exporter = (ExporterChangeableWrapper<T>) bounds.get(key);
          if (exporter == null) {