我处理管道结果的代码看起来像这样(为简洁起见,有些代码剪掉了):
PipelineResult result = pipeline.run();
switch (result.getState()) {
case DONE: {
handleDone();
break;
}
case FAILED: {
handleFailed();
break;
}
case CANCELLED: {
handleCancelled();
break;
}
case UNKNOWN:
case RUNNING:
case STOPPED: {
handleUnknownRunningStopped();
break;
}
default: {
assert false;
throw new IllegalStateException();
}
}
但是,我注意到,而不是返回枚举PipelineResult.State
的值,例如FAILED
或CANCELLED
,会抛出异常:
DataflowJobExecutionException
DataflowJobCancelledException
处理管道结果的正确方法(以编程方式)是什么?
答案 0 :(得分:3)
DataflowPipelineRunners都返回PipelineResult,它允许您查询管道的当前状态。作业提交后,DataflowPipelineRunner会立即返回PipelineResult,但BlockingDataflowPipelineRunner在作业完成之前不会返回它。
此外,如果作业未成功完成,BlockingDataflowPipeline运行器会抛出异常 - 因为您已指定阻塞运行(),我们假设您想知道是否出现问题。因此,如果您对Blocking Runner进行了硬编码,那么依赖异常是一种处理失败的简单方法。
请注意,您编写的代码段使用了更常规的PipelineResult选项,但不能与非阻塞运行程序一起使用,因为这将在作业仍在运行时返回结果。