This is an automated email from the ASF dual-hosted git repository. albumenj pushed a commit to branch 3.0-multi-instances in repository https://gitbox.apache.org/repos/asf/dubbo.git
commit ffaa0072699c0c49bdf86110bd6bdb4eda919a64 Merge: ccdc691 b8de0a7 Author: Albumen Kevin <[email protected]> AuthorDate: Thu Sep 2 15:46:34 2021 +0800 Merge branch 'apache-3.0' into 3.0-multi-instances # Conflicts: # dubbo-common/src/main/java/org/apache/dubbo/common/URLBuilder.java # dubbo-common/src/main/java/org/apache/dubbo/common/url/component/ServiceConfigURL.java # dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.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 .../org/apache/dubbo/rpc/cluster/RouterChain.java | 14 +- .../cluster/support/wrapper/AbstractCluster.java | 4 + .../support/wrapper/MockClusterWrapper.java | 5 +- .../apache/dubbo/rpc/cluster/RouterChainTest.java | 52 ++ .../support/wrapper/AbstractClusterTest.java | 106 ++++ .../support/wrapper/DemoClusterFilter.java} | 27 +- ...g.apache.dubbo.rpc.cluster.filter.ClusterFilter | 1 + dubbo-common/pom.xml | 14 + .../java/org/apache/dubbo/common/URLBuilder.java | 17 + .../url/component/DubboServiceAddressURL.java | 1 + .../common/url/component/ServiceConfigURL.java | 2 + .../apache/dubbo/rpc/model/MethodDescriptor.java | 166 ++++++- .../apache/dubbo/descriptor/DescriptorService.java | 65 +++ .../dubbo/descriptor/MethodDescriptorTest.java | 157 +++++- .../org/apache/dubbo/config/ReferenceConfig.java | 5 +- .../org/apache/dubbo/config/ServiceConfig.java | 12 +- .../apache/dubbo/config/ReferenceConfigTest.java | 179 ++++++- ...gistryCenterExportMetadataExporterListener.java | 32 +- ...egistryCenterExportMetadataIntegrationTest.java | 207 ++++++++ ...ultipleRegistryCenterExportMetadataService.java | 11 +- ...pleRegistryCenterExportMetadataServiceImpl.java | 14 +- ...egistryCenterExportMetadataServiceListener.java | 29 +- .../org.apache.dubbo.config.ServiceListener | 1 + .../services/org.apache.dubbo.rpc.ExporterListener | 1 + .../registrycenter/AbstractRegistryCenter.java | 4 +- .../java/org/apache/dubbo/demo/TripleService.java | 6 +- .../dubbo-demo-xml/dubbo-demo-xml-consumer/pom.xml | 4 + .../apache/dubbo/demo/consumer/Application.java | 17 + .../src/main/resources/spring/dubbo-consumer.xml | 3 + .../dubbo-demo-xml/dubbo-demo-xml-provider/pom.xml | 4 + .../dubbo/demo/provider/TripleServiceImpl.java | 11 +- .../src/main/resources/spring/dubbo-provider.xml | 4 + .../dubbo/registry/client/InstanceAddressURL.java | 2 + .../registry/client/ServiceDiscoveryRegistry.java | 6 +- .../client/ServiceDiscoveryRegistryDirectory.java | 17 +- .../client/migration/MigrationInvoker.java | 8 + .../registry/integration/DynamicDirectory.java | 75 ++- .../InterfaceCompatibleRegistryProtocol.java | 1 + .../registry/integration/RegistryDirectory.java | 21 +- .../registry/integration/RegistryProtocol.java | 18 +- ...est.java => CacheableFallbackRegistryTest.java} | 31 +- .../registry/ListenerRegistryWrapperTest.java | 84 ++++ .../dubbo/registry/RegistryFactoryWrapperTest.java | 2 +- .../dubbo/registry/RegistryServiceListener1.java | 2 +- .../dubbo/registry/RegistryServiceListener2.java | 2 +- .../client/migration/MigrationRuleHandlerTest.java | 2 +- .../CountRegistryProtocolListener.java} | 31 +- .../DemoService.java} | 4 +- .../registry/integration/DynamicDirectoryTest.java | 173 +++++++ .../registry/integration/RegistryProtocolTest.java | 550 +++++++++++++++++++++ ...o.registry.integration.RegistryProtocolListener | 1 + .../dubbo/rpc/protocol/grpc/GrpcProtocolTest.java | 22 + .../protocol/grpc/support/DubboGreeterGrpc.java | 3 +- dubbo-rpc/dubbo-rpc-triple/pom.xml | 10 + .../dubbo/rpc/protocol/tri/AbstractStream.java | 58 +-- .../dubbo/rpc/protocol/tri/ExceptionUtils.java | 8 +- .../apache/dubbo/rpc/protocol/tri/GrpcStatus.java | 9 +- .../rpc/protocol/tri/ServerTransportObserver.java | 4 +- .../dubbo/rpc/protocol/tri/TripleHeaderEnum.java | 3 +- .../dubbo/rpc/protocol/tri/TripleProtocol.java | 11 + .../dubbo/rpc/protocol/tri/UnaryClientStream.java | 60 +-- .../protocol/tri/service/HealthStatusManager.java | 74 +++ .../protocol/tri/service/TriBuiltinService.java | 86 ++++ .../rpc/protocol/tri/service/TriHealthImpl.java | 145 ++++++ .../dubbo-rpc-triple/src/main/proto/health.proto | 66 +++ .../dubbo/rpc/protocol/tri/TripleProtocolTest.java | 21 +- .../dubbo/rpc/protocol/tri/support/IGreeter.java | 11 + .../rpc/protocol/tri/support/IGreeterImpl.java | 9 + pom.xml | 1 + 69 files changed, 2520 insertions(+), 286 deletions(-) diff --cc dubbo-common/src/main/java/org/apache/dubbo/common/URLBuilder.java index 24ea293,83a2dab..21e114f --- a/dubbo-common/src/main/java/org/apache/dubbo/common/URLBuilder.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/URLBuilder.java @@@ -205,11 -207,6 +210,12 @@@ public final class URLBuilder extends S } @Override + public URLBuilder setScopeModel(ScopeModel scopeModel) { + this.attributes.put(SCOPE_MODEL, scopeModel); + return this; + } + ++ @Override public URLBuilder addParameterAndEncoded(String key, String value) { if (StringUtils.isEmpty(value)) { return this; diff --cc dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java index f8214ef,9f13ce3..ed45fda --- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java @@@ -27,7 -30,12 +27,11 @@@ import org.apache.dubbo.config.annotati import org.apache.dubbo.config.annotation.Reference; import org.apache.dubbo.config.api.DemoService; import org.apache.dubbo.config.bootstrap.DubboBootstrap; -import org.apache.dubbo.config.context.ConfigManager; import org.apache.dubbo.config.provider.impl.DemoServiceImpl; + + import org.apache.dubbo.metadata.report.MetadataReport; + import org.apache.dubbo.metadata.report.MetadataReportInstance; + import org.apache.dubbo.registry.client.migration.MigrationInvoker; import org.apache.dubbo.rpc.Exporter; import org.apache.dubbo.rpc.ProxyFactory; import org.apache.dubbo.rpc.listener.ListenerInvokerWrapper; @@@ -108,11 -123,9 +113,12 @@@ public class ReferenceConfigTest int zkServerPort = NetUtils.getAvailablePort(NetUtils.getRandomPort()); this.zkServer = new TestingServer(zkServerPort, true); this.zkServer.start(); - this.registryUrl = "zookeeper://localhost:" + zkServerPort; + this.zkUrl = "zookeeper://localhost:" + zkServerPort; + this.registryUrl = "registry://localhost:" + zkServerPort+"?registry=zookeeper"; - ApplicationModel.getConfigManager(); + + // preload + ReferenceConfig preloadReferenceConfig = new ReferenceConfig(); + ApplicationModel.defaultModel().getApplicationConfigManager(); DubboBootstrap.getInstance(); } @@@ -473,19 -547,160 +479,162 @@@ Assertions.assertEquals("value1", url.getParameter("key1")); Assertions.assertEquals("value2", url.getParameter("key2")); + dubboBootstrap.stop(); ++ + applicationModelMockedStatic.closeOnDemand(); + metadataReportInstanceMockedStatic.closeOnDemand(); + } + - + /** + * Verify the configuration of the registry protocol for remote reference + */ + @Test + public void testCreateInvokerForRemoteRefer(){ + + ReferenceConfig<DemoService> referenceConfig = new ReferenceConfig<>(); + referenceConfig.setGeneric(Boolean.FALSE.toString()); + referenceConfig.setProtocol("dubbo"); + referenceConfig.setInit(true); + referenceConfig.setLazy(false); + referenceConfig.setInjvm(false); + + DubboBootstrap.getInstance() + .application("application1") + .initialize(); + referenceConfig.setBootstrap(DubboBootstrap.getInstance()); + + ApplicationConfig applicationConfig = new ApplicationConfig(); + applicationConfig.setName("application1"); + Map<String, String> parameters = new HashMap<>(); + parameters.put("key1", "value1"); + parameters.put("key2", "value2"); + applicationConfig.setParameters(parameters); + + ConfigManager configManager = mock(ConfigManager.class); + Environment environment = mock(Environment.class); + CompositeConfiguration compositeConfiguration = mock(CompositeConfiguration.class); + Configuration dynamicGlobalConfiguration = mock(Configuration.class); + ServiceRepository serviceRepository = mock(ServiceRepository.class); + ConsumerModel consumerModel = mock(ConsumerModel.class); + + when(configManager.getApplicationOrElseThrow()).thenReturn(applicationConfig); + + MockedStatic<ApplicationModel> applicationModelMockedStatic = Mockito.mockStatic(ApplicationModel.class); + applicationModelMockedStatic.when(ApplicationModel::getConfigManager).thenReturn(configManager); + applicationModelMockedStatic.when(ApplicationModel::getEnvironment).thenReturn(environment); + applicationModelMockedStatic.when(ApplicationModel::getServiceRepository).thenReturn(serviceRepository); + when(environment.getConfiguration()).thenReturn(compositeConfiguration); + when(environment.getDynamicGlobalConfiguration()).thenReturn(dynamicGlobalConfiguration); + when(compositeConfiguration.convert(Boolean.class, ENABLE_CONFIGURATION_LISTEN, true)) + .thenReturn(true); + + MockedStatic<MetadataReportInstance> metadataReportInstanceMockedStatic = + Mockito.mockStatic(MetadataReportInstance.class); + + MetadataReport metadataReport = mock(MetadataReport.class); + metadataReportInstanceMockedStatic.when(() -> MetadataReportInstance.getMetadataReport("default")) + .thenReturn(metadataReport); + + + when(serviceRepository.lookupReferredService("org.apache.dubbo.config.api.DemoService")) + .thenReturn(consumerModel); + + referenceConfig.refreshed.set(true); + referenceConfig.setInterface(DemoService.class); + referenceConfig.getInterfaceClass(); + referenceConfig.setCheck(false); + RegistryConfig registry = new RegistryConfig(); + registry.setAddress(zkUrl); + applicationConfig.setRegistries(Collections.singletonList(registry)); + applicationConfig.setRegistryIds(registry.getId()); + + referenceConfig.setRegistry(registry); + + referenceConfig.init(); + Assertions.assertTrue(referenceConfig.getInvoker() instanceof MigrationInvoker); + + applicationModelMockedStatic.closeOnDemand(); + metadataReportInstanceMockedStatic.closeOnDemand(); } + /** + * Verify that the registry url is directly configured for remote reference + */ + @Test + public void testCreateInvokerWithRegistryUrlForRemoteRefer(){ + + ReferenceConfig<DemoService> referenceConfig = new ReferenceConfig<>(); + referenceConfig.setGeneric(Boolean.FALSE.toString()); + referenceConfig.setProtocol("dubbo"); + referenceConfig.setInit(true); + referenceConfig.setLazy(false); + referenceConfig.setInjvm(false); + + DubboBootstrap.getInstance() + .application("application1") + .initialize(); + referenceConfig.setBootstrap(DubboBootstrap.getInstance()); + + ApplicationConfig applicationConfig = new ApplicationConfig(); + applicationConfig.setName("application1"); + Map<String, String> parameters = new HashMap<>(); + parameters.put("key1", "value1"); + parameters.put("key2", "value2"); + applicationConfig.setParameters(parameters); + + ConfigManager configManager = mock(ConfigManager.class); + Environment environment = mock(Environment.class); + CompositeConfiguration compositeConfiguration = mock(CompositeConfiguration.class); + Configuration dynamicGlobalConfiguration = mock(Configuration.class); + ServiceRepository serviceRepository = mock(ServiceRepository.class); + ConsumerModel consumerModel = mock(ConsumerModel.class); + + when(configManager.getApplicationOrElseThrow()).thenReturn(applicationConfig); + + MockedStatic<ApplicationModel> applicationModelMockedStatic = Mockito.mockStatic(ApplicationModel.class); + applicationModelMockedStatic.when(ApplicationModel::getConfigManager).thenReturn(configManager); + applicationModelMockedStatic.when(ApplicationModel::getEnvironment).thenReturn(environment); + applicationModelMockedStatic.when(ApplicationModel::getServiceRepository).thenReturn(serviceRepository); + when(environment.getConfiguration()).thenReturn(compositeConfiguration); + when(environment.getDynamicGlobalConfiguration()).thenReturn(dynamicGlobalConfiguration); + when(compositeConfiguration.convert(Boolean.class, ENABLE_CONFIGURATION_LISTEN, true)) + .thenReturn(true); + + MockedStatic<MetadataReportInstance> metadataReportInstanceMockedStatic = + Mockito.mockStatic(MetadataReportInstance.class); + + MetadataReport metadataReport = mock(MetadataReport.class); + metadataReportInstanceMockedStatic.when(() -> MetadataReportInstance.getMetadataReport("default")) + .thenReturn(metadataReport); + + + when(serviceRepository.lookupReferredService("org.apache.dubbo.config.api.DemoService")) + .thenReturn(consumerModel); + + referenceConfig.refreshed.set(true); + referenceConfig.setInterface(DemoService.class); + referenceConfig.getInterfaceClass(); + referenceConfig.setCheck(false); + + referenceConfig.setUrl(registryUrl); + referenceConfig.init(); + Assertions.assertTrue(referenceConfig.getInvoker() instanceof MigrationInvoker); + + applicationModelMockedStatic.closeOnDemand(); + metadataReportInstanceMockedStatic.closeOnDemand(); + } + ++ @Test @Disabled("Disabled due to Github Actions environment") public void testInjvm() throws Exception { ApplicationConfig application = new ApplicationConfig(); application.setName("test-protocol-random-port"); application.setEnableFileCache(false); - ApplicationModel.getConfigManager().setApplication(application); + ApplicationModel.defaultModel().getApplicationConfigManager().setApplication(application); RegistryConfig registry = new RegistryConfig(); - registry.setAddress(registryUrl); + registry.setAddress(zkUrl); ProtocolConfig protocol = new ProtocolConfig(); protocol.setName("dubbo"); @@@ -526,10 -741,10 +675,10 @@@ ApplicationConfig application = new ApplicationConfig(); application.setName("test-reference-retry"); application.setEnableFileCache(false); - ApplicationModel.getConfigManager().setApplication(application); + ApplicationModel.defaultModel().getApplicationConfigManager().setApplication(application); RegistryConfig registry = new RegistryConfig(); - registry.setAddress(registryUrl); + registry.setAddress(zkUrl); ProtocolConfig protocol = new ProtocolConfig(); protocol.setName("injvm"); diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java index 108292a,5792693..6e12519 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java @@@ -55,15 -54,17 +55,18 @@@ import static org.apache.dubbo.rpc.mode public class ServiceDiscoveryRegistryDirectory<T> extends DynamicDirectory<T> { private static final Logger logger = LoggerFactory.getLogger(ServiceDiscoveryRegistryDirectory.class); - // instance address to invoker mapping. - private volatile Map<String, Invoker<T>> urlInvokerMap; // The initial value is null and the midway may be assigned to null, please use the local variable reference + /** + * instance address to invoker mapping. + * The initial value is null and the midway may be assigned to null, please use the local variable reference + */ + private volatile Map<String, Invoker<T>> urlInvokerMap; - private final static ConsumerConfigurationListener CONSUMER_CONFIGURATION_LISTENER = new ConsumerConfigurationListener(); + private final ConsumerConfigurationListener consumerConfigurationListener; private volatile ReferenceConfigurationListener referenceConfigurationListener; private volatile boolean enableConfigurationListen = true; - private volatile List<URL> originalUrls = null; // initial for null + private volatile List<URL> originalUrls = null; private volatile Map<String, String> overrideQueryMap; private volatile Map<String, String> consumerFirstQueryMap; + private final ApplicationModel applicationModel; public ServiceDiscoveryRegistryDirectory(Class<T> serviceType, URL url) { super(serviceType, url); @@@ -185,8 -180,8 +186,8 @@@ } private InstanceAddressURL overrideWithConfigurator(InstanceAddressURL providerUrl) { - // override url with configurator from configurator from "app-name.configurators" + // override url with configurator from "app-name.configurators" - providerUrl = overrideWithConfigurators(CONSUMER_CONFIGURATION_LISTENER.getConfigurators(), providerUrl); + providerUrl = overrideWithConfigurators(consumerConfigurationListener.getConfigurators(), providerUrl); // override url with configurator from configurators from "service-name.configurators" if (referenceConfigurationListener != null) { diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java index 7797d10,82058af..4fa1f76 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java @@@ -87,15 -86,19 +87,20 @@@ import static org.apache.dubbo.rpc.mode public class RegistryDirectory<T> extends DynamicDirectory<T> { private static final Logger logger = LoggerFactory.getLogger(RegistryDirectory.class); - private static final ConsumerConfigurationListener CONSUMER_CONFIGURATION_LISTENER = new ConsumerConfigurationListener(); + private final ConsumerConfigurationListener consumerConfigurationListener; private ReferenceConfigurationListener referenceConfigurationListener; - // Map<url, Invoker> cache service url to invoker mapping. - // The initial value is null and the midway may be assigned to null, please use the local variable reference + /** + * Map<url, Invoker> cache service url to invoker mapping. + * The initial value is null and the midway may be assigned to null, please use the local variable reference + */ protected volatile Map<URL, Invoker<T>> urlInvokerMap; - // The initial value is null and the midway may be assigned to null, please use the local variable reference + + /** + * The initial value is null and the midway may be assigned to null, please use the local variable reference + */ protected volatile Set<URL> cachedInvokerUrls; + private final ApplicationModel applicationModel; public RegistryDirectory(Class<T> serviceType, URL url) { super(serviceType, url); @@@ -411,8 -411,8 +415,8 @@@ // override url with configurator from "override://" URL for dubbo 2.6 and before providerUrl = overrideWithConfigurators(this.configurators, providerUrl); - // override url with configurator from configurator from "app-name.configurators" + // override url with configurator from "app-name.configurators" - providerUrl = overrideWithConfigurators(CONSUMER_CONFIGURATION_LISTENER.getConfigurators(), providerUrl); + providerUrl = overrideWithConfigurators(consumerConfigurationListener.getConfigurators(), providerUrl); // override url with configurator from configurators from "service-name.configurators" if (referenceConfigurationListener != null) { diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java index e687ff7,a4af51b..dea9fd8 --- 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 @@@ -728,9 -694,9 +728,9 @@@ public class RegistryProtocol implement //The current, may have been merged many times URL currentUrl = exporter.getInvoker().getUrl(); //Merged with this configuration - URL newUrl = getConfigedInvokerUrl(configurators, originUrl); - newUrl = getConfigedInvokerUrl(getProviderConfigurationListener(originUrl).getConfigurators(), newUrl); - newUrl = getConfigedInvokerUrl(serviceConfigurationListeners.get(originUrl.getServiceKey()) + URL newUrl = getConfiguredInvokerUrl(configurators, originUrl); - newUrl = getConfiguredInvokerUrl(providerConfigurationListener.getConfigurators(), newUrl); ++ newUrl = getConfiguredInvokerUrl(getProviderConfigurationListener(originUrl).getConfigurators(), newUrl); + newUrl = getConfiguredInvokerUrl(serviceConfigurationListeners.get(originUrl.getServiceKey()) .getConfigurators(), newUrl); if (!currentUrl.equals(newUrl)) { if (newUrl.getParameter(Constants.NEED_REEXPORT, true)) { diff --cc dubbo-rpc/dubbo-rpc-grpc/src/test/java/org/apache/dubbo/rpc/protocol/grpc/GrpcProtocolTest.java index 798ed37,d5118d9..2c3ea35 --- a/dubbo-rpc/dubbo-rpc-grpc/src/test/java/org/apache/dubbo/rpc/protocol/grpc/GrpcProtocolTest.java +++ b/dubbo-rpc/dubbo-rpc-grpc/src/test/java/org/apache/dubbo/rpc/protocol/grpc/GrpcProtocolTest.java @@@ -79,8 -82,28 +81,28 @@@ public class GrpcProtocolTest HelloReply hello = serviceImpl.sayHello(HelloRequest.newBuilder().setName("World").build()); Assertions.assertEquals("Hello World", hello.getMessage()); + ListenableFuture<HelloReply> future = serviceImpl.sayHelloAsync(HelloRequest.newBuilder().setName("World").build()); + Assertions.assertEquals("Hello World", future.get().getMessage()); + + serviceImpl.sayHello(HelloRequest.newBuilder().setName("World").build(), new StreamObserver<HelloReply>() { + + @Override + public void onNext(HelloReply helloReply) { + Assertions.assertEquals("Hello World", helloReply.getMessage()); + } + + @Override + public void onError(Throwable throwable) { + throwable.printStackTrace(); + } + + @Override + public void onCompleted() { + System.out.println("onCompleted"); + } + }); // resource recycle. - ApplicationModel.getServiceRepository().destroy(); + ApplicationModel.defaultModel().getApplicationServiceRepository().destroy(); } class MockReferenceConfig extends ReferenceConfigBase { diff --cc dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/TripleProtocolTest.java index c21e2f2,0db41e3..af49f3e --- a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/TripleProtocolTest.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/TripleProtocolTest.java @@@ -55,10 -55,28 +56,28 @@@ public class TripleProtocolTest protocol.export(proxy.getInvoker(serviceImpl, IGreeter.class, url)); serviceImpl = proxy.getProxy(protocol.refer(IGreeter.class, url)); - Thread.sleep(1000); + Thread.sleep(1000); Assertions.assertEquals("hello world", serviceImpl.echo("hello world")); + // fixme will throw exception + // Assertions.assertEquals("hello world", serviceImpl.echoAsync("hello world").get()); + serviceImpl.serverStream("hello world", new StreamObserver<String>() { + @Override + public void onNext(String data) { + Assertions.assertEquals("hello world",data); + } + + @Override + public void onError(Throwable throwable) { + throwable.printStackTrace(); + } + + @Override + public void onCompleted() { + System.out.println("onCompleted"); + } + }); // resource recycle. - ApplicationModel.getServiceRepository().destroy(); + ApplicationModel.defaultModel().getApplicationServiceRepository().destroy(); } }
