Implementation:Apache Dolphinscheduler DataSourceProcessorManager SPI Loading
| Knowledge Sources | |
|---|---|
| Domains | Plugin_Architecture, Service_Discovery |
| Last Updated | 2026-02-10 00:00 GMT |
Overview
Concrete tool for loading and registering datasource plugins at runtime via Java ServiceLoader and the DataSourceProcessorManager/DataSourcePluginManager classes.
Description
DataSourceProcessorManager uses ServiceLoader to discover all DataSourceProcessor implementations on the classpath, storing them in a Map<String, DataSourceProcessor> keyed by database type name. DataSourcePluginManager uses PrioritySPIFactory (a priority-aware SPI loader) to discover all DataSourceChannelFactory implementations and stores the resulting DataSourceChannel instances in a map. Both managers are Spring @Component beans initialized at application startup.
Usage
These managers are used internally by the DolphinScheduler datasource framework. They are automatically initialized by Spring. To add a new plugin, ensure the JAR with @AutoService-annotated classes is on the classpath.
Code Reference
Source Location
- Repository: dolphinscheduler
- File: dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/plugin/DataSourceProcessorManager.java (L32-58)
- File: dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/plugin/DataSourcePluginManager.java (L33-65)
Signature
@Component
public class DataSourceProcessorManager {
private static final Map<String, DataSourceProcessor> dataSourceProcessorMap = new HashMap<>();
@PostConstruct
public void installProcessor(); // loads via ServiceLoader
public static Map<String, DataSourceProcessor> getDataSourceProcessorMap();
}
@Component
public class DataSourcePluginManager {
private final Map<String, DataSourceChannel> datasourceChannelMap = new HashMap<>();
@PostConstruct
public void installPlugin(); // loads via PrioritySPIFactory
public Map<String, DataSourceChannel> getDataSourceChannelMap();
}
Import
import org.apache.dolphinscheduler.plugin.datasource.api.plugin.DataSourceProcessorManager;
import org.apache.dolphinscheduler.plugin.datasource.api.plugin.DataSourcePluginManager;
I/O Contract
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
| Classpath JARs | JAR files | Yes | Plugin JARs with META-INF/services entries |
Outputs
| Name | Type | Description |
|---|---|---|
| dataSourceProcessorMap | Map<String, DataSourceProcessor> | Registry of all discovered processors keyed by DbType name |
| datasourceChannelMap | Map<String, DataSourceChannel> | Registry of all discovered channels keyed by DbType name |
Usage Examples
Processor Registration
// In DataSourceProcessorManager.installProcessor():
ServiceLoader<DataSourceProcessor> serviceLoader =
ServiceLoader.load(DataSourceProcessor.class);
for (DataSourceProcessor processor : serviceLoader) {
dataSourceProcessorMap.put(processor.getDbType().name(), processor);
}
// After loading: map contains {MYSQL -> MySQLDataSourceProcessor, POSTGRESQL -> ...}
Plugin Channel Registration
// In DataSourcePluginManager.installPlugin():
PrioritySPIFactory<DataSourceChannelFactory> prioritySPIFactory =
new PrioritySPIFactory<>(DataSourceChannelFactory.class);
for (Map.Entry<String, DataSourceChannelFactory> entry :
prioritySPIFactory.getSPIMap().entrySet()) {
datasourceChannelMap.put(entry.getKey(), entry.getValue().create());
}
Looking Up a Processor
// Getting a specific processor at runtime
DataSourceProcessor processor =
DataSourceProcessorManager.getDataSourceProcessorMap().get(DbType.MYSQL.name());
ConnectionParam param = processor.createConnectionParams(dto);