From e7086415f86d86794aa131cb5944e40a5666c89f Mon Sep 17 00:00:00 2001 From: machey Date: Sun, 11 Nov 2018 19:44:30 +0800 Subject: [PATCH] =?UTF-8?q?rdb=E4=B8=93=E7=94=A8=E7=9A=84=E7=9A=84ClassExt?= =?UTF-8?q?ensionLoader=EF=BC=8C=E9=BB=98=E8=AE=A4canal=20client=20logger?= =?UTF-8?q?=20example=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/support/ExtensionLoader.java | 53 ++++++++++++++++++- .../launcher/src/main/assembly/dev.xml | 8 +-- .../launcher/src/main/bin/startup.sh | 2 - .../launcher/loader/CanalAdapterLoader.java | 2 +- .../src/main/resources/application.yml | 14 ++--- 5 files changed, 63 insertions(+), 16 deletions(-) diff --git a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/ExtensionLoader.java b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/ExtensionLoader.java index ce7de834..5a09d27f 100644 --- a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/ExtensionLoader.java +++ b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/ExtensionLoader.java @@ -40,6 +40,8 @@ public class ExtensionLoader { private static final ConcurrentMap, Object> EXTENSION_INSTANCES = new ConcurrentHashMap<>(); + private static final ConcurrentMap EXTENSION_KEY_INSTANCES = new ConcurrentHashMap<>(); + private final Class type; private final String classLoaderPolicy; @@ -116,6 +118,30 @@ public class ExtensionLoader { return (T) instance; } + @SuppressWarnings("unchecked") + public T getExtension(String name, String key) { + if (name == null || name.length() == 0) throw new IllegalArgumentException("Extension name == null"); + if ("true".equals(name)) { + return getDefaultExtension(); + } + Holder holder = cachedInstances.get(name + "-" + key); + if (holder == null) { + cachedInstances.putIfAbsent(name + "-" + key, new Holder<>()); + holder = cachedInstances.get(name + "-" + key); + } + Object instance = holder.get(); + if (instance == null) { + synchronized (holder) { + instance = holder.get(); + if (instance == null) { + instance = createExtension(name, key); + holder.set(instance); + } + } + } + return (T) instance; + } + /** * 返回缺省的扩展,如果没有设置则返回null */ @@ -149,14 +175,19 @@ public class ExtensionLoader { } @SuppressWarnings("unchecked") - public T newInstance(String name) { + private T createExtension(String name, String key) { Class clazz = getExtensionClasses().get(name); if (clazz == null) { throw new IllegalStateException("Extension instance(name: " + name + ", class: " + type + ") could not be instantiated: class could not be found"); } try { - return (T) clazz.newInstance(); + T instance = (T) EXTENSION_KEY_INSTANCES.get(name + "-" + key); + if (instance == null) { + EXTENSION_KEY_INSTANCES.putIfAbsent(name + "-" + key, clazz.newInstance()); + instance = (T) EXTENSION_KEY_INSTANCES.get(name + "-" + key); + } + return instance; } catch (Throwable t) { throw new IllegalStateException("Extension instance(name: " + name + ", class: " + type + ") could not be instantiated: " + t.getMessage(), @@ -164,6 +195,24 @@ public class ExtensionLoader { } } + @SuppressWarnings("unchecked") + // public T newInstance(String name) { + // Class clazz = getExtensionClasses().get(name); + // if (clazz == null) { + // throw new IllegalStateException("Extension instance(name: " + name + ", + // class: " + type + // + ") could not be instantiated: class could not be found"); + // } + // try { + // return (T) clazz.newInstance(); + // } catch (Throwable t) { + // throw new IllegalStateException("Extension instance(name: " + name + ", + // class: " + type + // + ") could not be instantiated: " + t.getMessage(), + // t); + // } + // } + private Map> getExtensionClasses() { Map> classes = cachedClasses.get(); if (classes == null) { diff --git a/client-adapter/launcher/src/main/assembly/dev.xml b/client-adapter/launcher/src/main/assembly/dev.xml index 394fe33f..84962aec 100644 --- a/client-adapter/launcher/src/main/assembly/dev.xml +++ b/client-adapter/launcher/src/main/assembly/dev.xml @@ -23,7 +23,7 @@ ./src/main/resources - /config + /conf **/* @@ -31,21 +31,21 @@ ../elasticsearch/src/main/resources/es - /config/es + /conf/es **/* ../hbase/src/main/resources/hbase - /config/hbase + /conf/hbase **/* ../rdb/src/main/resources/ - /config + /conf META-INF/** diff --git a/client-adapter/launcher/src/main/bin/startup.sh b/client-adapter/launcher/src/main/bin/startup.sh index 63255c59..69993483 100644 --- a/client-adapter/launcher/src/main/bin/startup.sh +++ b/client-adapter/launcher/src/main/bin/startup.sh @@ -10,8 +10,6 @@ case "`uname`" in ;; esac base=${bin_abs_path}/.. -#canal_conf=$base/config/canal.properties -#logback_configurationFile=$base/conf/logback.xml export LANG=en_US.UTF-8 export BASE=$base diff --git a/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/CanalAdapterLoader.java b/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/CanalAdapterLoader.java index 78eab682..e3197e7d 100644 --- a/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/CanalAdapterLoader.java +++ b/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/CanalAdapterLoader.java @@ -125,7 +125,7 @@ public class CanalAdapterLoader { try { OuterAdapter adapter; if ("rdb".equalsIgnoreCase(config.getName())) { - adapter = loader.newInstance(config.getName()); + adapter = loader.getExtension(config.getName(), config.getKey()); } else { adapter = loader.getExtension(config.getName()); } diff --git a/client-adapter/launcher/src/main/resources/application.yml b/client-adapter/launcher/src/main/resources/application.yml index 9595e3fb..2c48fa84 100644 --- a/client-adapter/launcher/src/main/resources/application.yml +++ b/client-adapter/launcher/src/main/resources/application.yml @@ -11,16 +11,16 @@ spring: time-zone: GMT+8 default-property-inclusion: non_null -#canal.conf: -# canalServerHost: 127.0.0.1:11111 +canal.conf: + canalServerHost: 127.0.0.1:11111 # zookeeperHosts: slave1:2181 # bootstrapServers: slave1:6667 #or rocketmq # flatMessage: true -# canalInstances: -# - instance: example -# groups: -# - outAdapters: -# - name: logger + canalInstances: + - instance: example + groups: + - outAdapters: + - name: logger # - name: rdb # key: oracle1 # properties: