mirror of
https://github.com/alibaba/canal.git
synced 2026-11-04 00:30:15 +08:00
code optimization
This commit is contained in:
@@ -10,6 +10,9 @@ import java.time.*;
|
|||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
import java.util.concurrent.SynchronousQueue;
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
@@ -106,6 +109,40 @@ public class Util {
|
|||||||
return column;
|
return column;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static ThreadPoolExecutor newFixedThreadPool(int nThreads, long keepAliveTime) {
|
||||||
|
return new ThreadPoolExecutor(nThreads,
|
||||||
|
nThreads,
|
||||||
|
keepAliveTime,
|
||||||
|
TimeUnit.MILLISECONDS,
|
||||||
|
new SynchronousQueue<>(),
|
||||||
|
(r, exe) -> {
|
||||||
|
if (!exe.isShutdown()) {
|
||||||
|
try {
|
||||||
|
exe.getQueue().put(r);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ThreadPoolExecutor newSingleThreadExecutor(long keepAliveTime) {
|
||||||
|
return new ThreadPoolExecutor(1,
|
||||||
|
1,
|
||||||
|
keepAliveTime,
|
||||||
|
TimeUnit.MILLISECONDS,
|
||||||
|
new SynchronousQueue<>(),
|
||||||
|
(r, exe) -> {
|
||||||
|
if (!exe.isShutdown()) {
|
||||||
|
try {
|
||||||
|
exe.getQueue().put(r);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public final static String timeZone; // 当前时区
|
public final static String timeZone; // 当前时区
|
||||||
private static DateTimeZone dateTimeZone;
|
private static DateTimeZone dateTimeZone;
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,8 @@
|
|||||||
package com.alibaba.otter.canal.client.adapter.es.service;
|
package com.alibaba.otter.canal.client.adapter.es.service;
|
||||||
|
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Future;
|
|
||||||
import java.util.concurrent.SynchronousQueue;
|
|
||||||
import java.util.concurrent.ThreadPoolExecutor;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.atomic.AtomicLong;
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
@@ -121,21 +114,7 @@ public class ESEtlService {
|
|||||||
if (cnt >= 10000) {
|
if (cnt >= 10000) {
|
||||||
int threadCount = 3; // 从配置读取默认为3
|
int threadCount = 3; // 从配置读取默认为3
|
||||||
long perThreadCnt = cnt / threadCount;
|
long perThreadCnt = cnt / threadCount;
|
||||||
ExecutorService executor = new ThreadPoolExecutor(threadCount,
|
ExecutorService executor = Util.newFixedThreadPool(threadCount, 5000L);
|
||||||
threadCount,
|
|
||||||
5000L,
|
|
||||||
TimeUnit.MILLISECONDS,
|
|
||||||
new SynchronousQueue<>(),
|
|
||||||
(r, exe) -> {
|
|
||||||
if (!exe.isShutdown()) {
|
|
||||||
try {
|
|
||||||
exe.getQueue().put(r);
|
|
||||||
} catch (InterruptedException e1) {
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
List<Future<Boolean>> futures = new ArrayList<>(threadCount);
|
|
||||||
for (int i = 0; i < threadCount; i++) {
|
for (int i = 0; i < threadCount; i++) {
|
||||||
long offset = i * perThreadCnt;
|
long offset = i * perThreadCnt;
|
||||||
Long size = null;
|
Long size = null;
|
||||||
@@ -148,16 +127,13 @@ public class ESEtlService {
|
|||||||
} else {
|
} else {
|
||||||
sqlFinal = sql + " LIMIT " + offset + "," + cnt;
|
sqlFinal = sql + " LIMIT " + offset + "," + cnt;
|
||||||
}
|
}
|
||||||
Future<Boolean> future = executor
|
executor.execute(() -> executeSqlImport(dataSource, sqlFinal, mapping, impCount, errMsg));
|
||||||
.submit(() -> executeSqlImport(dataSource, sqlFinal, mapping, impCount, errMsg));
|
|
||||||
futures.add(future);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Future<Boolean> future : futures) {
|
|
||||||
future.get();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
executor.shutdown();
|
executor.shutdown();
|
||||||
|
while (!executor.awaitTermination(3, TimeUnit.SECONDS)) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
executeSqlImport(dataSource, sql, mapping, impCount, errMsg);
|
executeSqlImport(dataSource, sql, mapping, impCount, errMsg);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -151,21 +151,7 @@ public class HbaseEtlService {
|
|||||||
if (cnt >= 10000) {
|
if (cnt >= 10000) {
|
||||||
int threadCount = 3;
|
int threadCount = 3;
|
||||||
long perThreadCnt = cnt / threadCount;
|
long perThreadCnt = cnt / threadCount;
|
||||||
ExecutorService executor = new ThreadPoolExecutor(threadCount,
|
ExecutorService executor = Util.newFixedThreadPool(threadCount, 5000L);
|
||||||
threadCount,
|
|
||||||
5000L,
|
|
||||||
TimeUnit.MILLISECONDS,
|
|
||||||
new SynchronousQueue<>(),
|
|
||||||
(r, exe) -> {
|
|
||||||
if (!exe.isShutdown()) {
|
|
||||||
try {
|
|
||||||
exe.getQueue().put(r);
|
|
||||||
} catch (InterruptedException e1) {
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
List<Future<Boolean>> futures = new ArrayList<>(threadCount);
|
|
||||||
for (int i = 0; i < threadCount; i++) {
|
for (int i = 0; i < threadCount; i++) {
|
||||||
long offset = i * perThreadCnt;
|
long offset = i * perThreadCnt;
|
||||||
Long size = null;
|
Long size = null;
|
||||||
@@ -178,16 +164,14 @@ public class HbaseEtlService {
|
|||||||
} else {
|
} else {
|
||||||
sqlFinal = sql + " LIMIT " + offset + "," + cnt;
|
sqlFinal = sql + " LIMIT " + offset + "," + cnt;
|
||||||
}
|
}
|
||||||
Future<Boolean> future = executor.submit(
|
executor.submit(
|
||||||
() -> executeSqlImport(ds, sqlFinal, hbaseMapping, hbaseTemplate, successCount, errMsg));
|
() -> executeSqlImport(ds, sqlFinal, hbaseMapping, hbaseTemplate, successCount, errMsg));
|
||||||
futures.add(future);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Future<Boolean> future : futures) {
|
|
||||||
future.get();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
executor.shutdown();
|
executor.shutdown();
|
||||||
|
while (!executor.awaitTermination(3, TimeUnit.SECONDS)) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
executeSqlImport(ds, sql, hbaseMapping, hbaseTemplate, successCount, errMsg);
|
executeSqlImport(ds, sql, hbaseMapping, hbaseTemplate, successCount, errMsg);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,9 @@ package com.alibaba.otter.canal.adapter.launcher.loader;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.*;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@@ -14,6 +16,7 @@ import com.alibaba.otter.canal.client.adapter.OuterAdapter;
|
|||||||
import com.alibaba.otter.canal.client.adapter.support.CanalClientConfig;
|
import com.alibaba.otter.canal.client.adapter.support.CanalClientConfig;
|
||||||
import com.alibaba.otter.canal.client.adapter.support.Dml;
|
import com.alibaba.otter.canal.client.adapter.support.Dml;
|
||||||
import com.alibaba.otter.canal.client.adapter.support.MessageUtil;
|
import com.alibaba.otter.canal.client.adapter.support.MessageUtil;
|
||||||
|
import com.alibaba.otter.canal.client.adapter.support.Util;
|
||||||
import com.alibaba.otter.canal.protocol.FlatMessage;
|
import com.alibaba.otter.canal.protocol.FlatMessage;
|
||||||
import com.alibaba.otter.canal.protocol.Message;
|
import com.alibaba.otter.canal.protocol.Message;
|
||||||
|
|
||||||
@@ -40,21 +43,7 @@ public abstract class AbstractCanalAdapterWorker {
|
|||||||
|
|
||||||
public AbstractCanalAdapterWorker(List<List<OuterAdapter>> canalOuterAdapters){
|
public AbstractCanalAdapterWorker(List<List<OuterAdapter>> canalOuterAdapters){
|
||||||
this.canalOuterAdapters = canalOuterAdapters;
|
this.canalOuterAdapters = canalOuterAdapters;
|
||||||
int adaptersSize = canalOuterAdapters.size();
|
this.groupInnerExecutorService = Util.newFixedThreadPool(canalOuterAdapters.size(), 5000L);
|
||||||
this.groupInnerExecutorService = new ThreadPoolExecutor(adaptersSize,
|
|
||||||
adaptersSize,
|
|
||||||
5000L,
|
|
||||||
TimeUnit.MILLISECONDS,
|
|
||||||
new SynchronousQueue<>(),
|
|
||||||
(r, exe) -> {
|
|
||||||
if (!exe.isShutdown()) {
|
|
||||||
try {
|
|
||||||
exe.getQueue().put(r);
|
|
||||||
} catch (InterruptedException e1) {
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
syncSwitch = (SyncSwitch) SpringContext.getBean(SyncSwitch.class);
|
syncSwitch = (SyncSwitch) SpringContext.getBean(SyncSwitch.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
package com.alibaba.otter.canal.adapter.launcher.loader;
|
package com.alibaba.otter.canal.adapter.launcher.loader;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.*;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.apache.kafka.common.errors.WakeupException;
|
import org.apache.kafka.common.errors.WakeupException;
|
||||||
|
|
||||||
import com.alibaba.otter.canal.client.adapter.OuterAdapter;
|
import com.alibaba.otter.canal.client.adapter.OuterAdapter;
|
||||||
import com.alibaba.otter.canal.client.adapter.support.CanalClientConfig;
|
import com.alibaba.otter.canal.client.adapter.support.CanalClientConfig;
|
||||||
|
import com.alibaba.otter.canal.client.adapter.support.Util;
|
||||||
import com.alibaba.otter.canal.client.kafka.KafkaCanalConnector;
|
import com.alibaba.otter.canal.client.kafka.KafkaCanalConnector;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -47,17 +49,7 @@ public class CanalAdapterKafkaWorker extends AbstractCanalAdapterWorker {
|
|||||||
// ignore
|
// ignore
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ExecutorService workerExecutor = new ThreadPoolExecutor(1, 1,
|
ExecutorService workerExecutor = Util.newSingleThreadExecutor(5000L);
|
||||||
5000L, TimeUnit.MILLISECONDS,
|
|
||||||
new SynchronousQueue<>(), (r, exe) -> {
|
|
||||||
if (!exe.isShutdown()) {
|
|
||||||
try {
|
|
||||||
exe.getQueue().put(r);
|
|
||||||
} catch (InterruptedException e1) {
|
|
||||||
//ignore
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
int retry = canalClientConfig.getRetries() == null
|
int retry = canalClientConfig.getRetries() == null
|
||||||
|| canalClientConfig.getRetries() == 0 ? 1 : canalClientConfig.getRetries();
|
|| canalClientConfig.getRetries() == 0 ? 1 : canalClientConfig.getRetries();
|
||||||
long timeout = canalClientConfig.getTimeout() == null ? 30000 : canalClientConfig.getTimeout(); // 默认超时30秒
|
long timeout = canalClientConfig.getTimeout() == null ? 30000 : canalClientConfig.getTimeout(); // 默认超时30秒
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
package com.alibaba.otter.canal.adapter.launcher.loader;
|
package com.alibaba.otter.canal.adapter.launcher.loader;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.*;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
|
||||||
import org.apache.kafka.common.errors.WakeupException;
|
import org.apache.kafka.common.errors.WakeupException;
|
||||||
|
|
||||||
import com.alibaba.otter.canal.client.adapter.OuterAdapter;
|
import com.alibaba.otter.canal.client.adapter.OuterAdapter;
|
||||||
import com.alibaba.otter.canal.client.adapter.support.CanalClientConfig;
|
import com.alibaba.otter.canal.client.adapter.support.CanalClientConfig;
|
||||||
|
import com.alibaba.otter.canal.client.adapter.support.Util;
|
||||||
import com.alibaba.otter.canal.client.rocketmq.RocketMQCanalConnector;
|
import com.alibaba.otter.canal.client.rocketmq.RocketMQCanalConnector;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,20 +49,7 @@ public class CanalAdapterRocketMQWorker extends AbstractCanalAdapterWorker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ExecutorService workerExecutor = new ThreadPoolExecutor(1,
|
ExecutorService workerExecutor = Util.newSingleThreadExecutor(5000L);
|
||||||
1,
|
|
||||||
5000L,
|
|
||||||
TimeUnit.MILLISECONDS,
|
|
||||||
new SynchronousQueue<>(),
|
|
||||||
(r, exe) -> {
|
|
||||||
if (!exe.isShutdown()) {
|
|
||||||
try {
|
|
||||||
exe.getQueue().put(r);
|
|
||||||
} catch (InterruptedException e1) {
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
int retry = canalClientConfig.getRetries() == null
|
int retry = canalClientConfig.getRetries() == null
|
||||||
|| canalClientConfig.getRetries() == 0 ? 1 : canalClientConfig.getRetries();
|
|| canalClientConfig.getRetries() == 0 ? 1 : canalClientConfig.getRetries();
|
||||||
long timeout = canalClientConfig.getTimeout() == null ? 30000 : canalClientConfig.getTimeout(); // 默认超时30秒
|
long timeout = canalClientConfig.getTimeout() == null ? 30000 : canalClientConfig.getTimeout(); // 默认超时30秒
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ import java.util.ArrayList;
|
|||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.*;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.concurrent.atomic.AtomicLong;
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
|
|
||||||
@@ -76,21 +77,7 @@ public class RdbEtlService {
|
|||||||
if (cnt >= 10000) {
|
if (cnt >= 10000) {
|
||||||
int threadCount = 3;
|
int threadCount = 3;
|
||||||
long perThreadCnt = cnt / threadCount;
|
long perThreadCnt = cnt / threadCount;
|
||||||
ExecutorService executor = new ThreadPoolExecutor(threadCount,
|
ExecutorService executor = Util.newFixedThreadPool(threadCount, 5000L);
|
||||||
threadCount,
|
|
||||||
5000L,
|
|
||||||
TimeUnit.MILLISECONDS,
|
|
||||||
new SynchronousQueue<>(),
|
|
||||||
(r, exe) -> {
|
|
||||||
if (!exe.isShutdown()) {
|
|
||||||
try {
|
|
||||||
exe.getQueue().put(r);
|
|
||||||
} catch (InterruptedException e1) {
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
List<Future<Boolean>> futures = new ArrayList<>(threadCount);
|
|
||||||
for (int i = 0; i < threadCount; i++) {
|
for (int i = 0; i < threadCount; i++) {
|
||||||
long offset = i * perThreadCnt;
|
long offset = i * perThreadCnt;
|
||||||
Long size = null;
|
Long size = null;
|
||||||
@@ -103,16 +90,14 @@ public class RdbEtlService {
|
|||||||
} else {
|
} else {
|
||||||
sqlFinal = sql + " LIMIT " + offset + "," + cnt;
|
sqlFinal = sql + " LIMIT " + offset + "," + cnt;
|
||||||
}
|
}
|
||||||
Future<Boolean> future = executor
|
executor
|
||||||
.submit(() -> executeSqlImport(srcDS, targetDS, sqlFinal, dbMapping, successCount, errMsg));
|
.execute(() -> executeSqlImport(srcDS, targetDS, sqlFinal, dbMapping, successCount, errMsg));
|
||||||
futures.add(future);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Future<Boolean> future : futures) {
|
|
||||||
future.get();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
executor.shutdown();
|
executor.shutdown();
|
||||||
|
while (!executor.awaitTermination(3, TimeUnit.SECONDS)) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
executeSqlImport(srcDS, targetDS, sql.toString(), dbMapping, successCount, errMsg);
|
executeSqlImport(srcDS, targetDS, sql.toString(), dbMapping, successCount, errMsg);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user