2016-05-17 16 views
1

で先物を連鎖するとき:処理の例外は、次のコードでの例外処理についてグアバ

ListenableFuture<BufferedImage> imgFuture = downloadExecutor 
        .submit(new Downloader(url)); 
      ListenableFuture<BufferedImage> resizeFuture = Futures.transformAsync(
        imgFuture, new AsyncFunction<BufferedImage, BufferedImage>() 
        { 
         @Override 
         public ListenableFuture<BufferedImage> apply(
           BufferedImage input) throws Exception 
         { 
          ListenableFuture<BufferedImage> resizedFuture = null; 
          if (input != null) 
          { 
           resizedFuture = actionExecutor 
             .submit(new ResizeImageAction(input)); 
          } 
          return resizedFuture; 
         } 
        }); 

      ListenableFuture<BufferedImage> grayFuture = Futures 
        .transformAsync(resizeFuture, input -> { 
         return actionExecutor 
           .submit(new ToGrayImageAction(input)); 
        }); 

キュータにsumbittedすべてのアクションは、例外を発生させることが可能と仮定すると、どのようにこのコード振る舞います。

transformAsync()メソッドは、例外を発生させたNULLや先物を連鎖しないことを知っていますか?使用するCheckedFutureここで私を助けますか?もしそうなら、どうすればいいですか?

ありがとう!!!!

答えて

1

例外がスローされたことはわかっていますが、これは完全に正当な値なのでヌルについてはわかりません。最初のListenableFutureに例外がスローされると、すべてのトランスフォーマーに伝播されます。onFailureコールバックが呼び出されますが、変換されることはありません(変換する値がないため)。

transformAsyncへのJavadoc:

関数の結果を保持し、将来(入力が成功した場合)、または、元の入力の故障@return(ない場合)

簡単な例:

ListenableFuture<Integer> nullFuture = executor.submit(() -> null); 
ListenableFuture<Integer> exceptionFuture = executor.submit(() -> { 
    throw new RuntimeException(); 
}); 

// Replace first argument with exceptionFuture to get another result 
ListenableFuture<Integer> transformer = Futures.transformAsync(nullFuture, i -> { 
    System.out.println(i); 
    return Futures.immediateCheckedFuture(1); 
}, executor); 

Futures.addCallback(transformer, new FutureCallback<Integer>() { 
    @Override 
    public void onSuccess(Integer result) { 
     System.out.println(result); 
    } 

    @Override 
    public void onFailure(Throwable t) { 
     System.out.println(t); 
    } 
}); 

nullFutureの場合、 "nullと1"が出力されますが、exceptionFutureの場合は "java.lang.RuntimeE例外がその変圧器に伝播されたため、「xception」が出力されます。

+0

hmmmだから、私はいくつかの 'transformAsync'を連鎖したいと思ったら、 'Futures.addCallback()'を使う必要がありますか? – whomaniac

+0

@whomaniacいいえ、そうすべきではありません。これは、例外がスローされた場合に変換が行われないことを示す単なる例です。コールバックはそれを印刷するためだけに使用され、チェーン変換には使用されません – qwwdfsad