diff --git a/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/AbstractCanalAdapterWorker.java b/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/AbstractCanalAdapterWorker.java index 333b0805..a5a7a730 100644 --- a/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/AbstractCanalAdapterWorker.java +++ b/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/AbstractCanalAdapterWorker.java @@ -134,7 +134,6 @@ public abstract class AbstractCanalAdapterWorker { return; } - closeConnection(); running = false; syncSwitch.release(canalDestination); @@ -156,6 +155,4 @@ public abstract class AbstractCanalAdapterWorker { } } - protected abstract void closeConnection(); - } diff --git a/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/CanalAdapterKafkaWorker.java b/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/CanalAdapterKafkaWorker.java index 41664c7c..4aa5aee4 100644 --- a/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/CanalAdapterKafkaWorker.java +++ b/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/CanalAdapterKafkaWorker.java @@ -34,11 +34,6 @@ public class CanalAdapterKafkaWorker extends AbstractCanalAdapterWorker { // connector.setSessionTimeout(1L, TimeUnit.MINUTES); } - @Override - protected void closeConnection() { - connector.stopRunning(); - } - @Override protected void process() { while (!running) diff --git a/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/CanalAdapterRocketMQWorker.java b/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/CanalAdapterRocketMQWorker.java index 5f5b058c..69862f88 100644 --- a/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/CanalAdapterRocketMQWorker.java +++ b/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/CanalAdapterRocketMQWorker.java @@ -32,11 +32,6 @@ public class CanalAdapterRocketMQWorker extends AbstractCanalAdapterWorker { logger.info("RocketMQ consumer config topic:{}, nameServer:{}, groupId:{}", topic, nameServers, groupId); } - @Override - protected void closeConnection() { - connector.stopRunning(); - } - @Override protected void process() { while (!running) @@ -88,7 +83,7 @@ public class CanalAdapterRocketMQWorker extends AbstractCanalAdapterWorker { } catch (WakeupException e) { // No-op. Continue process } - connector.stopRunning(); + connector.disconnect(); logger.info("=============> Disconnect topic: {} <=============", this.topic); } } diff --git a/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/CanalAdapterWorker.java b/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/CanalAdapterWorker.java index 198ebaae..ec09da6a 100644 --- a/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/CanalAdapterWorker.java +++ b/client-adapter/launcher/src/main/java/com/alibaba/otter/canal/adapter/launcher/loader/CanalAdapterWorker.java @@ -2,7 +2,6 @@ package com.alibaba.otter.canal.adapter.launcher.loader; import java.net.SocketAddress; import java.util.List; -import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -10,6 +9,7 @@ import com.alibaba.otter.canal.client.CanalConnector; import com.alibaba.otter.canal.client.CanalConnectors; import com.alibaba.otter.canal.client.adapter.OuterAdapter; import com.alibaba.otter.canal.client.impl.ClusterCanalConnector; +import com.alibaba.otter.canal.client.impl.SimpleCanalConnector; import com.alibaba.otter.canal.protocol.Message; /** @@ -54,11 +54,6 @@ public class CanalAdapterWorker extends AbstractCanalAdapterWorker { ((ClusterCanalConnector) connector).setSoTimeout(SO_TIMEOUT); } - @Override - protected void closeConnection() { - connector.stopRunning(); - } - @Override protected void process() { while (!running) @@ -130,4 +125,38 @@ public class CanalAdapterWorker extends AbstractCanalAdapterWorker { } } } + + @Override + public void stop() { + try { + if (!running) { + return; + } + + if (connector instanceof ClusterCanalConnector) { + ((ClusterCanalConnector) connector).stopRunning(); + } else if (connector instanceof SimpleCanalConnector) { + ((SimpleCanalConnector) connector).stopRunning(); + } + + running = false; + + syncSwitch.release(canalDestination); + + logger.info("destination {} is waiting for adapters' worker thread die!", canalDestination); + if (thread != null) { + try { + thread.join(); + } catch (InterruptedException e) { + // ignore + } + } + groupInnerExecutorService.shutdown(); + logger.info("destination {} adapters worker thread dead!", canalDestination); + canalOuterAdapters.forEach(outerAdapters -> outerAdapters.forEach(OuterAdapter::destroy)); + logger.info("destination {} all adapters destroyed!", canalDestination); + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + } } diff --git a/client/src/main/java/com/alibaba/otter/canal/client/CanalConnector.java b/client/src/main/java/com/alibaba/otter/canal/client/CanalConnector.java index 8e52333d..7f3eeb80 100644 --- a/client/src/main/java/com/alibaba/otter/canal/client/CanalConnector.java +++ b/client/src/main/java/com/alibaba/otter/canal/client/CanalConnector.java @@ -149,11 +149,4 @@ public interface CanalConnector { * @throws CanalClientException */ void rollback() throws CanalClientException; - - /** - * 中断的阻塞,用于优雅停止client - * - * @throws CanalClientException - */ - void stopRunning() throws CanalClientException; } diff --git a/client/src/main/java/com/alibaba/otter/canal/client/kafka/KafkaCanalConnector.java b/client/src/main/java/com/alibaba/otter/canal/client/kafka/KafkaCanalConnector.java index e9282498..bf652ecf 100644 --- a/client/src/main/java/com/alibaba/otter/canal/client/kafka/KafkaCanalConnector.java +++ b/client/src/main/java/com/alibaba/otter/canal/client/kafka/KafkaCanalConnector.java @@ -238,15 +238,6 @@ public class KafkaCanalConnector implements CanalMQConnector { } } - public void stopRunning() { - if (running) { - running = false; // 设置为非running状态 - // if (!mutex.state()) { - // mutex.set(true); // 中断阻塞 - // } - } - } - @Override public void subscribe(String filter) throws CanalClientException { throw new CanalClientException("mq not support this method"); diff --git a/client/src/main/java/com/alibaba/otter/canal/client/rocketmq/RocketMQCanalConnector.java b/client/src/main/java/com/alibaba/otter/canal/client/rocketmq/RocketMQCanalConnector.java index 987406ba..da21ead8 100644 --- a/client/src/main/java/com/alibaba/otter/canal/client/rocketmq/RocketMQCanalConnector.java +++ b/client/src/main/java/com/alibaba/otter/canal/client/rocketmq/RocketMQCanalConnector.java @@ -65,6 +65,7 @@ public class RocketMQCanalConnector implements CanalMQConnector { public void disconnect() throws CanalClientException { rocketMQConsumer.shutdown(); + connected = false; } public boolean checkValid() throws CanalClientException { @@ -259,10 +260,4 @@ public class RocketMQCanalConnector implements CanalMQConnector { throw new CanalClientException("mq not support this method"); } - @Override - public void stopRunning() throws CanalClientException { - this.rocketMQConsumer.shutdown(); - connected = false; - } - } diff --git a/client/src/test/java/com/alibaba/otter/canal/client/running/kafka/CanalKafkaClientExample.java b/client/src/test/java/com/alibaba/otter/canal/client/running/kafka/CanalKafkaClientExample.java index db090c34..25fefe38 100644 --- a/client/src/test/java/com/alibaba/otter/canal/client/running/kafka/CanalKafkaClientExample.java +++ b/client/src/test/java/com/alibaba/otter/canal/client/running/kafka/CanalKafkaClientExample.java @@ -88,7 +88,6 @@ public class CanalKafkaClientExample { if (!running) { return; } - connector.stopRunning(); running = false; if (thread != null) { try { diff --git a/client/src/test/java/com/alibaba/otter/canal/client/running/rocketmq/CanalRocketMQClientExample.java b/client/src/test/java/com/alibaba/otter/canal/client/running/rocketmq/CanalRocketMQClientExample.java index f50dedcf..404fa8a0 100644 --- a/client/src/test/java/com/alibaba/otter/canal/client/running/rocketmq/CanalRocketMQClientExample.java +++ b/client/src/test/java/com/alibaba/otter/canal/client/running/rocketmq/CanalRocketMQClientExample.java @@ -87,7 +87,6 @@ public class CanalRocketMQClientExample extends AbstractRocektMQTest { if (!running) { return; } - connector.stopRunning(); running = false; if (thread != null) { try { @@ -134,6 +133,6 @@ public class CanalRocketMQClientExample extends AbstractRocektMQTest { } catch (WakeupException e) { // No-op. Continue process } - connector.stopRunning(); +// connector.stopRunning(); } } diff --git a/example/src/main/java/com/alibaba/otter/canal/example/AbstractCanalClientTest.java b/example/src/main/java/com/alibaba/otter/canal/example/AbstractCanalClientTest.java index 9cb5eb00..552f19da 100644 --- a/example/src/main/java/com/alibaba/otter/canal/example/AbstractCanalClientTest.java +++ b/example/src/main/java/com/alibaba/otter/canal/example/AbstractCanalClientTest.java @@ -96,7 +96,6 @@ public class AbstractCanalClientTest { if (!running) { return; } - connector.stopRunning(); running = false; if (thread != null) { try {