docs: @PostMapping("/etl/{type}/{key}/{task}")
      public EtlResult etl(@PathVariable String type, @PathVariable String key, @PathVariable String task,
                           @RequestParam(name = "params", required = false) String params) {
          OuterAdapter adapter = loader.getExtension(type, key);
          String destination = adapter.getDestination(task);
          String lockKey = destination == null ? task : destination;
  
          boolean locked = etlLock.tryLock(ETL_LOCK_ZK_NODE + type + "-" + lockKey);
          if (!locked) {
              EtlResult result = new EtlResult();
              result.setSucceeded(false);
              result.setErrorMessage(task + " 有其他进程正在导入中, 请稍后再试");
              return result;
          }
          try {
  
              boolean oriSwitchStatus;
              if (destination != null) {
                  oriSwitchStatus = syncSwitch.status(destination);
                  if (oriSwitchStatus) {
                      syncSwitch.off(destination);
                  }
              } else {
                  // task可能为destination，直接锁task
                  oriSwitchStatus = syncSwitch.status(task);
                  if (oriSwitchStatus) {
                      syncSwitch.off(task);
                  }
              }
              try {
                  List<String> paramArray = null;
                  if (params != null) {
                      paramArray = Arrays.asList(params.trim().split(";"));
                  }
                  return adapter.etl(task, paramArray);
              } finally {
                  if (destination != null && oriSwitchStatus) {
                      syncSwitch.on(destination);
                  } else if (destination == null && oriSwitchStatus) {
                      syncSwitch.on(task);
                  }
              }
          } finally {
              etlLock.unlock(ETL_LOCK_ZK_NODE + type + "-" + lockKey);
          }
      }