Qual è la differenza tra Futures.addCallBack()
e Futures.transform()
in Google Guava Concurrency.Differenza tra Futures.addCallBack() e Futures.transform() in Google Guava Concorrenza
Come per la documentazione:
Futures.addCallBack():
addCallback(ListenableFuture<V> future, FutureCallback<? super V> callback)
registri separati successo e fallimento callback da eseguire quando il calcolo del futuro è completa o, se il calcolo è già completo, immediatamente.
Futures.transform():
transform(ListenableFuture<I> input, AsyncFunction<? super I,? extends O> function)
Restituisce un nuovo ListenableFuture il cui risultato è asincrono derivato dal risultato del futuro dato.
Come da mia conoscenza, addCallback()
registrerà la chiamata riuscita o l'errore quando l'elaborazione asincrona è completata. In questo caso possiamo gestire l'out put in base a condizioni di successo o di fallimento (esempio: logging, controllo di flusso, ecc.). e transform()
restituiscono solo l'oggetto asincrono. Quindi la differenza è solo Callback ?.
- se la mia comprensione è corretta?
- Qual è il migliore da utilizzare con l'elaborazione asincrona?
- Se è necessario chiamare più metodi asincroni in una sequenza, esiste una procedura consigliata?
- Qual è la differenza tra l'utilizzo di
AsyncFunction
eFunction
intransform(ListenableFuture<I> input, Function/AsyncFunction <? super I,? extends O> function)
? (AsyncFunction utilizzato solo per annidatoFutures.transform()
?)
Quello che ho cercato:
cerco di scrivere codice come qui di seguito, se questa è una buona pratica o no.
public ListenableFuture<MyObject> doSomething() {
logger.info("Entered in dosomething() Method.");
ListeningExecutorService executor =
MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(50));
ListenableFuture<MyObject> myAsyncObject =
calculator.calculateSomething(input);
//internally calculator.calculateSomething() have multiple asynchronous
// calls and I am using Futures.transform(), without callback.
Futures.addCallback(myAsyncObject, new FutureCallback<MyObject>() {
public void onSuccess(MyObject result) {
logger.info("Calculation Completed successfully.");
//TODO: check for success and log it.
}
public void onFailure(Throwable thrown) {
logErrorDetails(thrown);
}
}, executor);
executor.shutdown();
return myAsyncObject;
}
La differenza sta nel modo in cui lo si utilizza. Le trasformazioni possono essere collegate insieme mentre i normali callback stanno terminando. – ooxi
Si noti che si incontreranno problemi nell'esecuzione della callback (in futuro) su un executor che si spegne ** now ** (in sequenza con l'aggiunta del callback). Inoltre, di solito non si desidera creare un esecutore diverso per ogni invocazione del metodo. –