code: public void destroy() {
          if (!canalWorkers.isEmpty()) {
              ExecutorService stopExecutorService = Executors.newFixedThreadPool(canalWorkers.size());
              for (CanalAdapterWorker canalAdapterWorker : canalWorkers.values()) {
                  stopExecutorService.execute(canalAdapterWorker::stop);
              }
              stopExecutorService.shutdown();
              try {
                  while (!stopExecutorService.awaitTermination(1, TimeUnit.SECONDS)) {
                      // ignore
                  }
              } catch (InterruptedException e) {
                  // ignore
              }
          }
  
          if (!canalMQWorker.isEmpty()) {
              ExecutorService stopMQWorkerService = Executors.newFixedThreadPool(canalMQWorker.size());
              for (AbstractCanalAdapterWorker canalAdapterMQWorker : canalMQWorker.values()) {
                  stopMQWorkerService.execute(canalAdapterMQWorker::stop);
              }
              stopMQWorkerService.shutdown();
              try {
                  while (!stopMQWorkerService.awaitTermination(1, TimeUnit.SECONDS)) {
                      // ignore
                  }
              } catch (InterruptedException e) {
                  // ignore
              }
          }
          logger.info("All canal adapters destroyed");
      }
docs: 销毁所有适配器 为防止canal实例太多造成销毁阻塞, 并行销毁