2016-05-17 13 views
1

In Bezug auf Behandlung von Ausnahmen in dem folgenden Code:Handhabung Ausnahmen, wenn Verkettungs Futures in Guave

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)); 
        }); 

Unter der Annahme, dass jede Aktion zu einem Testamentsvollstrecker sumbitted eine Ausnahme auslösen kann, wie wird dieser Code verhalten.

Kann die transformAsync() Methode keine Nullen oder Futures verknüpfen, die Ausnahmen ausgelöst haben? Will CheckedFuture helfen mir hier helfen? Wenn ja, wie sollte ich es benutzen?

Danke !!!!

Antwort

1

Es weiß über geworfene Ausnahme, aber nicht über Nullen, weil es vollkommen rechtlichen Wert ist. Wenn in der ersten ListenableFuture Ausnahme ausgelöst wird, wird sie an alle Transformatoren weitergegeben: ihre onFailure Callbacks werden aufgerufen, aber nicht ihre Umwandlung (weil kein Wert zu transformieren ist).

Javadoc zu transformAsync:

@return Eine Zukunft, die

Einfaches Beispiel hält Ergebnis der Funktion (falls die Eingabe erfolgreich) oder den ursprünglichen Eingang des Fehler (wenn nicht):

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); 
    } 
}); 

für die nullFuture "null und 1" werden gedruckt, während für exceptionFuture nur „java.lang.RuntimeE xception "wird gedruckt, da die Exception an ihren Transformer weitergegeben wurde.

+0

hmmm Also wenn ich mehrere 'transformAsync' verketten möchte, muss ich 'Futures.addCallback()' verwenden? – whomaniac

+0

@whomaniac Nein, das sollten Sie nicht, dies ist nur ein Beispiel, um zu zeigen, dass die Umwandlung nicht stattfindet, wenn eine Ausnahme ausgelöst wird. Callback wird nur zum Drucken verwendet, nicht für Kettentransformationen – qwwdfsad