J'ai une liste de Guava ListenableFuture
instances et le printemps DeferredResult
. Je veux définir le résultat pour le premier succès de la liste ou si le délai d'expiration n'a pas encore expiré pour obtenir un résultat positif de tous les contrats à terme. Voici mon essai:Comment puis-je combiner DeferredResult avec la liste ListenableFuture?
DeferredResult<String> foo() {
DeferredResult<String> result = new DeferredResult<>(3000L);
List<String> resps = newArrayList();
List<ListenableFuture<String>> fList = ...
fList.forEach(f -> Futures.addCallback(f, new FutureCallback<String>() {
@Override
public void onSuccess(String resp) {
resps.add(resp);
}
@Override
public void onFailure(Throwable t) {
// NOP
}
}));
ListenableFuture<List<String>> f0 = Futures.successfulAsList(fList);
Futures.addCallback(f0, new FutureCallback<List<String>>() {
@Override
public void onSuccess(List<String> r) {
if (!result.hasResult()) {
result.
if (r != null) {
result.setResult(...);
}
}
}
@Override
public void onFailure(Throwable t) {
// NOP
}
});
return result;
}
Mon code ne fonctionne pas parce qu'il attend un résultat de tous les contrats à terme, mais je dois le résultat le plus rapide par rapport à délai d'attente DeferredResult. Comment puis-je le réparer?
Veuillez expliquer ce que cela fait. Comment avez-vous atteint _Je veux définir le résultat pour le premier succès de la liste ou si le délai d'attente n'expire pas encore pour obtenir un résultat positif de tous les contrats à terme? L'appel à 'hasResult' est inutile. 'setResult' renvoie' false' si le résultat a déjà été défini. –