@Override
    public void notifyAfterCompleted() throws ModuleStartException {
        try {
            if (!RunningMode.isInitMode()) {
                grpcServer.start();
                httpServer.start();
                remoteClientManager.start();
            }
        } catch (ServerException e) {
            throw new ModuleStartException(e.getMessage(), e);
        }
        PersistenceTimer.INSTANCE.start(getManager(), moduleConfig);

        if (moduleConfig.isEnableDataKeeperExecutor()) {
            DataTTLKeeperTimer.INSTANCE.start(getManager(), moduleConfig);
        }

        CacheUpdateTimer.INSTANCE.start(getManager(), moduleConfig.getMetricsDataTTL());

        try {
            new UITemplateInitializer(getManager()).initAll();
        } catch (IOException e) {
            throw new ModuleStartException(e.getMessage(), e);
        }

        try {
            new UIMenuInitializer(getManager()).init();
        } catch (IOException e) {
            throw new ModuleStartException(e.getMessage(), e);
        }
        hierarchyService.startAutoMatchingServiceHierarchy();

        watermarkWatcher.start(getManager().find(TelemetryModule.NAME).provider().getService(MetricsCollector.class));
    }
Core module provider includes the recommended and default implementations of {@link CoreModule#services()}. All
services with these default implementations are widely used including data receiver, data analysis, streaming
process, storage and query.
<p>
NOTICE: In our experience, no one should re-implement the core module service implementations, unless they are very
familiar with all mechanisms of SkyWalking.
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java