<T extends ConfigInstance> ConfigHandle<T> subscribe(Class<T> configClass, String configId, ConfigSource source, TimingValues timingValues) {
        checkStateBeforeSubscribe();
        ConfigKey<T> configKey = new ConfigKey<>(configClass, configId);
        ConfigSubscription<T> sub = ConfigSubscription.get(configKey, requesters, source, timingValues);
        ConfigHandle<T> handle = new ConfigHandle<>(sub);
        subscribeAndHandleErrors(sub, configKey, handle, timingValues);
        return handle;
    }
Subscribes on the given type of {@link ConfigInstance} with the given config id and subscribe timeout.

The method blocks until the first config is ready to be fetched with {@link #nextConfig(boolean)}.

@param configClass The class, typically generated from a def-file using config-class-plugin
@param configId    Identifies the service in vespa-services.xml, or possibly raw:, file:, dir: or jar: type config which addresses config locally.
@param timeoutMillis The time to wait for a config to become available, in milliseconds
@return a ConfigHandle
config/src/main/java/com/yahoo/config/subscription/ConfigSubscriber.java