then this.program of PackageProgram's object has null. [1]
in run() of CliFrontend.java, invokes executeProgramBlocking(program, client, 
userParallelism) [2]
and this method invokes client.runBlocking(program, parallelism) [3]
and this method invokes runBlocking(prog.getPlanWithJars(), parallelism, 
prog.getSavepointPath()) that is overloaded function[4]
and prog.getPlanWithJars() invokes getPlan() of PackagedProgram.java[5]
and getPlan() invokes createPlanFromProgram(this.program, this.args); [6]
and createPlanFromProgram's source is folowing
 
private static Plan createPlanFromProgram(Program program, String[] options) 
throws ProgramInvocationException {
    try {
      return program.getPlan(options);
    } catch (Throwable t) {
      throw new ProgramInvocationException("Error while calling the program: " 
+ t.getMessage(), t);
    }
}
 
as we checked, this.program has null. so if we invoke program.getPlan(options), 
exception will happen.
but when i runned program, exception didn't occur.
i'd appreciate if you explain this.
 
[1]
else if (hasMainMethod(mainClass)) {
this.program = null;
 
[2]
if (options.getDetachedMode() || (yarnCluster != null && 
yarnCluster.isDetached())) {
     exitCode = executeProgramDetached(program, client, userParallelism);
} else {
     exitCode = executeProgramBlocking(program, client, userParallelism);
}
 
[3]
protected int executeProgramBlocking(PackagedProgram program, Client client, 
int parallelism) {
  LOG.info("Starting execution of program");
  JobSubmissionResult result;
  try {
     result = client.runBlocking(program, parallelism);
  }
 
[4]
public JobSubmissionResult runBlocking(PackagedProgram prog, int parallelism) 
throws ProgramInvocationException {
  Thread.currentThread().setContextClassLoader(prog.getUserCodeClassLoader());
  if (prog.isUsingProgramEntryPoint()) {
    return runBlocking(prog.getPlanWithJars(), parallelism, 
prog.getSavepointPath());
  }
 
[5]
public JobWithJars getPlanWithJars() throws ProgramInvocationException {
  if (isUsingProgramEntryPoint()) {
     return new JobWithJars(getPlan(), getAllLibraries(), classpaths, 
userCodeClassLoader);
 
[6]
private Plan getPlan() throws ProgramInvocationException {
  if (this.plan == null) {
     Thread.currentThread().setContextClassLoader(this.userCodeClassLoader);
     this.plan = createPlanFromProgram(this.program, this.args);
  }
  return this.plan;
}
 
 
-----Original Message-----
From: "Ufuk Celebi"<u...@apache.org> 
To: <user@flink.apache.org>; "윤형덕"<ynoo...@naver.com>; 
Cc: 
Sent: 2016-05-20 (금) 19:30:01
Subject: Re: inheritance of Program interface in Program.java in 
org.apache.flink.api.common
 

On Thu, May 19, 2016 at 4:46 PM, 윤형덕 <ynoo...@naver.com> wrote:
>
> how can this.mainClass that doesn't override getPlan method that is 
abstract method of Program interface(program.class) and has only static main 
method be instantiate as Program?


This is only called if the class is actually a subclass of Program. That's why 
there is the `isAssignable` check. Otherwise, we check that there is a 
mainMethod (else if (hasMainMethod(mainClass)). If this is not the case, a 
ProgramInvocationException is thrown.


Reply via email to