2016-02-15 104 views
1

我處理我的管道結果代碼如下所示(一些剪斷,爲了簡潔起見):獲得管道結果的正確方法是什麼?

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的價值FAILEDCANCELLED,拋出一個異常:

  1. 對於失敗的作業,一個DataflowJobExecutionException拋出
  2. 對於取消的作業,一個DataflowJobCancelledException拋出

什麼是正確的方式(編程)處理管道的結果?

回答

3

兩個DataflowPipelineRunners回報,使您可以查詢管線的當前狀態PipelineResult。 DataflowPipelineRunner在作業提交後立即返回PipelineResult,但BlockingDataflowPipelineRunner不會在作業完成之前將其返回。

另外,如果作業未成功完成,BlockingDataflowPipeline運行器會引發異常 - 因爲您已指定了阻塞運行(),因此我們假設您想知道是否出現問題。因此,如果您對Blocking Runner進行了硬編碼,那麼依靠異常處理故障是一種簡單的方法。

請注意,您編寫的代碼片段使用更一般的PipelineResult選項,但不能與非阻塞的runner一起使用,因爲這將在作業仍在運行時返回結果。

相關問題