From 8fdca1f4c47faa560534aea8ac9625a5b6459ae8 Mon Sep 17 00:00:00 2001 From: wu-sheng Date: Fri, 27 Oct 2017 14:11:17 +0800 Subject: [PATCH] Provide new stage of module initialization. Named `notifyAfterCompleted`. And rename `init` stage to `start`. Now the initialization sequence is prepare -> start -> notifyAfterCompleted --- .../LocalAsyncWorkerProviderDefineLoader.java | 1 - .../RemoteWorkerProviderDefineLoader.java | 1 - .../redis/ClusterModuleRedisProvider.java | 6 +- .../ClusterModuleStandaloneProvider.java | 6 +- .../ClusterModuleZookeeperProvider.java | 6 +- .../collector/core/UnexpectedException.java | 28 ++++++ .../core/module/ApplicationConfiguration.java | 2 +- .../apm/collector/core/module/Module.java | 10 +- .../collector/core/module/ModuleManager.java | 12 ++- .../collector/core/module/ModuleProvider.java | 11 ++- .../collector/core/util/DefinitionLoader.java | 96 ------------------- .../collector/core/util/TimeBucketUtils.java | 2 +- .../core/module/ModuleAProvider.java | 6 +- .../core/module/ModuleBProvider.java | 6 +- .../core/module/TestModuleProvider.java | 6 +- .../jetty/NamingModuleJettyProvider.java | 6 +- 16 files changed, 90 insertions(+), 115 deletions(-) create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/UnexpectedException.java delete mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/DefinitionLoader.java diff --git a/apm-collector-3.2.3/apm-collector-stream/src/main/java/org/skywalking/apm/collector/stream/worker/LocalAsyncWorkerProviderDefineLoader.java b/apm-collector-3.2.3/apm-collector-stream/src/main/java/org/skywalking/apm/collector/stream/worker/LocalAsyncWorkerProviderDefineLoader.java index 4ae46ecb6..d2b8ccf46 100644 --- a/apm-collector-3.2.3/apm-collector-stream/src/main/java/org/skywalking/apm/collector/stream/worker/LocalAsyncWorkerProviderDefineLoader.java +++ b/apm-collector-3.2.3/apm-collector-stream/src/main/java/org/skywalking/apm/collector/stream/worker/LocalAsyncWorkerProviderDefineLoader.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.List; import org.skywalking.apm.collector.core.framework.DefineException; import org.skywalking.apm.collector.core.framework.Loader; -import org.skywalking.apm.collector.core.util.DefinitionLoader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/apm-collector-3.2.3/apm-collector-stream/src/main/java/org/skywalking/apm/collector/stream/worker/RemoteWorkerProviderDefineLoader.java b/apm-collector-3.2.3/apm-collector-stream/src/main/java/org/skywalking/apm/collector/stream/worker/RemoteWorkerProviderDefineLoader.java index 527456eac..fe7eeadb7 100644 --- a/apm-collector-3.2.3/apm-collector-stream/src/main/java/org/skywalking/apm/collector/stream/worker/RemoteWorkerProviderDefineLoader.java +++ b/apm-collector-3.2.3/apm-collector-stream/src/main/java/org/skywalking/apm/collector/stream/worker/RemoteWorkerProviderDefineLoader.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.List; import org.skywalking.apm.collector.core.framework.DefineException; import org.skywalking.apm.collector.core.framework.Loader; -import org.skywalking.apm.collector.core.util.DefinitionLoader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/apm-collector/apm-collector-cluster/collector-cluster-redis-provider/src/main/java/org/skywalking/apm/collector/cluster/redis/ClusterModuleRedisProvider.java b/apm-collector/apm-collector-cluster/collector-cluster-redis-provider/src/main/java/org/skywalking/apm/collector/cluster/redis/ClusterModuleRedisProvider.java index bcb75bdbc..de7c9ee49 100644 --- a/apm-collector/apm-collector-cluster/collector-cluster-redis-provider/src/main/java/org/skywalking/apm/collector/cluster/redis/ClusterModuleRedisProvider.java +++ b/apm-collector/apm-collector-cluster/collector-cluster-redis-provider/src/main/java/org/skywalking/apm/collector/cluster/redis/ClusterModuleRedisProvider.java @@ -45,7 +45,11 @@ public class ClusterModuleRedisProvider extends ModuleProvider { this.registerServiceImplementation(ModuleRegisterService.class, new RedisModuleRegistrationGetService()); } - @Override public void init(Properties config) throws ServiceNotProvidedException { + @Override public void start(Properties config) throws ServiceNotProvidedException { + + } + + @Override public void notifyAfterCompleted() throws ServiceNotProvidedException { } diff --git a/apm-collector/apm-collector-cluster/collector-cluster-standalone-provider/src/main/java/org/skywalking/apm/collector/cluster/standalone/ClusterModuleStandaloneProvider.java b/apm-collector/apm-collector-cluster/collector-cluster-standalone-provider/src/main/java/org/skywalking/apm/collector/cluster/standalone/ClusterModuleStandaloneProvider.java index 0b065687f..5cf77c26f 100644 --- a/apm-collector/apm-collector-cluster/collector-cluster-standalone-provider/src/main/java/org/skywalking/apm/collector/cluster/standalone/ClusterModuleStandaloneProvider.java +++ b/apm-collector/apm-collector-cluster/collector-cluster-standalone-provider/src/main/java/org/skywalking/apm/collector/cluster/standalone/ClusterModuleStandaloneProvider.java @@ -45,7 +45,11 @@ public class ClusterModuleStandaloneProvider extends ModuleProvider { this.registerServiceImplementation(ModuleRegisterService.class, new StandaloneModuleRegistrationGetService()); } - @Override public void init(Properties config) throws ServiceNotProvidedException { + @Override public void start(Properties config) throws ServiceNotProvidedException { + + } + + @Override public void notifyAfterCompleted() throws ServiceNotProvidedException { } diff --git a/apm-collector/apm-collector-cluster/collector-cluster-zookeeper-provider/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterModuleZookeeperProvider.java b/apm-collector/apm-collector-cluster/collector-cluster-zookeeper-provider/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterModuleZookeeperProvider.java index cf78e5d53..62638a592 100644 --- a/apm-collector/apm-collector-cluster/collector-cluster-zookeeper-provider/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterModuleZookeeperProvider.java +++ b/apm-collector/apm-collector-cluster/collector-cluster-zookeeper-provider/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterModuleZookeeperProvider.java @@ -45,7 +45,11 @@ public class ClusterModuleZookeeperProvider extends ModuleProvider { this.registerServiceImplementation(ModuleRegisterService.class, new ZookeeperModuleRegistrationGetService()); } - @Override public void init(Properties config) throws ServiceNotProvidedException { + @Override public void start(Properties config) throws ServiceNotProvidedException { + + } + + @Override public void notifyAfterCompleted() throws ServiceNotProvidedException { } diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/UnexpectedException.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/UnexpectedException.java new file mode 100644 index 000000000..bc50de65d --- /dev/null +++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/UnexpectedException.java @@ -0,0 +1,28 @@ +/* + * Copyright 2017, OpenSkywalking Organization All rights reserved. + * + * Licensed 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. + * + * Project repository: https://github.com/OpenSkywalking/skywalking + */ + +package org.skywalking.apm.collector.core; + +/** + * @author wu-sheng + */ +public class UnexpectedException extends RuntimeException { + public UnexpectedException(String message) { + super(message); + } +} diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ApplicationConfiguration.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ApplicationConfiguration.java index 9acba5a05..db1fb0af0 100644 --- a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ApplicationConfiguration.java +++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ApplicationConfiguration.java @@ -22,7 +22,7 @@ import java.util.HashMap; import java.util.Properties; /** - * Modulization configurations. The {@link ModuleManager} is going to start, lookup, init modules based on this. + * Modulization configurations. The {@link ModuleManager} is going to start, lookup, start modules based on this. * * @author wu-sheng */ diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/Module.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/Module.java index 99f530378..d0dcd728e 100644 --- a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/Module.java +++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/Module.java @@ -77,7 +77,7 @@ public abstract class Module { } } - void init(ModuleManager moduleManager, + void start(ModuleManager moduleManager, ApplicationConfiguration.ModuleConfiguration configuration) throws ProviderNotFoundException, ModuleNotFoundException, ServiceNotProvidedException { for (ModuleProvider provider : loadedProviders) { String[] requiredModules = provider.requiredModules(); @@ -88,12 +88,18 @@ public abstract class Module { } } } - provider.init(configuration.getProviderConfiguration(provider.name())); + provider.start(configuration.getProviderConfiguration(provider.name())); provider.requiredCheck(services()); } } + void notifyAfterCompleted() throws ProviderNotFoundException, ModuleNotFoundException, ServiceNotProvidedException { + for (ModuleProvider provider : loadedProviders) { + provider.notifyAfterCompleted(); + } + } + /** * @return providers of this module */ diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleManager.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleManager.java index 1a10e13cb..2cde24246 100644 --- a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleManager.java +++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleManager.java @@ -60,13 +60,17 @@ public class ModuleManager { } } - for (Module module : loadedModules.values()) { - module.init(this, applicationConfiguration.getModuleConfiguration(module.name())); - } - if (moduleList.size() > 0) { throw new ModuleNotFoundException(moduleList.toString() + " missing."); } + + for (Module module : loadedModules.values()) { + module.start(this, applicationConfiguration.getModuleConfiguration(module.name())); + } + + for (Module module : loadedModules.values()) { + module.notifyAfterCompleted(); + } } public boolean has(String moduleName) { diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleProvider.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleProvider.java index 8c69fe4ba..60eb8bfbf 100644 --- a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleProvider.java +++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleProvider.java @@ -63,11 +63,18 @@ public abstract class ModuleProvider { public abstract void prepare(Properties config) throws ServiceNotProvidedException; /** - * In prepare stage, the module can interop with other modules. + * In start stage, the module has been ready for interop. * * @param config from `application.yml` */ - public abstract void init(Properties config) throws ServiceNotProvidedException; + public abstract void start(Properties config) throws ServiceNotProvidedException; + + /** + * This callback executes after all modules start up successfully. + * + * @throws ServiceNotProvidedException + */ + public abstract void notifyAfterCompleted() throws ServiceNotProvidedException; /** * @return module names which does this module require? diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/DefinitionLoader.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/DefinitionLoader.java deleted file mode 100644 index 461cff604..000000000 --- a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/DefinitionLoader.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2017, OpenSkywalking Organization All rights reserved. - * - * Licensed 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. - * - * Project repository: https://github.com/OpenSkywalking/skywalking - */ - -package org.skywalking.apm.collector.core.util; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.URL; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Objects; -import java.util.Properties; -import org.skywalking.apm.collector.core.framework.DefinitionFile; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author peng-yongsheng - */ -public class DefinitionLoader implements Iterable { - - private final Logger logger = LoggerFactory.getLogger(DefinitionLoader.class); - - private final Class definition; - private final DefinitionFile definitionFile; - - protected DefinitionLoader(Class svc, DefinitionFile definitionFile) { - this.definition = Objects.requireNonNull(svc, "definition interface cannot be null"); - this.definitionFile = definitionFile; - } - - public static DefinitionLoader load(Class definition, DefinitionFile definitionFile) { - return new DefinitionLoader(definition, definitionFile); - } - - @Override public final Iterator iterator() { - logger.info("load definition file: {}", definitionFile.get()); - List definitionList = new LinkedList<>(); - try { - Enumeration urlEnumeration = this.getClass().getClassLoader().getResources(definitionFile.get()); - while (urlEnumeration.hasMoreElements()) { - URL definitionFileURL = urlEnumeration.nextElement(); - logger.info("definition file url: {}", definitionFileURL.getPath()); - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(definitionFileURL.openStream())); - Properties properties = new Properties(); - properties.load(bufferedReader); - - Enumeration defineItem = properties.propertyNames(); - while (defineItem.hasMoreElements()) { - String fullNameClass = (String)defineItem.nextElement(); - definitionList.add(fullNameClass); - } - } - } catch (IOException e) { - logger.error(e.getMessage(), e); - } - - Iterator moduleDefineIterator = definitionList.iterator(); - - return new Iterator() { - @Override public boolean hasNext() { - return moduleDefineIterator.hasNext(); - } - - @Override public D next() { - String definitionClass = moduleDefineIterator.next(); - logger.info("definitionClass: {}", definitionClass); - try { - Class c = Class.forName(definitionClass); - return (D)c.newInstance(); - } catch (Exception e) { - logger.error(e.getMessage(), e); - } - return null; - } - }; - } -} diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/TimeBucketUtils.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/TimeBucketUtils.java index 4514ff991..382776428 100644 --- a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/TimeBucketUtils.java +++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/TimeBucketUtils.java @@ -21,7 +21,7 @@ package org.skywalking.apm.collector.core.util; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.TimeZone; -import org.skywalking.apm.collector.core.framework.UnexpectedException; +import org.skywalking.apm.collector.core.UnexpectedException; /** * @author peng-yongsheng diff --git a/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ModuleAProvider.java b/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ModuleAProvider.java index 2dd062278..44ae24d1f 100644 --- a/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ModuleAProvider.java +++ b/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ModuleAProvider.java @@ -36,10 +36,14 @@ public class ModuleAProvider extends ModuleProvider { this.registerServiceImplementation(BaseModuleA.ServiceABusiness1.class, new Business1()); } - @Override public void init(Properties config) throws ServiceNotProvidedException { + @Override public void start(Properties config) throws ServiceNotProvidedException { this.registerServiceImplementation(BaseModuleA.ServiceABusiness2.class, new Business2()); } + @Override public void notifyAfterCompleted() throws ServiceNotProvidedException { + + } + @Override public String[] requiredModules() { return new String[0]; } diff --git a/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ModuleBProvider.java b/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ModuleBProvider.java index ea4725188..d84602857 100644 --- a/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ModuleBProvider.java +++ b/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ModuleBProvider.java @@ -36,10 +36,14 @@ public class ModuleBProvider extends ModuleProvider { this.registerServiceImplementation(BaseModuleB.ServiceBBusiness1.class, new Business1()); } - @Override public void init(Properties config) throws ServiceNotProvidedException { + @Override public void start(Properties config) throws ServiceNotProvidedException { this.registerServiceImplementation(BaseModuleB.ServiceBBusiness2.class, new Business2()); } + @Override public void notifyAfterCompleted() throws ServiceNotProvidedException { + + } + @Override public String[] requiredModules() { return new String[0]; } diff --git a/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/TestModuleProvider.java b/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/TestModuleProvider.java index 8e665cae9..3be49f44e 100644 --- a/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/TestModuleProvider.java +++ b/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/TestModuleProvider.java @@ -36,7 +36,11 @@ public class TestModuleProvider extends ModuleProvider { } - @Override public void init(Properties config) { + @Override public void start(Properties config) { + + } + + @Override public void notifyAfterCompleted() throws ServiceNotProvidedException { } diff --git a/apm-collector/apm-collector-naming/collector-naming-jetty-provider/src/main/java/org/skywalking/apm/collector/naming/jetty/NamingModuleJettyProvider.java b/apm-collector/apm-collector-naming/collector-naming-jetty-provider/src/main/java/org/skywalking/apm/collector/naming/jetty/NamingModuleJettyProvider.java index c58257c98..d9d68829a 100644 --- a/apm-collector/apm-collector-naming/collector-naming-jetty-provider/src/main/java/org/skywalking/apm/collector/naming/jetty/NamingModuleJettyProvider.java +++ b/apm-collector/apm-collector-naming/collector-naming-jetty-provider/src/main/java/org/skywalking/apm/collector/naming/jetty/NamingModuleJettyProvider.java @@ -41,7 +41,11 @@ public class NamingModuleJettyProvider extends ModuleProvider { @Override public void prepare(Properties config) throws ServiceNotProvidedException { } - @Override public void init(Properties config) throws ServiceNotProvidedException { + @Override public void start(Properties config) throws ServiceNotProvidedException { + + } + + @Override public void notifyAfterCompleted() throws ServiceNotProvidedException { }