This is an automated email from the ASF dual-hosted git repository.

journey pushed a commit to branch refactor-worker
in repository https://gitbox.apache.org/repos/asf/incubator-dolphinscheduler.git


The following commit(s) were added to refs/heads/refactor-worker by this push:
     new 3800a2a  Refactor worker (#1993)
3800a2a is described below

commit 3800a2a99b78e66920f4559404bbfd7ae1f6469d
Author: Tboy <[email protected]>
AuthorDate: Fri Feb 21 22:02:18 2020 +0800

    Refactor worker (#1993)
    
    * Refactor worker (#1)
    
    * add TaskResponseProcessor (#1983)
    
    * 1, master persistent task 2. extract  master and worker communication 
model (#1992)
    
    * 1, master persistent task
    2. extract  master and worker communication model
    
    * 1, master persistent task
    2. extract  master and worker communication model
    
    * 1, master persistent task
    2. extract  master and worker communication model
    
    * add license
    
    * modify javadoc error
    
    Co-authored-by: qiaozhanwei <[email protected]>
    
    * updates
    
    Co-authored-by: qiaozhanwei <[email protected]>
---
 .../remote/entity/TaskExecutionContext.java        | 250 +++++++++++++++++++++
 .../dolphinscheduler/server/master/host/Host.java  |  95 ++++++++
 .../server/master/host/HostManager.java            |  27 +++
 .../server/master/host/RoundRobinHostManager.java  |  57 +++++
 .../server/master/host/assign/RandomSelector.java  |  45 ++++
 .../master/host/assign/RoundRobinSelector.java     |  40 ++++
 .../server/master/host/assign/Selector.java        |  26 +++
 .../registry/MasterRegistry.java}                  |  18 +-
 .../master/runner/MasterBaseTaskExecThread.java    |  43 ++--
 .../server/registry/ZookeeperNodeManager.java      | 159 +++++++++++++
 .../server/registry/ZookeeperRegistryCenter.java   |  25 +++
 .../worker/processor/WorkerRequestProcessor.java   |  32 +--
 .../server/worker/registry/WorkerRegistry.java     |   2 +-
 .../server/worker/runner/TaskScheduleThread.java   |  80 ++++---
 .../service/zk/AbstractListener.java               |  36 +++
 .../service/zk/ZookeeperCachedOperator.java        |   7 +-
 16 files changed, 847 insertions(+), 95 deletions(-)

diff --git 
a/dolphinscheduler-remote/src/main/java/org/apache/dolphinscheduler/remote/entity/TaskExecutionContext.java
 
b/dolphinscheduler-remote/src/main/java/org/apache/dolphinscheduler/remote/entity/TaskExecutionContext.java
new file mode 100644
index 0000000..783d166
--- /dev/null
+++ 
b/dolphinscheduler-remote/src/main/java/org/apache/dolphinscheduler/remote/entity/TaskExecutionContext.java
@@ -0,0 +1,250 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.remote.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ *  master/worker task transport
+ */
+public class TaskExecutionContext implements Serializable{
+
+    /**
+     *  task instance id
+     */
+    private Integer taskId;
+
+
+    /**
+     *  taks name
+     */
+    private String taskName;
+
+    /**
+     *  task start time
+     */
+    private Date startTime;
+
+    /**
+     *  task type
+     */
+    private String taskType;
+
+    /**
+     *  task execute path
+     */
+    private String executePath;
+
+    /**
+     *  task json
+     */
+    private String taskJson;
+
+
+    /**
+     *  process instance id
+     */
+    private Integer processInstanceId;
+
+
+    /**
+     *  process instance schedule time
+     */
+    private Date scheduleTime;
+
+    /**
+     *  process instance global parameters
+     */
+    private String globalParams;
+
+
+    /**
+     *  execute user id
+     */
+    private Integer executorId;
+
+
+    /**
+     *  command type if complement
+     */
+    private Integer cmdTypeIfComplement;
+
+
+    /**
+     *  tenant code
+     */
+    private String tenantCode;
+
+    /**
+     *  task queue
+     */
+    private String queue;
+
+
+    /**
+     *  process define id
+     */
+    private Integer processDefineId;
+
+    /**
+     *  project id
+     */
+    private Integer projectId;
+
+    public Integer getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(Integer taskId) {
+        this.taskId = taskId;
+    }
+
+    public String getTaskName() {
+        return taskName;
+    }
+
+    public void setTaskName(String taskName) {
+        this.taskName = taskName;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getTaskType() {
+        return taskType;
+    }
+
+    public void setTaskType(String taskType) {
+        this.taskType = taskType;
+    }
+
+    public String getExecutePath() {
+        return executePath;
+    }
+
+    public void setExecutePath(String executePath) {
+        this.executePath = executePath;
+    }
+
+    public String getTaskJson() {
+        return taskJson;
+    }
+
+    public void setTaskJson(String taskJson) {
+        this.taskJson = taskJson;
+    }
+
+    public Integer getProcessInstanceId() {
+        return processInstanceId;
+    }
+
+    public void setProcessInstanceId(Integer processInstanceId) {
+        this.processInstanceId = processInstanceId;
+    }
+
+    public Date getScheduleTime() {
+        return scheduleTime;
+    }
+
+    public void setScheduleTime(Date scheduleTime) {
+        this.scheduleTime = scheduleTime;
+    }
+
+    public String getGlobalParams() {
+        return globalParams;
+    }
+
+    public void setGlobalParams(String globalParams) {
+        this.globalParams = globalParams;
+    }
+
+    public String getTenantCode() {
+        return tenantCode;
+    }
+
+    public void setTenantCode(String tenantCode) {
+        this.tenantCode = tenantCode;
+    }
+
+    public String getQueue() {
+        return queue;
+    }
+
+    public void setQueue(String queue) {
+        this.queue = queue;
+    }
+
+    public Integer getProcessDefineId() {
+        return processDefineId;
+    }
+
+    public void setProcessDefineId(Integer processDefineId) {
+        this.processDefineId = processDefineId;
+    }
+
+    public Integer getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(Integer projectId) {
+        this.projectId = projectId;
+    }
+
+    public Integer getExecutorId() {
+        return executorId;
+    }
+
+    public void setExecutorId(Integer executorId) {
+        this.executorId = executorId;
+    }
+
+    public Integer getCmdTypeIfComplement() {
+        return cmdTypeIfComplement;
+    }
+
+    public void setCmdTypeIfComplement(Integer cmdTypeIfComplement) {
+        this.cmdTypeIfComplement = cmdTypeIfComplement;
+    }
+
+    @Override
+    public String toString() {
+        return "TaskExecutionContext{" +
+                "taskId=" + taskId +
+                ", taskName='" + taskName + '\'' +
+                ", startTime=" + startTime +
+                ", taskType='" + taskType + '\'' +
+                ", executePath='" + executePath + '\'' +
+                ", taskJson='" + taskJson + '\'' +
+                ", processInstanceId=" + processInstanceId +
+                ", scheduleTime=" + scheduleTime +
+                ", globalParams='" + globalParams + '\'' +
+                ", executorId=" + executorId +
+                ", cmdTypeIfComplement=" + cmdTypeIfComplement +
+                ", tenantCode='" + tenantCode + '\'' +
+                ", queue='" + queue + '\'' +
+                ", processDefineId=" + processDefineId +
+                ", projectId=" + projectId +
+                '}';
+    }
+}
diff --git 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/host/Host.java
 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/host/Host.java
new file mode 100644
index 0000000..57e64c1
--- /dev/null
+++ 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/host/Host.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.server.master.host;
+
+
+import java.util.Objects;
+
+
+public class Host {
+
+    private String address;
+
+    private String ip;
+
+    private int port;
+
+    public Host() {
+    }
+
+    public Host(String ip, int port) {
+        this.ip = ip;
+        this.port = port;
+        this.address = ip + ":" + port;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+        this.address = ip + ":" + port;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+    public void setPort(int port) {
+        this.port = port;
+        this.address = ip + ":" + port;
+    }
+
+    public static Host of(String address){
+        String[] parts = address.split(":");
+        if (parts.length != 2) {
+            throw new IllegalArgumentException(String.format("Address : %s 
illegal.", address));
+        }
+        Host host = new Host(parts[0], Integer.parseInt(parts[1]));
+        return host;
+    }
+
+    @Override
+    public String toString() {
+        return "Host{" +
+                "address='" + address + '\'' +
+                '}';
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        Host host = (Host) o;
+        return Objects.equals(getAddress(), host.getAddress());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(getAddress());
+    }
+}
diff --git 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/host/HostManager.java
 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/host/HostManager.java
new file mode 100644
index 0000000..316ce36
--- /dev/null
+++ 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/host/HostManager.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.server.master.host;
+
+
+import org.apache.dolphinscheduler.remote.entity.TaskExecutionContext;
+
+public interface HostManager {
+
+    Host select(TaskExecutionContext context);
+
+}
diff --git 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/host/RoundRobinHostManager.java
 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/host/RoundRobinHostManager.java
new file mode 100644
index 0000000..18a4659
--- /dev/null
+++ 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/host/RoundRobinHostManager.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.server.master.host;
+
+import org.apache.dolphinscheduler.common.utils.CollectionUtils;
+import org.apache.dolphinscheduler.remote.entity.TaskExecutionContext;
+import 
org.apache.dolphinscheduler.server.master.host.assign.RoundRobinSelector;
+import org.apache.dolphinscheduler.server.registry.ZookeeperNodeManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+
+@Service
+public class RoundRobinHostManager implements HostManager {
+
+    private final Logger logger = 
LoggerFactory.getLogger(RoundRobinHostManager.class);
+
+    @Autowired
+    private RoundRobinSelector<Host> selector;
+
+    @Autowired
+    private ZookeeperNodeManager zookeeperNodeManager;
+
+    @Override
+    public Host select(TaskExecutionContext context){
+        Host host = new Host();
+        Collection<String> nodes = zookeeperNodeManager.getWorkerNodes();
+        if(CollectionUtils.isEmpty(nodes)){
+            return host;
+        }
+        List<Host> candidateHosts = new ArrayList<>(nodes.size());
+        nodes.stream().forEach(node -> candidateHosts.add(Host.of(node)));
+        return selector.select(candidateHosts);
+    }
+
+}
diff --git 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/host/assign/RandomSelector.java
 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/host/assign/RandomSelector.java
new file mode 100644
index 0000000..3a3f123
--- /dev/null
+++ 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/host/assign/RandomSelector.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.server.master.host.assign;
+
+import java.util.Collection;
+import java.util.Random;
+
+
+public class RandomSelector<T> implements Selector<T> {
+
+    private final Random random = new Random();
+
+    @Override
+    public T select(final Collection<T> source) {
+
+        if (source == null || source.size() == 0) {
+            throw new IllegalArgumentException("Empty source.");
+        }
+
+        if (source.size() == 1) {
+            return (T) source.toArray()[0];
+        }
+
+        int size = source.size();
+        int randomIndex = random.nextInt(size);
+
+        return (T) source.toArray()[randomIndex];
+    }
+
+}
diff --git 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/host/assign/RoundRobinSelector.java
 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/host/assign/RoundRobinSelector.java
new file mode 100644
index 0000000..d342296
--- /dev/null
+++ 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/host/assign/RoundRobinSelector.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dolphinscheduler.server.master.host.assign;
+
+import java.util.Collection;
+import java.util.concurrent.atomic.AtomicInteger;
+
+
+public class RoundRobinSelector<T> implements Selector<T> {
+
+    private final AtomicInteger index = new AtomicInteger(0);
+
+    @Override
+    public T select(Collection<T> source) {
+        if (source == null || source.size() == 0) {
+            throw new IllegalArgumentException("Empty source.");
+        }
+
+        if (source.size() == 1) {
+            return (T)source.toArray()[0];
+        }
+
+        int size = source.size();
+        return (T) source.toArray()[index.getAndIncrement() % size];
+    }
+}
diff --git 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/host/assign/Selector.java
 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/host/assign/Selector.java
new file mode 100644
index 0000000..c6772f3
--- /dev/null
+++ 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/host/assign/Selector.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.server.master.host.assign;
+
+import java.util.Collection;
+
+
+public interface Selector<T> {
+
+    T select(Collection<T> source);
+}
diff --git 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/registry/WorkerRegistry.java
 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/registry/MasterRegistry.java
similarity index 86%
copy from 
dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/registry/WorkerRegistry.java
copy to 
dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/registry/MasterRegistry.java
index fc81638..a9c111d 100644
--- 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/registry/WorkerRegistry.java
+++ 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/registry/MasterRegistry.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dolphinscheduler.server.worker.registry;
+package org.apache.dolphinscheduler.server.master.registry;
 
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.state.ConnectionState;
@@ -25,11 +25,11 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- *  worker registry
+ *  master registry
  */
-public class WorkerRegistry {
+public class MasterRegistry {
 
-    private final Logger logger = 
LoggerFactory.getLogger(WorkerRegistry.class);
+    private final Logger logger = 
LoggerFactory.getLogger(MasterRegistry.class);
 
     /**
      *  zookeeper registry center
@@ -46,7 +46,7 @@ public class WorkerRegistry {
      * @param zookeeperRegistryCenter zookeeperRegistryCenter
      * @param port port
      */
-    public WorkerRegistry(ZookeeperRegistryCenter zookeeperRegistryCenter, int 
port){
+    public MasterRegistry(ZookeeperRegistryCenter zookeeperRegistryCenter, int 
port){
         this.zookeeperRegistryCenter = zookeeperRegistryCenter;
         this.port = port;
     }
@@ -62,16 +62,16 @@ public class WorkerRegistry {
             @Override
             public void stateChanged(CuratorFramework client, ConnectionState 
newState) {
                 if(newState == ConnectionState.LOST){
-                    logger.error("worker : {} connection lost from zookeeper", 
address);
+                    logger.error("master : {} connection lost from zookeeper", 
address);
                 } else if(newState == ConnectionState.RECONNECTED){
-                    logger.info("worker : {} reconnected to zookeeper", 
address);
+                    logger.info("master : {} reconnected to zookeeper", 
address);
                     
zookeeperRegistryCenter.getZookeeperCachedOperator().persist(localNodePath, "");
                 } else if(newState == ConnectionState.SUSPENDED){
-                    logger.warn("worker : {} connection SUSPENDED ", address);
+                    logger.warn("master : {} connection SUSPENDED ", address);
                 }
             }
         });
-        logger.info("scheduler node : {} registry to ZK successfully.", 
address);
+        logger.info("master node : {} registry to ZK successfully.", address);
     }
 
     /**
diff --git 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/runner/MasterBaseTaskExecThread.java
 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/runner/MasterBaseTaskExecThread.java
index 09005a1..d704629 100644
--- 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/runner/MasterBaseTaskExecThread.java
+++ 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/master/runner/MasterBaseTaskExecThread.java
@@ -28,7 +28,7 @@ import org.apache.dolphinscheduler.remote.NettyRemotingClient;
 import org.apache.dolphinscheduler.remote.command.Command;
 import org.apache.dolphinscheduler.remote.command.ExecuteTaskAckCommand;
 import org.apache.dolphinscheduler.remote.command.ExecuteTaskRequestCommand;
-import org.apache.dolphinscheduler.remote.command.TaskInfo;
+import org.apache.dolphinscheduler.remote.entity.TaskExecutionContext;
 import org.apache.dolphinscheduler.remote.config.NettyClientConfig;
 import org.apache.dolphinscheduler.remote.exceptions.RemotingException;
 import org.apache.dolphinscheduler.remote.utils.Address;
@@ -137,7 +137,7 @@ public class MasterBaseTaskExecThread implements 
Callable<Boolean> {
                 
FastJsonSerializer.serializeToString(convertToTaskInfo(destTaskInstance)));
         try {
             Command responseCommand = nettyRemotingClient.sendSync(address,
-                    taskRequestCommand.convert2Command(), Integer.MAX_VALUE);
+                    taskRequestCommand.convert2Command(), 2000);
 
             ExecuteTaskAckCommand taskAckCommand = 
FastJsonSerializer.deserialize(
                     responseCommand.getBody(), ExecuteTaskAckCommand.class);
@@ -155,7 +155,6 @@ public class MasterBaseTaskExecThread implements 
Callable<Boolean> {
         }
     }
 
-
     /**
      *  set task instance relation
      *
@@ -203,25 +202,25 @@ public class MasterBaseTaskExecThread implements 
Callable<Boolean> {
      * @param taskInstance taskInstance
      * @return taskInfo
      */
-    private TaskInfo convertToTaskInfo(TaskInstance taskInstance){
-        TaskInfo taskInfo = new TaskInfo();
-        taskInfo.setTaskId(taskInstance.getId());
-        taskInfo.setTaskName(taskInstance.getName());
-        taskInfo.setStartTime(taskInstance.getStartTime());
-        taskInfo.setTaskType(taskInstance.getTaskType());
-        taskInfo.setExecutePath(getExecLocalPath(taskInstance));
-        taskInfo.setTaskJson(taskInstance.getTaskJson());
-        
taskInfo.setProcessInstanceId(taskInstance.getProcessInstance().getId());
-        
taskInfo.setScheduleTime(taskInstance.getProcessInstance().getScheduleTime());
-        
taskInfo.setGlobalParams(taskInstance.getProcessInstance().getGlobalParams());
-        
taskInfo.setExecutorId(taskInstance.getProcessInstance().getExecutorId());
-        
taskInfo.setCmdTypeIfComplement(taskInstance.getProcessInstance().getCmdTypeIfComplement().getCode());
-        
taskInfo.setTenantCode(taskInstance.getProcessInstance().getTenantCode());
-        taskInfo.setQueue(taskInstance.getProcessInstance().getQueue());
-        taskInfo.setProcessDefineId(taskInstance.getProcessDefine().getId());
-        taskInfo.setProjectId(taskInstance.getProcessDefine().getProjectId());
-
-        return taskInfo;
+    private TaskExecutionContext convertToTaskInfo(TaskInstance taskInstance){
+        TaskExecutionContext taskExecutionContext = new TaskExecutionContext();
+        taskExecutionContext.setTaskId(taskInstance.getId());
+        taskExecutionContext.setTaskName(taskInstance.getName());
+        taskExecutionContext.setStartTime(taskInstance.getStartTime());
+        taskExecutionContext.setTaskType(taskInstance.getTaskType());
+        taskExecutionContext.setExecutePath(getExecLocalPath(taskInstance));
+        taskExecutionContext.setTaskJson(taskInstance.getTaskJson());
+        
taskExecutionContext.setProcessInstanceId(taskInstance.getProcessInstance().getId());
+        
taskExecutionContext.setScheduleTime(taskInstance.getProcessInstance().getScheduleTime());
+        
taskExecutionContext.setGlobalParams(taskInstance.getProcessInstance().getGlobalParams());
+        
taskExecutionContext.setExecutorId(taskInstance.getProcessInstance().getExecutorId());
+        
taskExecutionContext.setCmdTypeIfComplement(taskInstance.getProcessInstance().getCmdTypeIfComplement().getCode());
+        
taskExecutionContext.setTenantCode(taskInstance.getProcessInstance().getTenantCode());
+        
taskExecutionContext.setQueue(taskInstance.getProcessInstance().getQueue());
+        
taskExecutionContext.setProcessDefineId(taskInstance.getProcessDefine().getId());
+        
taskExecutionContext.setProjectId(taskInstance.getProcessDefine().getProjectId());
+
+        return taskExecutionContext;
     }
 
 
diff --git 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/registry/ZookeeperNodeManager.java
 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/registry/ZookeeperNodeManager.java
new file mode 100644
index 0000000..e3eacaf
--- /dev/null
+++ 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/registry/ZookeeperNodeManager.java
@@ -0,0 +1,159 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.server.registry;
+
+import org.apache.curator.framework.CuratorFramework;
+
+import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
+import org.apache.dolphinscheduler.service.zk.AbstractListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+
+@Service
+public abstract class ZookeeperNodeManager implements InitializingBean {
+
+    private final Logger logger = 
LoggerFactory.getLogger(ZookeeperNodeManager.class);
+
+    private final Lock masterLock = new ReentrantLock();
+
+    private final Lock workerLock = new ReentrantLock();
+
+    private final Set<String> workerNodes = new HashSet<>();
+
+    private final Set<String> masterNodes = new HashSet<>();
+
+    @Autowired
+    private ZookeeperRegistryCenter registryCenter;
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        load();
+        registryCenter.getZookeeperCachedOperator().addListener(new 
MasterNodeListener());
+        registryCenter.getZookeeperCachedOperator().addListener(new 
WorkerNodeListener());
+    }
+
+    private void load(){
+        Set<String> schedulerNodes = registryCenter.getMasterNodesDirectly();
+        syncMasterNodes(schedulerNodes);
+        Set<String> workersNodes = registryCenter.getWorkerNodesDirectly();
+        syncWorkerNodes(workersNodes);
+    }
+
+    class WorkerNodeListener extends AbstractListener {
+
+        @Override
+        protected void dataChanged(CuratorFramework client, TreeCacheEvent 
event, String path) {
+            if(registryCenter.isWorkerPath(path)){
+                try {
+                    if (event.getType() == TreeCacheEvent.Type.NODE_ADDED) {
+                        logger.info("worker node : {} added.", path);
+                        Set<String> previousNodes = new HashSet<>(workerNodes);
+                        Set<String> currentNodes = 
registryCenter.getWorkerNodesDirectly();
+                        syncWorkerNodes(currentNodes);
+                    } else if (event.getType() == 
TreeCacheEvent.Type.NODE_REMOVED) {
+                        logger.info("worker node : {} down.", path);
+                        Set<String> previousNodes = new HashSet<>(workerNodes);
+                        Set<String> currentNodes = 
registryCenter.getWorkerNodesDirectly();
+                        syncWorkerNodes(currentNodes);
+                    }
+                } catch (IllegalArgumentException ignore) {
+                    logger.warn(ignore.getMessage());
+                } catch (Exception ex) {
+                    logger.error("WorkerListener capture data change and get 
data failed", ex);
+                }
+            }
+        }
+    }
+
+
+    class MasterNodeListener extends AbstractListener {
+
+        @Override
+        protected void dataChanged(CuratorFramework client, TreeCacheEvent 
event, String path) {
+            if (registryCenter.isMasterPath(path)) {
+                try {
+                    if (event.getType() == TreeCacheEvent.Type.NODE_ADDED) {
+                        logger.info("master node : {} added.", path);
+                        Set<String> previousNodes = new HashSet<>(masterNodes);
+                        Set<String> currentNodes = 
registryCenter.getMasterNodesDirectly();
+                        syncMasterNodes(currentNodes);
+                    } else if (event.getType() == 
TreeCacheEvent.Type.NODE_REMOVED) {
+                        logger.info("master node : {} down.", path);
+                        Set<String> previousNodes = new HashSet<>(masterNodes);
+                        Set<String> currentNodes = 
registryCenter.getMasterNodesDirectly();
+                        syncMasterNodes(currentNodes);
+                    }
+                } catch (Exception ex) {
+                    logger.error("MasterNodeListener capture data change and 
get data failed.", ex);
+                }
+            }
+        }
+    }
+
+    public Set<String> getMasterNodes() {
+        masterLock.lock();
+        try {
+            return Collections.unmodifiableSet(masterNodes);
+        } finally {
+            masterLock.unlock();
+        }
+    }
+
+    private void syncMasterNodes(Set<String> nodes){
+        masterLock.lock();
+        try {
+            masterNodes.clear();
+            masterNodes.addAll(nodes);
+        } finally {
+            masterLock.unlock();
+        }
+    }
+
+    private void syncWorkerNodes(Set<String> nodes){
+        workerLock.lock();
+        try {
+            workerNodes.clear();
+            workerNodes.addAll(nodes);
+        } finally {
+            workerLock.unlock();
+        }
+    }
+
+    public Set<String> getWorkerNodes(){
+        workerLock.lock();
+        try {
+            return Collections.unmodifiableSet(workerNodes);
+        } finally {
+            workerLock.unlock();
+        }
+    }
+
+    public void close(){
+        registryCenter.close();
+    }
+}
diff --git 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/registry/ZookeeperRegistryCenter.java
 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/registry/ZookeeperRegistryCenter.java
index 68c19ea..96b8424 100644
--- 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/registry/ZookeeperRegistryCenter.java
+++ 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/registry/ZookeeperRegistryCenter.java
@@ -22,6 +22,9 @@ import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 @Service
@@ -76,6 +79,28 @@ public class ZookeeperRegistryCenter implements 
InitializingBean {
         return WORKER_PATH;
     }
 
+    public Set<String> getMasterNodesDirectly() {
+        List<String> masters = getChildrenKeys(MASTER_PATH);
+        return new HashSet<>(masters);
+    }
+
+    public Set<String> getWorkerNodesDirectly() {
+        List<String> workers = getChildrenKeys(WORKER_PATH);
+        return new HashSet<>(workers);
+    }
+
+    public boolean isWorkerPath(String path) {
+        return path != null && path.contains(WORKER_PATH);
+    }
+
+    public boolean isMasterPath(String path) {
+        return path != null && path.contains(MASTER_PATH);
+    }
+
+    public List<String> getChildrenKeys(final String key) {
+        return zookeeperCachedOperator.getChildrenKeys(key);
+    }
+
     public ZookeeperCachedOperator getZookeeperCachedOperator() {
         return zookeeperCachedOperator;
     }
diff --git 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/processor/WorkerRequestProcessor.java
 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/processor/WorkerRequestProcessor.java
index ba21494..038b8ef 100644
--- 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/processor/WorkerRequestProcessor.java
+++ 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/processor/WorkerRequestProcessor.java
@@ -19,18 +19,13 @@ package org.apache.dolphinscheduler.server.worker.processor;
 
 import com.alibaba.fastjson.JSONObject;
 import io.netty.channel.Channel;
-import org.apache.dolphinscheduler.common.enums.ExecutionStatus;
 import org.apache.dolphinscheduler.common.thread.ThreadUtils;
 import org.apache.dolphinscheduler.common.utils.FileUtils;
-import org.apache.dolphinscheduler.common.utils.OSUtils;
 import org.apache.dolphinscheduler.common.utils.Preconditions;
-import org.apache.dolphinscheduler.common.utils.StringUtils;
-import org.apache.dolphinscheduler.dao.entity.TaskInstance;
-import org.apache.dolphinscheduler.dao.entity.Tenant;
 import org.apache.dolphinscheduler.remote.command.Command;
 import org.apache.dolphinscheduler.remote.command.CommandType;
 import org.apache.dolphinscheduler.remote.command.ExecuteTaskRequestCommand;
-import org.apache.dolphinscheduler.remote.command.TaskInfo;
+import org.apache.dolphinscheduler.remote.entity.TaskExecutionContext;
 import org.apache.dolphinscheduler.remote.processor.NettyRequestProcessor;
 import org.apache.dolphinscheduler.remote.utils.FastJsonSerializer;
 import org.apache.dolphinscheduler.server.worker.config.WorkerConfig;
@@ -40,7 +35,6 @@ import 
org.apache.dolphinscheduler.service.process.ProcessService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.Date;
 import java.util.concurrent.ExecutorService;
 
 /**
@@ -87,37 +81,35 @@ public class WorkerRequestProcessor implements 
NettyRequestProcessor {
 
         String taskInstanceJson = taskRequestCommand.getTaskInfoJson();
 
-        TaskInfo taskInfo = JSONObject.parseObject(taskInstanceJson, 
TaskInfo.class);
+        TaskExecutionContext taskExecutionContext = 
JSONObject.parseObject(taskInstanceJson, TaskExecutionContext.class);
 
         // local execute path
-        String execLocalPath = getExecLocalPath(taskInfo);
+        String execLocalPath = getExecLocalPath(taskExecutionContext);
         logger.info("task instance  local execute path : {} ", execLocalPath);
 
         try {
-            FileUtils.createWorkDirAndUserIfAbsent(execLocalPath, 
taskInfo.getTenantCode());
+            FileUtils.createWorkDirAndUserIfAbsent(execLocalPath, 
taskExecutionContext.getTenantCode());
         } catch (Exception ex){
             logger.error(String.format("create execLocalPath : %s", 
execLocalPath), ex);
         }
-
-        taskCallbackService.addCallbackChannel(taskInfo.getTaskId(),
+        
taskCallbackService.addCallbackChannel(taskExecutionContext.getTaskId(),
                 new CallbackChannel(channel, command.getOpaque()));
 
         // submit task
-        workerExecService.submit(new TaskScheduleThread(taskInfo,
+        workerExecService.submit(new TaskScheduleThread(taskExecutionContext,
                 processService, taskCallbackService));
     }
 
 
     /**
      * get execute local path
-     *
-     * @param taskInfo taskInfo
+     * @param taskExecutionContext taskExecutionContext
      * @return execute local path
      */
-    private String getExecLocalPath(TaskInfo taskInfo){
-        return FileUtils.getProcessExecDir(taskInfo.getProjectId(),
-                taskInfo.getProcessDefineId(),
-                taskInfo.getProcessInstanceId(),
-                taskInfo.getTaskId());
+    private String getExecLocalPath(TaskExecutionContext taskExecutionContext){
+        return FileUtils.getProcessExecDir(taskExecutionContext.getProjectId(),
+                taskExecutionContext.getProcessDefineId(),
+                taskExecutionContext.getProcessInstanceId(),
+                taskExecutionContext.getTaskId());
     }
 }
diff --git 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/registry/WorkerRegistry.java
 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/registry/WorkerRegistry.java
index fc81638..a0f4e66 100644
--- 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/registry/WorkerRegistry.java
+++ 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/registry/WorkerRegistry.java
@@ -71,7 +71,7 @@ public class WorkerRegistry {
                 }
             }
         });
-        logger.info("scheduler node : {} registry to ZK successfully.", 
address);
+        logger.info("worker node : {} registry to ZK successfully.", address);
     }
 
     /**
diff --git 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/runner/TaskScheduleThread.java
 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/runner/TaskScheduleThread.java
index 04ee565..c54842b 100644
--- 
a/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/runner/TaskScheduleThread.java
+++ 
b/dolphinscheduler-server/src/main/java/org/apache/dolphinscheduler/server/worker/runner/TaskScheduleThread.java
@@ -31,11 +31,9 @@ import org.apache.dolphinscheduler.common.process.Property;
 import org.apache.dolphinscheduler.common.task.AbstractParameters;
 import org.apache.dolphinscheduler.common.task.TaskTimeoutParameter;
 import org.apache.dolphinscheduler.common.utils.*;
-import org.apache.dolphinscheduler.dao.entity.ProcessInstance;
-import org.apache.dolphinscheduler.dao.entity.TaskInstance;
 import org.apache.dolphinscheduler.remote.command.ExecuteTaskAckCommand;
 import org.apache.dolphinscheduler.remote.command.ExecuteTaskResponseCommand;
-import org.apache.dolphinscheduler.remote.command.TaskInfo;
+import org.apache.dolphinscheduler.remote.entity.TaskExecutionContext;
 import org.apache.dolphinscheduler.server.worker.processor.TaskCallbackService;
 import org.apache.dolphinscheduler.server.worker.task.AbstractTask;
 import org.apache.dolphinscheduler.server.worker.task.TaskManager;
@@ -63,7 +61,7 @@ public class TaskScheduleThread implements Runnable {
     /**
      *  task instance
      */
-    private TaskInfo taskInfo;
+    private TaskExecutionContext taskExecutionContext;
 
     /**
      *  process service
@@ -82,68 +80,67 @@ public class TaskScheduleThread implements Runnable {
 
     /**
      *  constructor
-     *
-     * @param taskInfo taskInfo
+     * @param taskExecutionContext taskExecutionContext
      * @param processService processService
      * @param taskInstanceCallbackService taskInstanceCallbackService
      */
-    public TaskScheduleThread(TaskInfo taskInfo, ProcessService 
processService, TaskCallbackService taskInstanceCallbackService){
+    public TaskScheduleThread(TaskExecutionContext taskExecutionContext, 
ProcessService processService, TaskCallbackService taskInstanceCallbackService){
         this.processService = processService;
-        this.taskInfo = taskInfo;
+        this.taskExecutionContext = taskExecutionContext;
         this.taskInstanceCallbackService = taskInstanceCallbackService;
     }
 
     @Override
     public void run() {
 
-        ExecuteTaskResponseCommand responseCommand = new 
ExecuteTaskResponseCommand(taskInstance.getId());
+        ExecuteTaskResponseCommand responseCommand = new 
ExecuteTaskResponseCommand(taskExecutionContext.getTaskId());
 
         try {
             // tell master that task is in executing
-            ExecuteTaskAckCommand ackCommand = 
buildAckCommand(taskInfo.getTaskType());
-            taskInstanceCallbackService.sendAck(taskInfo.getTaskId(), 
ackCommand);
+            ExecuteTaskAckCommand ackCommand = 
buildAckCommand(taskExecutionContext.getTaskType());
+            
taskInstanceCallbackService.sendAck(taskExecutionContext.getTaskId(), 
ackCommand);
 
-            logger.info("script path : {}", taskInfo.getExecutePath());
+            logger.info("script path : {}", 
taskExecutionContext.getExecutePath());
             // task node
-            TaskNode taskNode = JSONObject.parseObject(taskInfo.getTaskJson(), 
TaskNode.class);
+            TaskNode taskNode = 
JSONObject.parseObject(taskExecutionContext.getTaskJson(), TaskNode.class);
 
             // get resource files
             List<String> resourceFiles = createProjectResFiles(taskNode);
             // copy hdfs/minio file to local
             downloadResource(
-                    taskInfo.getExecutePath(),
+                    taskExecutionContext.getExecutePath(),
                     resourceFiles,
                     logger);
 
             // set task props
             TaskProps taskProps = new TaskProps(taskNode.getParams(),
-                    taskInfo.getExecutePath(),
-                    taskInfo.getScheduleTime(),
-                    taskInfo.getTaskName(),
-                    taskInfo.getTaskType(),
-                    taskInfo.getTaskId(),
+                    taskExecutionContext.getExecutePath(),
+                    taskExecutionContext.getScheduleTime(),
+                    taskExecutionContext.getTaskName(),
+                    taskExecutionContext.getTaskType(),
+                    taskExecutionContext.getTaskId(),
                     CommonUtils.getSystemEnvPath(),
-                    taskInfo.getTenantCode(),
-                    taskInfo.getQueue(),
-                    taskInfo.getStartTime(),
+                    taskExecutionContext.getTenantCode(),
+                    taskExecutionContext.getQueue(),
+                    taskExecutionContext.getStartTime(),
                     getGlobalParamsMap(),
                     null,
-                    CommandType.of(taskInfo.getCmdTypeIfComplement()));
+                    
CommandType.of(taskExecutionContext.getCmdTypeIfComplement()));
             // set task timeout
             setTaskTimeout(taskProps, taskNode);
 
             taskProps.setTaskAppId(String.format("%s_%s_%s",
-                    taskInfo.getProcessDefineId(),
-                    taskInfo.getProcessInstanceId(),
-                    taskInfo.getTaskId()));
+                    taskExecutionContext.getProcessDefineId(),
+                    taskExecutionContext.getProcessInstanceId(),
+                    taskExecutionContext.getTaskId()));
 
             // custom logger
             Logger taskLogger = 
LoggerFactory.getLogger(LoggerUtils.buildTaskId(LoggerUtils.TASK_LOGGER_INFO_PREFIX,
-                    taskInfo.getProcessDefineId(),
-                    taskInfo.getProcessInstanceId(),
-                    taskInfo.getTaskId()));
+                    taskExecutionContext.getProcessDefineId(),
+                    taskExecutionContext.getProcessInstanceId(),
+                    taskExecutionContext.getTaskId()));
 
-            task = TaskManager.newTask(taskInfo.getTaskType(),
+            task = TaskManager.newTask(taskExecutionContext.getTaskType(),
                     taskProps,
                     taskLogger);
 
@@ -159,14 +156,14 @@ public class TaskScheduleThread implements Runnable {
             //
             responseCommand.setStatus(task.getExitStatus().getCode());
             responseCommand.setEndTime(new Date());
-            logger.info("task instance id : {},task final status : {}", 
taskInfo.getTaskId(), task.getExitStatus());
+            logger.info("task instance id : {},task final status : {}", 
taskExecutionContext.getTaskId(), task.getExitStatus());
         }catch (Exception e){
             logger.error("task scheduler failure", e);
             kill();
             responseCommand.setStatus(ExecutionStatus.FAILURE.getCode());
             responseCommand.setEndTime(new Date());
         } finally {
-            taskInstanceCallbackService.sendResult(taskInfo.getTaskId(), 
responseCommand);
+            
taskInstanceCallbackService.sendResult(taskExecutionContext.getTaskId(), 
responseCommand);
         }
     }
 
@@ -178,8 +175,7 @@ public class TaskScheduleThread implements Runnable {
         Map<String,String> globalParamsMap = new HashMap<>(16);
 
         // global params string
-        String globalParamsStr = taskInfo.getGlobalParams();
-
+        String globalParamsStr = taskExecutionContext.getGlobalParams();
         if (globalParamsStr != null) {
             List<Property> globalParamsList = 
JSONObject.parseArray(globalParamsStr, Property.class);
             
globalParamsMap.putAll(globalParamsList.stream().collect(Collectors.toMap(Property::getProp,
 Property::getValue)));
@@ -199,7 +195,7 @@ public class TaskScheduleThread implements Runnable {
         if(taskType.equals(TaskType.SQL.name()) || 
taskType.equals(TaskType.PROCEDURE.name())){
             ackCommand.setExecutePath(null);
         }else{
-            ackCommand.setExecutePath(taskInfo.getExecutePath());
+            ackCommand.setExecutePath(taskExecutionContext.getExecutePath());
         }
         return ackCommand;
     }
@@ -215,15 +211,15 @@ public class TaskScheduleThread implements Runnable {
                 .getDiscriminator()).getLogBase();
         if (baseLog.startsWith(Constants.SINGLE_SLASH)){
             return baseLog + Constants.SINGLE_SLASH +
-                    taskInfo.getProcessDefineId() + Constants.SINGLE_SLASH  +
-                    taskInfo.getProcessInstanceId() + Constants.SINGLE_SLASH  +
-                    taskInfo.getTaskId() + ".log";
+                    taskExecutionContext.getProcessDefineId() + 
Constants.SINGLE_SLASH  +
+                    taskExecutionContext.getProcessInstanceId() + 
Constants.SINGLE_SLASH  +
+                    taskExecutionContext.getTaskId() + ".log";
         }
         return System.getProperty("user.dir") + Constants.SINGLE_SLASH +
                 baseLog +  Constants.SINGLE_SLASH +
-                taskInfo.getProcessDefineId() + Constants.SINGLE_SLASH  +
-                taskInfo.getProcessInstanceId() + Constants.SINGLE_SLASH  +
-                taskInfo.getTaskId() + ".log";
+                taskExecutionContext.getProcessDefineId() + 
Constants.SINGLE_SLASH  +
+                taskExecutionContext.getProcessInstanceId() + 
Constants.SINGLE_SLASH  +
+                taskExecutionContext.getTaskId() + ".log";
     }
 
     /**
@@ -329,7 +325,7 @@ public class TaskScheduleThread implements Runnable {
      * @throws Exception exception
      */
     private void checkDownloadPermission(List<String> projectRes) throws 
Exception {
-        int userId = taskInfo.getExecutorId();
+        int userId = taskExecutionContext.getExecutorId();
         String[] resNames = projectRes.toArray(new String[projectRes.size()]);
         PermissionCheck<String> permissionCheck = new 
PermissionCheck<>(AuthorizationType.RESOURCE_FILE, 
processService,resNames,userId,logger);
         permissionCheck.checkPermission();
diff --git 
a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/zk/AbstractListener.java
 
b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/zk/AbstractListener.java
new file mode 100644
index 0000000..3e3e6c8
--- /dev/null
+++ 
b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/zk/AbstractListener.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.service.zk;
+
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
+import org.apache.curator.framework.recipes.cache.TreeCacheListener;
+
+public abstract class AbstractListener implements TreeCacheListener {
+
+    @Override
+    public final void childEvent(final CuratorFramework client, final 
TreeCacheEvent event) throws Exception {
+        String path = null == event.getData() ? "" : event.getData().getPath();
+        if (path.isEmpty()) {
+            return;
+        }
+        dataChanged(client, event, path);
+    }
+
+    protected abstract void dataChanged(final CuratorFramework client, final 
TreeCacheEvent event, final String path);
+}
diff --git 
a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/zk/ZookeeperCachedOperator.java
 
b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/zk/ZookeeperCachedOperator.java
index dccb768..6c38a68 100644
--- 
a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/zk/ZookeeperCachedOperator.java
+++ 
b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/zk/ZookeeperCachedOperator.java
@@ -20,6 +20,7 @@ import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.recipes.cache.ChildData;
 import org.apache.curator.framework.recipes.cache.TreeCache;
 import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
+import org.apache.curator.framework.recipes.cache.TreeCacheListener;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
@@ -32,7 +33,7 @@ public class ZookeeperCachedOperator extends 
ZookeeperOperator {
     private final Logger logger = 
LoggerFactory.getLogger(ZookeeperCachedOperator.class);
 
 
-    TreeCache treeCache;
+    private TreeCache treeCache;
     /**
      * register a unified listener of /${dsRoot},
      */
@@ -72,6 +73,10 @@ public class ZookeeperCachedOperator extends 
ZookeeperOperator {
         return treeCache;
     }
 
+    public void addListener(TreeCacheListener listener){
+        this.treeCache.getListenable().addListener(listener);
+    }
+
     @Override
     public void close() {
         treeCache.close();

Reply via email to