This is an automated email from the ASF dual-hosted git repository. wujimin pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git
commit df187fce58c3d7fc66785a64bff38c7993ebf1f5 Author: wujimin <wuji...@huawei.com> AuthorDate: Mon Jul 16 20:30:13 2018 +0800 [SCB-729] RemoteServiceRegistry allow extend register scheduled task --- .../registry/RemoteServiceRegistry.java | 12 ++++++++-- .../registry/ServiceRegistryTaskInitializer.java | 26 ++++++++++++++++++++++ .../registry/TestRemoteServiceRegistry.java | 22 +++++++++++++++--- 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/RemoteServiceRegistry.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/RemoteServiceRegistry.java index e6efa79..8eb4fb2 100644 --- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/RemoteServiceRegistry.java +++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/RemoteServiceRegistry.java @@ -16,9 +16,11 @@ */ package org.apache.servicecomb.serviceregistry.registry; +import java.util.List; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils; import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient; import org.apache.servicecomb.serviceregistry.client.http.ServiceRegistryClientImpl; import org.apache.servicecomb.serviceregistry.config.ServiceRegistryConfig; @@ -38,6 +40,9 @@ public class RemoteServiceRegistry extends AbstractServiceRegistry { private ScheduledThreadPoolExecutor taskPool; + private List<ServiceRegistryTaskInitializer> taskInitializers = SPIServiceUtils + .getOrLoadSortedService(ServiceRegistryTaskInitializer.class); + public RemoteServiceRegistry(EventBus eventBus, ServiceRegistryConfig serviceRegistryConfig, MicroserviceDefinition microserviceDefinition) { super(eventBus, serviceRegistryConfig, microserviceDefinition); @@ -77,6 +82,10 @@ public class RemoteServiceRegistry extends AbstractServiceRegistry { serviceRegistryConfig.getInstancePullInterval(), serviceRegistryConfig.getInstancePullInterval(), TimeUnit.SECONDS); + + for (ServiceRegistryTaskInitializer initializer : taskInitializers) { + initializer.init(this); + } } @Subscribe @@ -91,8 +100,7 @@ public class RemoteServiceRegistry extends AbstractServiceRegistry { } } - // for testing - ScheduledThreadPoolExecutor getTaskPool() { + public ScheduledThreadPoolExecutor getTaskPool() { return this.taskPool; } } diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/ServiceRegistryTaskInitializer.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/ServiceRegistryTaskInitializer.java new file mode 100644 index 0000000..21cd842 --- /dev/null +++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/ServiceRegistryTaskInitializer.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.servicecomb.serviceregistry.registry; + +public interface ServiceRegistryTaskInitializer { + default int getOrder() { + return 0; + } + + void init(RemoteServiceRegistry remoteServiceRegistry); +} diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/registry/TestRemoteServiceRegistry.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/registry/TestRemoteServiceRegistry.java index d46ef93..73483fa 100644 --- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/registry/TestRemoteServiceRegistry.java +++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/registry/TestRemoteServiceRegistry.java @@ -17,12 +17,15 @@ package org.apache.servicecomb.serviceregistry.registry; import java.util.ArrayList; +import java.util.Arrays; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.apache.servicecomb.config.ConfigUtil; import org.apache.servicecomb.foundation.common.net.IpPort; +import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils; import org.apache.servicecomb.serviceregistry.RegistryUtils; import org.apache.servicecomb.serviceregistry.ServiceRegistry; import org.apache.servicecomb.serviceregistry.client.LocalServiceRegistryClientImpl; @@ -65,12 +68,20 @@ public class TestRemoteServiceRegistry { @Test public void testLifeCycle(@Injectable ServiceRegistryConfig config, @Injectable MicroserviceDefinition definition, - @Injectable ServiceRegistry registry) { + @Injectable ServiceRegistry registry) throws InterruptedException { ArrayList<IpPort> ipPortList = new ArrayList<>(); ipPortList.add(new IpPort("127.0.0.1", 9980)); ipPortList.add(new IpPort("127.0.0.1", 9981)); - new Expectations() { + CountDownLatch latch = new CountDownLatch(1); + ServiceRegistryTaskInitializer initializer = new MockUp<ServiceRegistryTaskInitializer>() { + @Mock + void init(RemoteServiceRegistry remoteServiceRegistry) { + latch.countDown(); + } + }.getMockInstance(); + + new Expectations(SPIServiceUtils.class) { { definition.getConfiguration(); result = ConfigUtil.createLocalConfig(); @@ -86,6 +97,8 @@ public class TestRemoteServiceRegistry { result = 30; config.isWatch(); result = false; + SPIServiceUtils.getOrLoadSortedService(ServiceRegistryTaskInitializer.class); + result = Arrays.asList(initializer); } }; @@ -95,6 +108,10 @@ public class TestRemoteServiceRegistry { RemoteServiceRegistry remote = new TestingRemoteServiceRegistry(bus, config, definition); remote.init(); remote.run(); + + // should not block + latch.await(); + Assert.assertTrue(2 <= remote.getTaskPool().getTaskCount()); // includes complete tasks bus.post(new ShutdownEvent()); @@ -102,7 +119,6 @@ public class TestRemoteServiceRegistry { remote.getTaskPool().schedule(new Runnable() { @Override public void run() { - // TODO Auto-generated method stub } }, 0, TimeUnit.SECONDS);