ChildProcAppHandle记录(spark-2.2.0)

ChildProcAppHandle 代码记录

概述

    ChildProcAppHandle 是用来保存和执行用户注册的listener的类,在LauncherServer中被调用
    主要方法有
        setAppId               当appid变化时触发listener
        setState                当状态变化时触发listener
        fireEvent               被setAppId和setState调用的方法,实际执行用户的listener在这里
        addListener           注册用户的listener的方法,在SparkLauncher.startApplication中被调用

代码记录

//代码很简单,就不做过多的描述了
class ChildProcAppHandle implements SparkAppHandle {

  private static final Logger LOG = Logger.getLogger(ChildProcAppHandle.class.getName());

  private final String secret;
  private final LauncherServer server;

  private Process childProc;
  private boolean disposed;
  private LauncherConnection connection;
  private List<Listener> listeners;
  private State state;
  private String appId;
  private OutputRedirector redirector;

  ChildProcAppHandle(String secret, LauncherServer server) {
    this.secret = secret;
    this.server = server;
    this.state = State.UNKNOWN;
  }

  @Override
  public synchronized void addListener(Listener l) {
    if (listeners == null) {
      listeners = new ArrayList<>();
    }
    listeners.add(l);
  }

  @Override
  public State getState() {
    return state;
  }

  @Override
  public String getAppId() {
    return appId;
  }

  @Override
  public void stop() {
    CommandBuilderUtils.checkState(connection != null, "Application is still not connected.");
    try {
      connection.send(new LauncherProtocol.Stop());
    } catch (IOException ioe) {
      throw new RuntimeException(ioe);
    }
  }

  @Override
  public synchronized void disconnect() {
    if (!disposed) {
      disposed = true;
      if (connection != null) {
        try {
          connection.close();
        } catch (IOException ioe) {
          // no-op.
        }
      }
      server.unregister(this);
      if (redirector != null) {
        redirector.stop();
      }
    }
  }

  @Override
  public synchronized void kill() {
    if (!disposed) {
      disconnect();
    }
    if (childProc != null) {
      try {
        childProc.exitValue();
      } catch (IllegalThreadStateException e) {
        childProc.destroyForcibly();
      } finally {
        childProc = null;
      }
    }
  }

  String getSecret() {
    return secret;
  }

  void setChildProc(Process childProc, String loggerName) {
    this.childProc = childProc;
    this.redirector = new OutputRedirector(childProc.getInputStream(), loggerName,
      SparkLauncher.REDIRECTOR_FACTORY);
  }

  void setConnection(LauncherConnection connection) {
    this.connection = connection;
  }

  LauncherServer getServer() {
    return server;
  }

  LauncherConnection getConnection() {
    return connection;
  }
  
  //这里执行用户的listener
  void setState(State s) {
    if (!state.isFinal()) {
      state = s;
      fireEvent(false);
    } else {
      LOG.log(Level.WARNING, "Backend requested transition from final state {0} to {1}.",
        new Object[] { state, s });
    }
  }

  //这里执行用户的listener
  void setAppId(String appId) {
    this.appId = appId;
    fireEvent(true);
  }

  //这里执行用户的listener
  private synchronized void fireEvent(boolean isInfoChanged) {
    if (listeners != null) {
      for (Listener l : listeners) {
        if (isInfoChanged) {
          l.infoChanged(this);
        } else {
          l.stateChanged(this);
        }
      }
    }
  }

}

posted @ 2018-01-31 12:32  vv.past  阅读(363)  评论(0编辑  收藏  举报