Search in sources :

Example 1 with BatchExecutor

use of com.alibaba.otter.canal.client.adapter.phoenix.support.BatchExecutor in project canal by alibaba.

the class PhoenixSyncService method sync.

/**
 * 批量同步回调
 *
 * @param dmls     批量 DML
 * @param function 回调方法
 */
private void sync(List<Dml> dmls, Function<Dml, Boolean> function) {
    try {
        boolean toExecute = false;
        for (Dml dml : dmls) {
            if (!toExecute) {
                toExecute = function.apply(dml);
            } else {
                function.apply(dml);
            }
        }
        if (toExecute) {
            List<Future<Boolean>> futures = new ArrayList<>();
            for (int i = 0; i < threads; i++) {
                int j = i;
                if (dmlsPartition[j].isEmpty()) {
                    // bypass
                    continue;
                }
                futures.add(executorThreads[i].submit(() -> {
                    try {
                        dmlsPartition[j].forEach(syncItem -> sync(batchExecutors[j], syncItem.config, syncItem.singleDml));
                        // 相对于RDB同步 少了  dmlsPartition[j].clear();
                        // 在 try catch中获取异常后再次执行一次batchExecutors[j].commit()
                        batchExecutors[j].commit();
                        return true;
                    } catch (Throwable e) {
                        batchExecutors[j].rollback();
                        if (!e.getClass().getName().endsWith("ColumnNotFoundException") && !e.getClass().getName().endsWith("TableNotFoundException")) {
                            throw new RuntimeException(e);
                        }
                        logger.info("table or column not found: " + e.getMessage());
                        boolean synced = false;
                        for (SyncItem syncItem : dmlsPartition[j]) {
                            if (PhoenixEtlService.syncSchema(batchExecutors[j].getConn(), syncItem.config)) {
                                synced = true;
                            }
                        }
                        if (!synced) {
                            throw new RuntimeException(e);
                        }
                        dmlsPartition[j].forEach(syncItem -> sync(batchExecutors[j], syncItem.config, syncItem.singleDml));
                        try {
                            batchExecutors[j].commit();
                            return true;
                        } catch (Throwable e1) {
                            batchExecutors[j].rollback();
                            throw new RuntimeException(e1);
                        }
                    } finally {
                        dmlsPartition[j].clear();
                    }
                }));
            }
            futures.forEach(future -> {
                try {
                    future.get();
                } catch (ExecutionException | InterruptedException e) {
                    throw new RuntimeException(e);
                }
            });
        }
    } finally {
        for (BatchExecutor batchExecutor : batchExecutors) {
            if (batchExecutor != null) {
                batchExecutor.close();
            }
        }
    }
}
Also used : BatchExecutor(com.alibaba.otter.canal.client.adapter.phoenix.support.BatchExecutor) StringUtils(org.apache.commons.lang.StringUtils) java.util(java.util) Connection(java.sql.Connection) SerializerFeature(com.alibaba.fastjson.serializer.SerializerFeature) Util(com.alibaba.otter.canal.client.adapter.support.Util) Dml(com.alibaba.otter.canal.client.adapter.support.Dml) LoggerFactory(org.slf4j.LoggerFactory) SQLName(com.alibaba.druid.sql.ast.SQLName) DbMapping(com.alibaba.otter.canal.client.adapter.phoenix.config.MappingConfig.DbMapping) ParserException(com.alibaba.druid.sql.parser.ParserException) Function(java.util.function.Function) SQLException(java.sql.SQLException) SQLUtils(com.alibaba.druid.sql.SQLUtils) TypeUtil(com.alibaba.otter.canal.client.adapter.phoenix.support.TypeUtil) Logger(org.slf4j.Logger) java.util.concurrent(java.util.concurrent) ConfigurationManager(com.alibaba.otter.canal.client.adapter.phoenix.config.ConfigurationManager) MappingConfig(com.alibaba.otter.canal.client.adapter.phoenix.config.MappingConfig) SyncUtil(com.alibaba.otter.canal.client.adapter.phoenix.support.SyncUtil) JSON(com.alibaba.fastjson.JSON) SingleDml(com.alibaba.otter.canal.client.adapter.phoenix.support.SingleDml) JdbcConstants(com.alibaba.druid.util.JdbcConstants) SQLStatement(com.alibaba.druid.sql.ast.SQLStatement) ResultSetMetaData(java.sql.ResultSetMetaData) com.alibaba.druid.sql.ast.statement(com.alibaba.druid.sql.ast.statement) BatchExecutor(com.alibaba.otter.canal.client.adapter.phoenix.support.BatchExecutor) Dml(com.alibaba.otter.canal.client.adapter.support.Dml) SingleDml(com.alibaba.otter.canal.client.adapter.phoenix.support.SingleDml)

Aggregations

SQLUtils (com.alibaba.druid.sql.SQLUtils)1 SQLName (com.alibaba.druid.sql.ast.SQLName)1 SQLStatement (com.alibaba.druid.sql.ast.SQLStatement)1 com.alibaba.druid.sql.ast.statement (com.alibaba.druid.sql.ast.statement)1 ParserException (com.alibaba.druid.sql.parser.ParserException)1 JdbcConstants (com.alibaba.druid.util.JdbcConstants)1 JSON (com.alibaba.fastjson.JSON)1 SerializerFeature (com.alibaba.fastjson.serializer.SerializerFeature)1 ConfigurationManager (com.alibaba.otter.canal.client.adapter.phoenix.config.ConfigurationManager)1 MappingConfig (com.alibaba.otter.canal.client.adapter.phoenix.config.MappingConfig)1 DbMapping (com.alibaba.otter.canal.client.adapter.phoenix.config.MappingConfig.DbMapping)1 BatchExecutor (com.alibaba.otter.canal.client.adapter.phoenix.support.BatchExecutor)1 SingleDml (com.alibaba.otter.canal.client.adapter.phoenix.support.SingleDml)1 SyncUtil (com.alibaba.otter.canal.client.adapter.phoenix.support.SyncUtil)1 TypeUtil (com.alibaba.otter.canal.client.adapter.phoenix.support.TypeUtil)1 Dml (com.alibaba.otter.canal.client.adapter.support.Dml)1 Util (com.alibaba.otter.canal.client.adapter.support.Util)1 Connection (java.sql.Connection)1 ResultSetMetaData (java.sql.ResultSetMetaData)1 SQLException (java.sql.SQLException)1