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);
}
}
}
}
}