OrchestrationFacade.java 4.7 KB
Newer Older
T
terrymanu 已提交
1 2 3 4 5 6
package io.shardingjdbc.orchestration.internal;

import io.shardingjdbc.core.api.config.MasterSlaveRuleConfiguration;
import io.shardingjdbc.core.api.config.ShardingRuleConfiguration;
import io.shardingjdbc.core.jdbc.core.datasource.MasterSlaveDataSource;
import io.shardingjdbc.core.jdbc.core.datasource.ShardingDataSource;
T
terrymanu 已提交
7
import io.shardingjdbc.orchestration.api.config.OrchestrationConfiguration;
T
terrymanu 已提交
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
import io.shardingjdbc.orchestration.internal.config.ConfigurationService;
import io.shardingjdbc.orchestration.internal.state.InstanceStateService;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;

/**
 * Orchestration service facade.
 *
 * @author zhangliang
 */
public final class OrchestrationFacade {
    
T
terrymanu 已提交
24 25
    private final OrchestrationConfiguration config;
    
T
terrymanu 已提交
26 27 28 29
    private final ConfigurationService configurationService;
    
    private final InstanceStateService instanceStateService;
    
T
terrymanu 已提交
30 31 32 33
    public OrchestrationFacade(final OrchestrationConfiguration config) {
        this.config = config;
        configurationService = new ConfigurationService(config);
        instanceStateService = new InstanceStateService(config);
T
terrymanu 已提交
34 35 36 37
    }
    
    /**
     * Initial all orchestration actions for sharding data source.
T
terrymanu 已提交
38 39 40
     *
     * @param dataSourceMap data source map
     * @param shardingRuleConfig sharding rule configuration
T
terrymanu 已提交
41 42 43
     * @param props sharding properties
     * @param shardingDataSource sharding datasource
     */
T
terrymanu 已提交
44 45
    public void initShardingOrchestration(
            final Map<String, DataSource> dataSourceMap, final ShardingRuleConfiguration shardingRuleConfig, final Properties props, final ShardingDataSource shardingDataSource) {
T
terrymanu 已提交
46
        config.getRegistryCenter().init();
T
terrymanu 已提交
47 48
        if (shardingRuleConfig.getMasterSlaveRuleConfigs().isEmpty()) {
            reviseShardingRuleConfigurationForMasterSlave(dataSourceMap, shardingRuleConfig);
T
terrymanu 已提交
49
        }
T
terrymanu 已提交
50
        configurationService.persistShardingConfiguration(getActualDataSourceMapForMasterSlave(dataSourceMap), shardingRuleConfig, props, shardingDataSource);
T
terrymanu 已提交
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
        instanceStateService.persistShardingInstanceOnline(shardingDataSource);
    }
    
    private void reviseShardingRuleConfigurationForMasterSlave(final Map<String, DataSource> dataSourceMap, final ShardingRuleConfiguration shardingRuleConfig) {
        for (Entry<String, DataSource> entry : dataSourceMap.entrySet()) {
            if (entry.getValue() instanceof MasterSlaveDataSource) {
                MasterSlaveDataSource masterSlaveDataSource = (MasterSlaveDataSource) entry.getValue();
                shardingRuleConfig.getMasterSlaveRuleConfigs().add(getMasterSlaveRuleConfiguration(masterSlaveDataSource));
            }
        }
    }
    
    private Map<String, DataSource> getActualDataSourceMapForMasterSlave(final Map<String, DataSource> dataSourceMap) {
        Map<String, DataSource> result = new HashMap<>();
        for (Entry<String, DataSource> entry : dataSourceMap.entrySet()) {
            if (entry.getValue() instanceof MasterSlaveDataSource) {
                MasterSlaveDataSource masterSlaveDataSource = (MasterSlaveDataSource) entry.getValue();
                result.putAll(masterSlaveDataSource.getAllDataSources());
            } else {
                result.put(entry.getKey(), entry.getValue());
            }
        }
        return result;
    }
    
    private MasterSlaveRuleConfiguration getMasterSlaveRuleConfiguration(final MasterSlaveDataSource masterSlaveDataSource) {
        MasterSlaveRuleConfiguration result = new MasterSlaveRuleConfiguration();
        result.setName(masterSlaveDataSource.getMasterSlaveRule().getName());
        result.setMasterDataSourceName(masterSlaveDataSource.getMasterSlaveRule().getMasterDataSourceName());
        result.setSlaveDataSourceNames(masterSlaveDataSource.getMasterSlaveRule().getSlaveDataSourceMap().keySet());
        result.setLoadBalanceAlgorithmClassName(masterSlaveDataSource.getMasterSlaveRule().getStrategy().getClass().getName());
        return result;
    }
    
    /**
     * Initial all orchestration actions for master-slave data source.
T
terrymanu 已提交
87 88 89
     *
     * @param dataSourceMap data source map
     * @param masterSlaveRuleConfig sharding rule configuration
T
terrymanu 已提交
90 91
     * @param masterSlaveDataSource master-slave datasource
     */
T
terrymanu 已提交
92 93
    public void initMasterSlaveOrchestration(
            final Map<String, DataSource> dataSourceMap, final MasterSlaveRuleConfiguration masterSlaveRuleConfig, final MasterSlaveDataSource masterSlaveDataSource) {
T
terrymanu 已提交
94
        config.getRegistryCenter().init();
T
terrymanu 已提交
95
        configurationService.persistMasterSlaveConfiguration(dataSourceMap, masterSlaveRuleConfig, masterSlaveDataSource);
T
terrymanu 已提交
96 97 98
        instanceStateService.persistMasterSlaveInstanceOnline(masterSlaveDataSource);
    }
}