feixue created FLINK-13565:
------------------------------
Summary: Integrate springboot found error
Key: FLINK-13565
URL: https://issues.apache.org/jira/browse/FLINK-13565
Project: Flink
Issue Type: Improvement
Components: Table SQL / Client
Affects Versions: 1.8.1, 1.9.0
Reporter: feixue
when Integrate springboot for 2.1.*, we init flink stream work for spring. in
our local environment is work find. but when we submit it in dashboard for
submit new job,and then click show plan, it show a internal error, the detail
just like this:
{code:java}
2019-08-04 18:05:28 [ERROR] [ispatcherRestEndpoint-thread-3]
[o.a.f.r.w.h.JarPlanHandler][196] Unhandled exception.
org.apache.flink.client.program.ProgramInvocationException: The main method
caused an error: null
at
org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:546)
at
org.apache.flink.client.program.PackagedProgram.invokeInteractiveModeForExecution(PackagedProgram.java:421)
at
org.apache.flink.client.program.OptimizerPlanEnvironment.getOptimizedPlan(OptimizerPlanEnvironment.java:83)
at
org.apache.flink.client.program.PackagedProgramUtils.createJobGraph(PackagedProgramUtils.java:80)
at
org.apache.flink.runtime.webmonitor.handlers.utils.JarHandlerUtils$JarHandlerContext.toJobGraph(JarHandlerUtils.java:126)
at
org.apache.flink.runtime.webmonitor.handlers.JarPlanHandler.lambda$handleRequest$1(JarPlanHandler.java:100)
at
java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.reflect.InvocationTargetException: null
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at
org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:47)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:86)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at
org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:529)
... 9 common frames omitted
Caused by:
org.apache.flink.client.program.OptimizerPlanEnvironment$ProgramAbortException:
null
at
org.apache.flink.streaming.api.environment.StreamPlanEnvironment.execute(StreamPlanEnvironment.java:70)
at
org.apache.flink.streaming.api.environment.StreamPlanEnvironment.execute(StreamPlanEnvironment.java:53)
at com.ggj.center.boot.demo.DemoApplication.run(DemoApplication.java:73)
at
org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:779)
at
org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:763)
at
org.springframework.boot.SpringApplication.run(SpringApplication.java:318)
at com.ggj.boot.demo.DemoApplication.main(DemoApplication.java:29)
... 22 common frames omitted
{code}
just read zhe source code, we found in PackageProgram.java file, the
callMainMethod() call main method and catch InvocationTargetException for it.
when throw ProgramAbortException, it will throw as InvocationTargetException
and it target is ProgramAbortException. so flink can catch this and check the
target exception for Error and throw angin.
{code:java}
try {
mainMethod.invoke(null, (Object) args);
}
catch (IllegalArgumentException e) {
throw new ProgramInvocationException("Could not invoke the main method,
arguments are not matching.", e);
}
catch (IllegalAccessException e) {
throw new ProgramInvocationException("Access to the main method was denied:
" + e.getMessage(), e);
}
catch (InvocationTargetException e) {
Throwable exceptionInMethod = e.getTargetException();
if (exceptionInMethod instanceof Error) {
throw (Error) exceptionInMethod;
} else if (exceptionInMethod instanceof ProgramParametrizationException) {
throw (ProgramParametrizationException) exceptionInMethod;
} else if (exceptionInMethod instanceof ProgramInvocationException) {
throw (ProgramInvocationException) exceptionInMethod;
} else {
throw new ProgramInvocationException("The main method caused an error: "
+ exceptionInMethod.getMessage(), exceptionInMethod);
}
}
{code}
OptimizerPlanEnvironment will catch it and check optimizerPlan is not null and
decision it run success or throw ProgramInvocationException.
{code:java}
try {
prog.invokeInteractiveModeForExecution();
}
catch (ProgramInvocationException e) {
throw e;
}
catch (Throwable t) {
// the invocation gets aborted with the preview plan
if (optimizerPlan != null) {
return optimizerPlan;
} else {
throw new ProgramInvocationException("The program caused an error: ", t);
}
}{code}
In springboot to start application is reflect main method also, when we
operation in dashboard, zhe cell order is: flink > springboot > flink stream
client. Two reflect make the
InvocationTargetException target exception is InvocationTargetException not
Error.
For this, we can't Integrate springboot, or there have any other method to do
this, please tell me, thank you.
--
This message was sent by Atlassian JIRA
(v7.6.14#76016)