diff --git a/oap-server/server-cluster-plugin/cluster-standalone-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/standalone/ClusterModuleStandaloneProvider.java b/oap-server/server-cluster-plugin/cluster-standalone-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/standalone/ClusterModuleStandaloneProvider.java
index fddd3f5e7..a6f4bef33 100644
--- a/oap-server/server-cluster-plugin/cluster-standalone-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/standalone/ClusterModuleStandaloneProvider.java
+++ b/oap-server/server-cluster-plugin/cluster-standalone-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/standalone/ClusterModuleStandaloneProvider.java
@@ -58,4 +58,9 @@ public class ClusterModuleStandaloneProvider extends ModuleProvider {
@Override public void notifyAfterCompleted() {
}
+
+ @Override
+ public String[] requiredModules() {
+ return new String[0];
+ }
}
diff --git a/oap-server/server-cluster-plugin/cluster-zookeeper-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/zookeeper/ClusterModuleZookeeperProvider.java b/oap-server/server-cluster-plugin/cluster-zookeeper-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/zookeeper/ClusterModuleZookeeperProvider.java
index 031c9ab95..0c52a81be 100644
--- a/oap-server/server-cluster-plugin/cluster-zookeeper-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/zookeeper/ClusterModuleZookeeperProvider.java
+++ b/oap-server/server-cluster-plugin/cluster-zookeeper-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/zookeeper/ClusterModuleZookeeperProvider.java
@@ -83,4 +83,9 @@ public class ClusterModuleZookeeperProvider extends ModuleProvider {
@Override public void notifyAfterCompleted() {
}
+
+ @Override
+ public String[] requiredModules() {
+ return new String[0];
+ }
}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java
index 030742a77..6a8ca4f5e 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java
@@ -89,4 +89,9 @@ public class CoreModuleProvider extends ModuleProvider {
restServerInstance.setContextPath(moduleConfig.getRestContextPath());
this.getManager().find(ClusterModule.NAME).getService(ModuleRegister.class).register(CoreModule.NAME, "rest", restServerInstance);
}
+
+ @Override
+ public String[] requiredModules() {
+ return new String[0];
+ }
}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/ModuleQuery.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/ModuleQuery.java
index b3a47467c..d44532adf 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/ModuleQuery.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/ModuleQuery.java
@@ -18,9 +18,10 @@
package org.apache.skywalking.oap.server.core.cluster;
-import java.util.List;
import org.apache.skywalking.oap.server.library.module.Service;
+import java.util.List;
+
/**
* @author peng-yongsheng
*/
diff --git a/oap-server/server-library/library-module/pom.xml b/oap-server/server-library/library-module/pom.xml
index beeaa1028..6df06f106 100644
--- a/oap-server/server-library/library-module/pom.xml
+++ b/oap-server/server-library/library-module/pom.xml
@@ -29,4 +29,12 @@
library-module
jar
+
+
+ org.apache.skywalking
+ library-util
+ ${project.version}
+ compile
+
+
\ No newline at end of file
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ApplicationConfiguration.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ApplicationConfiguration.java
index ca685e9b3..0fe2d943b 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ApplicationConfiguration.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ApplicationConfiguration.java
@@ -16,18 +16,19 @@
*
*/
+
package org.apache.skywalking.oap.server.library.module;
-import java.util.*;
+import java.util.HashMap;
+import java.util.Properties;
/**
- * Modularization configurations. The {@link ModuleManager} is going to start, lookup, start modules based on this.
+ * Modulization configurations. The {@link ModuleManager} is going to start, lookup, start modules based on this.
*
* @author wu-sheng, peng-yongsheng
*/
public class ApplicationConfiguration {
-
- private final Map modules = new HashMap<>();
+ private HashMap modules = new HashMap<>();
public String[] moduleList() {
return modules.keySet().toArray(new String[0]);
@@ -51,7 +52,7 @@ public class ApplicationConfiguration {
* The configurations about a certain module.
*/
public class ModuleConfiguration {
- private final Map providers = new HashMap<>();
+ private HashMap providers = new HashMap<>();
private ModuleConfiguration() {
}
@@ -64,10 +65,6 @@ public class ApplicationConfiguration {
return providers.containsKey(name);
}
- public String[] providerList() {
- return providers.keySet().toArray(new String[0]);
- }
-
public ModuleConfiguration addProviderConfiguration(String name, Properties properties) {
ProviderConfiguration newProvider = new ProviderConfiguration(properties);
providers.put(name, newProvider);
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/BootstrapFlow.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/BootstrapFlow.java
new file mode 100644
index 000000000..187575f48
--- /dev/null
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/BootstrapFlow.java
@@ -0,0 +1,118 @@
+/*
+ * 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.skywalking.oap.server.library.module;
+
+import org.apache.skywalking.oap.server.library.util.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author wu-sheng, peng-yongsheng
+ */
+class BootstrapFlow {
+ private static final Logger logger = LoggerFactory.getLogger(BootstrapFlow.class);
+
+ private Map loadedModules;
+ private List startupSequence;
+
+ BootstrapFlow(Map loadedModules) throws CycleDependencyException {
+ this.loadedModules = loadedModules;
+ startupSequence = new LinkedList<>();
+
+ makeSequence();
+ }
+
+ @SuppressWarnings("unchecked")
+ void start(
+ ModuleManager moduleManager) throws ModuleNotFoundException, ServiceNotProvidedException, ModuleStartException {
+ for (ModuleProvider provider : startupSequence) {
+ String[] requiredModules = provider.requiredModules();
+ if (requiredModules != null) {
+ for (String module : requiredModules) {
+ if (!moduleManager.has(module)) {
+ throw new ModuleNotFoundException(module + " is required by " + provider.getModuleName()
+ + "." + provider.name() + ", but not found.");
+ }
+ }
+ }
+ logger.info("start the provider {} in {} module.", provider.name(), provider.getModuleName());
+ provider.requiredCheck(provider.getModule().services());
+
+ provider.start();
+ }
+ }
+
+ void notifyAfterCompleted() throws ServiceNotProvidedException {
+ for (ModuleProvider provider : startupSequence) {
+ provider.notifyAfterCompleted();
+ }
+ }
+
+ private void makeSequence() throws CycleDependencyException {
+ List allProviders = new ArrayList<>();
+ loadedModules.forEach((moduleName, module) -> allProviders.addAll(module.providers()));
+
+ do {
+ int numOfToBeSequenced = allProviders.size();
+ for (int i = 0; i < allProviders.size(); i++) {
+ ModuleProvider provider = allProviders.get(i);
+ String[] requiredModules = provider.requiredModules();
+ if (CollectionUtils.isNotEmpty(requiredModules)) {
+ boolean isAllRequiredModuleStarted = true;
+ for (String module : requiredModules) {
+ // find module in all ready existed startupSequence
+ boolean exist = false;
+ for (ModuleProvider moduleProvider : startupSequence) {
+ if (moduleProvider.getModuleName().equals(module)) {
+ exist = true;
+ break;
+ }
+ }
+ if (!exist) {
+ isAllRequiredModuleStarted = false;
+ break;
+ }
+ }
+
+ if (isAllRequiredModuleStarted) {
+ startupSequence.add(provider);
+ allProviders.remove(i);
+ i--;
+ }
+ } else {
+ startupSequence.add(provider);
+ allProviders.remove(i);
+ i--;
+ }
+ }
+
+ if (numOfToBeSequenced == allProviders.size()) {
+ StringBuilder unSequencedProviders = new StringBuilder();
+ allProviders.forEach(provider -> unSequencedProviders.append(provider.getModuleName()).append("[provider=").append(provider.getClass().getName()).append("]\n"));
+ throw new CycleDependencyException("Exist cycle module dependencies in \n" + unSequencedProviders.substring(0, unSequencedProviders.length() - 1));
+ }
+ }
+ while (allProviders.size() != 0);
+ }
+}
diff --git a/oap-server/server-core/core-cluster/src/main/java/org/apache/skywalking/oap/server/core/cluster/ClusterModule.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/CycleDependencyException.java
similarity index 65%
rename from oap-server/server-core/core-cluster/src/main/java/org/apache/skywalking/oap/server/core/cluster/ClusterModule.java
rename to oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/CycleDependencyException.java
index 992ed10d4..0897120d0 100644
--- a/oap-server/server-core/core-cluster/src/main/java/org/apache/skywalking/oap/server/core/cluster/ClusterModule.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/CycleDependencyException.java
@@ -16,22 +16,14 @@
*
*/
-package org.apache.skywalking.oap.server.core.cluster;
-import org.apache.skywalking.oap.server.library.module.ModuleDefine;
+package org.apache.skywalking.oap.server.library.module;
/**
- * @author peng-yongsheng
+ * @author wu-sheng
*/
-public class ClusterModule extends ModuleDefine {
-
- public static final String NAME = "cluster";
-
- @Override public String name() {
- return NAME;
- }
-
- @Override public Class[] services() {
- return new Class[] {ModuleRegister.class, ModuleQuery.class};
+public class CycleDependencyException extends RuntimeException {
+ public CycleDependencyException(String message) {
+ super(message);
}
}
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/DuplicateProviderException.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/DuplicateProviderException.java
index bf9c0c4f6..c3132671e 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/DuplicateProviderException.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/DuplicateProviderException.java
@@ -16,6 +16,7 @@
*
*/
+
package org.apache.skywalking.oap.server.library.module;
public class DuplicateProviderException extends Exception {
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleConfigException.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleConfigException.java
index 79ee82962..428f1cbb7 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleConfigException.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleConfigException.java
@@ -23,10 +23,6 @@ package org.apache.skywalking.oap.server.library.module;
*/
public class ModuleConfigException extends Exception {
- public ModuleConfigException(String message) {
- super(message);
- }
-
public ModuleConfigException(String message, Throwable cause) {
super(message, cause);
}
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java
index 04e5da702..3f6a80c9e 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java
@@ -18,9 +18,11 @@
package org.apache.skywalking.oap.server.library.module;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.lang.reflect.Field;
import java.util.*;
-import org.slf4j.*;
/**
* A module definition.
@@ -29,9 +31,9 @@ import org.slf4j.*;
*/
public abstract class ModuleDefine {
- private static final Logger logger = LoggerFactory.getLogger(ModuleDefine.class);
+ private final Logger logger = LoggerFactory.getLogger(ModuleDefine.class);
- private ModuleProvider moduleProvider;
+ private LinkedList loadedProviders = new LinkedList<>();
/**
* @return the module name
@@ -50,13 +52,9 @@ public abstract class ModuleDefine {
* @param configuration of this module
* @throws ProviderNotFoundException when even don't find a single one providers.
*/
- public void prepare(ModuleManager moduleManager,
+ void prepare(ModuleManager moduleManager,
ApplicationConfiguration.ModuleConfiguration configuration) throws ProviderNotFoundException, ServiceNotProvidedException, ModuleConfigException {
ServiceLoader moduleProviderLoader = ServiceLoader.load(ModuleProvider.class);
- if (configuration.providerList().length != 1) {
- throw new ModuleConfigException("Just a single provider configuration allowed to open in one module.");
- }
-
boolean providerExist = false;
for (ModuleProvider provider : moduleProviderLoader) {
if (!configuration.has(provider.name())) {
@@ -65,13 +63,15 @@ public abstract class ModuleDefine {
providerExist = true;
if (provider.module().equals(getClass())) {
+ ModuleProvider newProvider;
try {
- moduleProvider = provider.getClass().newInstance();
+ newProvider = provider.getClass().newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new ProviderNotFoundException(e);
}
- moduleProvider.setManager(moduleManager);
- moduleProvider.setModule(this);
+ newProvider.setManager(moduleManager);
+ newProvider.setModule(this);
+ loadedProviders.add(newProvider);
}
}
@@ -79,13 +79,15 @@ public abstract class ModuleDefine {
throw new ProviderNotFoundException(this.name() + " module no provider exists.");
}
- logger.info("Prepare the {} provider in {} module.", moduleProvider.name(), this.name());
- try {
- copyProperties(moduleProvider.createConfigBeanIfAbsent(), configuration.getProviderConfiguration(moduleProvider.name()), this.name(), moduleProvider.name());
- } catch (IllegalAccessException e) {
- throw new ModuleConfigException(this.name() + " module config transport to config bean failure.", e);
+ for (ModuleProvider moduleProvider : loadedProviders) {
+ logger.info("Prepare the {} provider in {} module.", moduleProvider.name(), this.name());
+ try {
+ copyProperties(moduleProvider.createConfigBeanIfAbsent(), configuration.getProviderConfiguration(moduleProvider.name()), this.name(), moduleProvider.name());
+ } catch (IllegalAccessException e) {
+ throw new ModuleConfigException(this.name() + " module config transport to config bean failure.", e);
+ }
+ moduleProvider.prepare();
}
- moduleProvider.prepare();
}
private void copyProperties(ModuleConfig dest, Properties src, String moduleName,
@@ -119,14 +121,25 @@ public abstract class ModuleDefine {
throw new NoSuchFieldException();
}
- public final ModuleProvider provider() {
- return moduleProvider;
+ /**
+ * @return providers of this module
+ */
+ final List providers() {
+ return loadedProviders;
+ }
+
+ final ModuleProvider provider() throws DuplicateProviderException {
+ if (loadedProviders.size() > 1) {
+ throw new DuplicateProviderException(this.name() + " module exist " + loadedProviders.size() + " providers");
+ }
+
+ return loadedProviders.getFirst();
}
public final T getService(Class serviceType) throws ServiceNotProvidedRuntimeException {
try {
return provider().getService(serviceType);
- } catch (ServiceNotProvidedException e) {
+ } catch (DuplicateProviderException | ServiceNotProvidedException e) {
throw new ServiceNotProvidedRuntimeException(e.getMessage());
}
}
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleManager.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleManager.java
index 6e9aba96e..02f09dc86 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleManager.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleManager.java
@@ -18,15 +18,68 @@
package org.apache.skywalking.oap.server.library.module;
+import java.util.*;
+
/**
- * @author peng-yongsheng
+ * The ModuleManager takes charge of all {@link ModuleDefine}s in collector.
+ *
+ * @author wu-sheng, peng-yongsheng
*/
-public interface ModuleManager {
+public class ModuleManager {
+ private boolean isInPrepareStage = true;
+ private Map loadedModules = new HashMap<>();
- void init(
- ModuleDefine moduleDefine) throws ServiceNotProvidedException, ModuleConfigException, ProviderNotFoundException;
+ /**
+ * Init the given modules
+ */
+ public void init(
+ ApplicationConfiguration applicationConfiguration) throws ModuleNotFoundException, ProviderNotFoundException, ServiceNotProvidedException, CycleDependencyException, ModuleConfigException, ModuleStartException {
+ String[] moduleNames = applicationConfiguration.moduleList();
+ ServiceLoader moduleServiceLoader = ServiceLoader.load(ModuleDefine.class);
+ LinkedList moduleList = new LinkedList<>(Arrays.asList(moduleNames));
+ for (ModuleDefine module : moduleServiceLoader) {
+ for (String moduleName : moduleNames) {
+ if (moduleName.equals(module.name())) {
+ ModuleDefine newInstance;
+ try {
+ newInstance = module.getClass().newInstance();
+ } catch (InstantiationException | IllegalAccessException e) {
+ throw new ModuleNotFoundException(e);
+ }
+ newInstance.prepare(this, applicationConfiguration.getModuleConfiguration(moduleName));
+ loadedModules.put(moduleName, newInstance);
+ moduleList.remove(moduleName);
+ }
+ }
+ }
+ // Finish prepare stage
+ isInPrepareStage = false;
- void start() throws ServiceNotProvidedException, ModuleConfigException, ProviderNotFoundException, ModuleStartException;
+ if (moduleList.size() > 0) {
+ throw new ModuleNotFoundException(moduleList.toString() + " missing.");
+ }
- ModuleDefine find(String moduleName) throws ModuleNotFoundRuntimeException;
+ BootstrapFlow bootstrapFlow = new BootstrapFlow(loadedModules);
+
+ bootstrapFlow.start(this);
+ bootstrapFlow.notifyAfterCompleted();
+ }
+
+ public boolean has(String moduleName) {
+ return loadedModules.get(moduleName) != null;
+ }
+
+ public ModuleDefine find(String moduleName) throws ModuleNotFoundRuntimeException {
+ assertPreparedStage();
+ ModuleDefine module = loadedModules.get(moduleName);
+ if (module != null)
+ return module;
+ throw new ModuleNotFoundRuntimeException(moduleName + " missing.");
+ }
+
+ private void assertPreparedStage() {
+ if (isInPrepareStage) {
+ throw new AssertionError("Still in preparing stage.");
+ }
+ }
}
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleNotFoundException.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleNotFoundException.java
index 3ca8e685b..6564c87e7 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleNotFoundException.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleNotFoundException.java
@@ -16,6 +16,7 @@
*
*/
+
package org.apache.skywalking.oap.server.library.module;
public class ModuleNotFoundException extends Exception {
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleNotFoundRuntimeException.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleNotFoundRuntimeException.java
index 2ca0c0cc7..1dbb59154 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleNotFoundRuntimeException.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleNotFoundRuntimeException.java
@@ -16,6 +16,7 @@
*
*/
+
package org.apache.skywalking.oap.server.library.module;
/**
@@ -23,6 +24,10 @@ package org.apache.skywalking.oap.server.library.module;
*/
public class ModuleNotFoundRuntimeException extends RuntimeException {
+ public ModuleNotFoundRuntimeException(Throwable cause) {
+ super(cause);
+ }
+
public ModuleNotFoundRuntimeException(String message) {
super(message);
}
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleProvider.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleProvider.java
index f7d4b51c6..8e9e65974 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleProvider.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleProvider.java
@@ -18,7 +18,8 @@
package org.apache.skywalking.oap.server.library.module;
-import java.util.*;
+import java.util.HashMap;
+import java.util.Map;
/**
* The ModuleProvider is an implementation of a {@link ModuleDefine}.
@@ -55,7 +56,7 @@ public abstract class ModuleProvider {
/**
* @return the module name
*/
- public abstract Class module();
+ public abstract Class extends ModuleDefine> module();
/**
* @return ModuleConfig
@@ -77,6 +78,11 @@ public abstract class ModuleProvider {
*/
public abstract void notifyAfterCompleted() throws ServiceNotProvidedException;
+ /**
+ * @return module names which does this module require?
+ */
+ public abstract String[] requiredModules();
+
/**
* Register a implementation for the service of this module provider.
*/
@@ -110,8 +116,7 @@ public abstract class ModuleProvider {
}
}
- @SuppressWarnings("unchecked")
- public T getService(
+ @SuppressWarnings("unchecked") T getService(
Class serviceType) throws ServiceNotProvidedException {
Service serviceImpl = services.get(serviceType);
if (serviceImpl != null) {
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/Service.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/Service.java
index 18547cece..40612025c 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/Service.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/Service.java
@@ -16,6 +16,7 @@
*
*/
+
package org.apache.skywalking.oap.server.library.module;
/**
@@ -26,4 +27,4 @@ package org.apache.skywalking.oap.server.library.module;
* @author wu-sheng
*/
public interface Service {
-}
\ No newline at end of file
+}
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ServiceNotProvidedRuntimeException.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ServiceNotProvidedRuntimeException.java
index 013537687..340ed78e2 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ServiceNotProvidedRuntimeException.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ServiceNotProvidedRuntimeException.java
@@ -16,10 +16,11 @@
*
*/
+
package org.apache.skywalking.oap.server.library.module;
public class ServiceNotProvidedRuntimeException extends RuntimeException {
public ServiceNotProvidedRuntimeException(String message) {
super(message);
}
-}
\ No newline at end of file
+}
diff --git a/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/BaseModuleA.java b/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/BaseModuleA.java
index ebf50a2a7..74124a273 100644
--- a/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/BaseModuleA.java
+++ b/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/BaseModuleA.java
@@ -33,11 +33,11 @@ public class BaseModuleA extends ModuleDefine {
return new Class[] {ServiceABusiness1.class, ServiceABusiness2.class};
}
- public interface ServiceABusiness1 extends Service {
+ public interface ServiceABusiness1 {
void print();
}
- public interface ServiceABusiness2 extends Service {
+ public interface ServiceABusiness2 {
}
}
diff --git a/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/BaseModuleB.java b/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/BaseModuleB.java
index 1f56a87d6..18a2fae48 100644
--- a/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/BaseModuleB.java
+++ b/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/BaseModuleB.java
@@ -33,11 +33,11 @@ public class BaseModuleB extends ModuleDefine {
return new Class[] {BaseModuleB.ServiceBBusiness1.class, BaseModuleB.ServiceBBusiness2.class};
}
- public interface ServiceBBusiness1 extends Service {
+ public interface ServiceBBusiness1 {
}
- public interface ServiceBBusiness2 extends Service {
+ public interface ServiceBBusiness2 {
}
}
diff --git a/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/ModuleAProvider.java b/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/ModuleAProvider.java
index 52c3b785d..8f3d6e4f0 100644
--- a/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/ModuleAProvider.java
+++ b/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/ModuleAProvider.java
@@ -53,7 +53,7 @@ public class ModuleAProvider extends ModuleProvider {
@Override public void notifyAfterCompleted() {
}
- public class Config extends ModuleConfig {
+ public class Config {
private String host;
public String getHost() {
diff --git a/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/ModuleManagerImpl.java b/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/ModuleManagerImpl.java
deleted file mode 100644
index 1448e70e0..000000000
--- a/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/ModuleManagerImpl.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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.skywalking.oap.server.starter;
-
-import java.util.*;
-import org.apache.skywalking.oap.server.core.CoreModule;
-import org.apache.skywalking.oap.server.core.cluster.ClusterModule;
-import org.apache.skywalking.oap.server.core.storage.StorageModule;
-import org.apache.skywalking.oap.server.library.module.*;
-
-/**
- * @author peng-yongsheng
- */
-public class ModuleManagerImpl implements ModuleManager {
-
- private final ApplicationConfiguration applicationConfiguration;
- private final Map modules;
-
- public ModuleManagerImpl(ApplicationConfiguration applicationConfiguration) {
- this.applicationConfiguration = applicationConfiguration;
- this.modules = new HashMap<>();
- }
-
- @Override
- public void start() throws ServiceNotProvidedException, ModuleConfigException, ProviderNotFoundException, ModuleStartException {
- CoreModule coreModule = new CoreModule();
- ClusterModule clusterModule = new ClusterModule();
- StorageModule storageModule = new StorageModule();
-
- init(coreModule);
- init(clusterModule);
- init(storageModule);
-
- coreModule.provider().start();
- storageModule.provider().start();
- clusterModule.provider().start();
-
- coreModule.provider().notifyAfterCompleted();
- storageModule.provider().notifyAfterCompleted();
- clusterModule.provider().notifyAfterCompleted();
- }
-
- @Override public void init(
- ModuleDefine moduleDefine) throws ServiceNotProvidedException, ModuleConfigException, ProviderNotFoundException {
- if (!applicationConfiguration.has(moduleDefine.name())) {
- throw new ModuleConfigException("Can't found core module configuration, please check the application.yml file.");
- }
-
- moduleDefine.prepare(this, applicationConfiguration.getModuleConfiguration(moduleDefine.name()));
- modules.put(moduleDefine.name(), moduleDefine);
- }
-
- @Override public ModuleDefine find(String moduleName) throws ModuleNotFoundRuntimeException {
- ModuleDefine module = modules.get(moduleName);
- if (module != null)
- return module;
- throw new ModuleNotFoundRuntimeException(moduleName + " missing.");
- }
-}
diff --git a/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/OAPServerStartUp.java b/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/OAPServerStartUp.java
index 668aa5ede..f1e4219c6 100644
--- a/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/OAPServerStartUp.java
+++ b/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/OAPServerStartUp.java
@@ -18,9 +18,9 @@
package org.apache.skywalking.oap.server.starter;
-import java.util.concurrent.TimeUnit;
-import org.apache.skywalking.oap.server.library.module.ApplicationConfiguration;
+import org.apache.skywalking.oap.server.library.module.*;
import org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoader;
+import org.apache.skywalking.oap.server.starter.config.ConfigFileNotFoundException;
import org.slf4j.*;
/**
@@ -32,21 +32,13 @@ public class OAPServerStartUp {
public static void main(String[] args) {
ApplicationConfigLoader configLoader = new ApplicationConfigLoader();
-
+ ModuleManager manager = new ModuleManager();
try {
ApplicationConfiguration applicationConfiguration = configLoader.load();
- ModuleManagerImpl moduleManager = new ModuleManagerImpl(applicationConfiguration);
- moduleManager.start();
- } catch (Throwable e) {
+ manager.init(applicationConfiguration);
+ } catch (ConfigFileNotFoundException | ModuleNotFoundException | ProviderNotFoundException | ServiceNotProvidedException | ModuleConfigException | ModuleStartException e) {
logger.error(e.getMessage(), e);
System.exit(1);
}
-
- logger.info("OAP server start up successful.");
- try {
- TimeUnit.MINUTES.sleep(5);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
}
}
diff --git a/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/config/ApplicationConfigLoader.java b/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/config/ApplicationConfigLoader.java
index 4c40ae839..ea4cafff4 100644
--- a/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/config/ApplicationConfigLoader.java
+++ b/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/config/ApplicationConfigLoader.java
@@ -18,13 +18,18 @@
package org.apache.skywalking.oap.server.starter.config;
-import java.io.*;
-import java.util.*;
import org.apache.skywalking.oap.server.library.module.ApplicationConfiguration;
-import org.apache.skywalking.oap.server.library.util.*;
-import org.slf4j.*;
+import org.apache.skywalking.oap.server.library.util.CollectionUtils;
+import org.apache.skywalking.oap.server.library.util.ResourceUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.yaml.snakeyaml.Yaml;
+import java.io.FileNotFoundException;
+import java.io.Reader;
+import java.util.Map;
+import java.util.Properties;
+
/**
* Initialize collector settings with following sources.
* Use application.yml as primary setting,
@@ -43,6 +48,7 @@ public class ApplicationConfigLoader implements ConfigLoader>> moduleConfig = yaml.loadAs(applicationReader, Map.class);
+ if (CollectionUtils.isNotEmpty(moduleConfig)) {
+ moduleConfig.forEach((moduleName, providerConfig) -> {
+ if (!configuration.has(moduleName)) {
+ logger.warn("The {} module did't define in application.yml, use default", moduleName);
+ ApplicationConfiguration.ModuleConfiguration moduleConfiguration = configuration.addModule(moduleName);
+ providerConfig.forEach((name, propertiesConfig) -> {
+ Properties properties = new Properties();
+ if (propertiesConfig != null) {
+ propertiesConfig.forEach(properties::put);
+ }
+ moduleConfiguration.addProviderConfiguration(name, properties);
+ });
+ }
+ });
+ }
+ } catch (FileNotFoundException e) {
+ throw new ConfigFileNotFoundException(e.getMessage(), e);
+ }
+ }
+
private void overrideConfigBySystemEnv(ApplicationConfiguration configuration) {
for (Map.Entry