|
@@ -1,15 +1,14 @@
|
|
package com.alibaba.otter.canal.client.adapter.es;
|
|
package com.alibaba.otter.canal.client.adapter.es;
|
|
|
|
|
|
import java.net.InetAddress;
|
|
import java.net.InetAddress;
|
|
-import java.util.ArrayList;
|
|
|
|
-import java.util.LinkedHashMap;
|
|
|
|
-import java.util.List;
|
|
|
|
-import java.util.Map;
|
|
|
|
|
|
+import java.util.*;
|
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
import java.util.regex.Pattern;
|
|
|
|
|
|
import javax.sql.DataSource;
|
|
import javax.sql.DataSource;
|
|
|
|
|
|
|
|
+import com.alibaba.otter.canal.client.adapter.es.monitor.ESConfigMonitor;
|
|
import org.elasticsearch.action.search.SearchResponse;
|
|
import org.elasticsearch.action.search.SearchResponse;
|
|
import org.elasticsearch.client.transport.TransportClient;
|
|
import org.elasticsearch.client.transport.TransportClient;
|
|
import org.elasticsearch.common.settings.Settings;
|
|
import org.elasticsearch.common.settings.Settings;
|
|
@@ -37,12 +36,14 @@ import com.alibaba.otter.canal.client.adapter.support.*;
|
|
@SPI("es")
|
|
@SPI("es")
|
|
public class ESAdapter implements OuterAdapter {
|
|
public class ESAdapter implements OuterAdapter {
|
|
|
|
|
|
- private Map<String, ESSyncConfig> esSyncConfig = new LinkedHashMap<>(); // 文件名对应配置
|
|
|
|
- private Map<String, List<ESSyncConfig>> dbTableEsSyncConfig = new LinkedHashMap<>(); // schema-table对应配置
|
|
|
|
|
|
+ private Map<String, ESSyncConfig> esSyncConfig = new ConcurrentHashMap<>(); // 文件名对应配置
|
|
|
|
+ private Map<String, Map<String, ESSyncConfig>> dbTableEsSyncConfig = new ConcurrentHashMap<>(); // schema-table对应配置
|
|
|
|
|
|
- private TransportClient transportClient;
|
|
|
|
|
|
+ private TransportClient transportClient;
|
|
|
|
|
|
- private ESSyncService esSyncService;
|
|
|
|
|
|
+ private ESSyncService esSyncService;
|
|
|
|
+
|
|
|
|
+ private ESConfigMonitor esConfigMonitor;
|
|
|
|
|
|
public TransportClient getTransportClient() {
|
|
public TransportClient getTransportClient() {
|
|
return transportClient;
|
|
return transportClient;
|
|
@@ -56,7 +57,7 @@ public class ESAdapter implements OuterAdapter {
|
|
return esSyncConfig;
|
|
return esSyncConfig;
|
|
}
|
|
}
|
|
|
|
|
|
- public Map<String, List<ESSyncConfig>> getDbTableEsSyncConfig() {
|
|
|
|
|
|
+ public Map<String, Map<String, ESSyncConfig>> getDbTableEsSyncConfig() {
|
|
return dbTableEsSyncConfig;
|
|
return dbTableEsSyncConfig;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -73,7 +74,9 @@ public class ESAdapter implements OuterAdapter {
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
|
|
- for (ESSyncConfig config : esSyncConfig.values()) {
|
|
|
|
|
|
+ for (Map.Entry<String, ESSyncConfig> entry : esSyncConfig.entrySet()) {
|
|
|
|
+ String configName = entry.getKey();
|
|
|
|
+ ESSyncConfig config = entry.getValue();
|
|
SchemaItem schemaItem = SqlParser.parse(config.getEsMapping().getSql());
|
|
SchemaItem schemaItem = SqlParser.parse(config.getEsMapping().getSql());
|
|
config.getEsMapping().setSchemaItem(schemaItem);
|
|
config.getEsMapping().setSchemaItem(schemaItem);
|
|
|
|
|
|
@@ -89,9 +92,9 @@ public class ESAdapter implements OuterAdapter {
|
|
String schema = matcher.group(2);
|
|
String schema = matcher.group(2);
|
|
|
|
|
|
schemaItem.getAliasTableItems().values().forEach(tableItem -> {
|
|
schemaItem.getAliasTableItems().values().forEach(tableItem -> {
|
|
- List<ESSyncConfig> esSyncConfigs = dbTableEsSyncConfig
|
|
|
|
- .computeIfAbsent(schema + "-" + tableItem.getTableName(), k -> new ArrayList<>());
|
|
|
|
- esSyncConfigs.add(config);
|
|
|
|
|
|
+ Map<String, ESSyncConfig> esSyncConfigMap = dbTableEsSyncConfig
|
|
|
|
+ .computeIfAbsent(schema + "-" + tableItem.getTableName(), k -> new HashMap<>());
|
|
|
|
+ esSyncConfigMap.put(configName, config);
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
@@ -108,6 +111,9 @@ public class ESAdapter implements OuterAdapter {
|
|
}
|
|
}
|
|
ESTemplate esTemplate = new ESTemplate(transportClient);
|
|
ESTemplate esTemplate = new ESTemplate(transportClient);
|
|
esSyncService = new ESSyncService(esTemplate);
|
|
esSyncService = new ESSyncService(esTemplate);
|
|
|
|
+
|
|
|
|
+ esConfigMonitor = new ESConfigMonitor();
|
|
|
|
+ esConfigMonitor.init(this);
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
throw new RuntimeException(e);
|
|
throw new RuntimeException(e);
|
|
}
|
|
}
|
|
@@ -117,8 +123,8 @@ public class ESAdapter implements OuterAdapter {
|
|
public void sync(Dml dml) {
|
|
public void sync(Dml dml) {
|
|
String database = dml.getDatabase();
|
|
String database = dml.getDatabase();
|
|
String table = dml.getTable();
|
|
String table = dml.getTable();
|
|
- List<ESSyncConfig> esSyncConfigs = dbTableEsSyncConfig.get(database + "-" + table);
|
|
|
|
- esSyncService.sync(esSyncConfigs, dml);
|
|
|
|
|
|
+ Map<String, ESSyncConfig> configMap = dbTableEsSyncConfig.get(database + "-" + table);
|
|
|
|
+ esSyncService.sync(configMap.values(), dml);
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -192,6 +198,10 @@ public class ESAdapter implements OuterAdapter {
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public String getDestination(String task) {
|
|
public String getDestination(String task) {
|
|
|
|
+ if (esConfigMonitor != null) {
|
|
|
|
+ esConfigMonitor.destroy();
|
|
|
|
+ }
|
|
|
|
+
|
|
ESSyncConfig config = esSyncConfig.get(task);
|
|
ESSyncConfig config = esSyncConfig.get(task);
|
|
if (config != null) {
|
|
if (config != null) {
|
|
return config.getDestination();
|
|
return config.getDestination();
|