J'ai envisagé une interface générique/annulable générique pour les demandes/réponses asynchrones. Les exigences sont les suivantes, il doit:Conception d'une interface d'opération asynchrone annulable générique
- appels asynchrones Support
- Soyez résiliable
- générique
- Demande de support/réponse
- support soit de retour dans le thread courant ou traitement de la réponse en une autre réponse
Alors, voici mon premier coup:
interface AsyncOperation<INPUT, OUTPUT> {
Future<OUTPUT> execute(INPUT in, AsyncCallback<OUTPUT> callback);
}
interface AsyncCallback<OUTPUT> {
void done(OUTPUT output);
}
Utilisation:
// completely async operation
operation.execute("Test", new AsyncCallback<String> {
public void done(String output) {
// process result...
}
});
// sync operation with cancellation after timeout
Future<String> future = operation.execute("Test", null);
try {
String result = future.get(1000);
} catch(TimeoutException ex) {
future.cancel();
}
Inconvénients
- Il est compliqué
- Il ne supporte qu'un paramètre de requête unique - pas trop préoccupé par celui-ci
- Le single 'done' signifie que les exceptions doivent être communiquées via le 'done', cela pourrait être résolu en ayant un onSuccess et onException (et onFin ? Allié) dans AsyncCallback mais il serait encore plus bavard
Pour un certain contexte, les méthodes de service Google Protocol Buffers suivent un modèle relativement similaire:
void [methodname](RpcController controller,
[RequestClass] request, RpcCallback<[ResponseClass]> callback);
une meilleure idée?
Vous êtes à droite, prendre un rappel et renvoyer un futur est un peu étrange mais c'est pour soutenir le cas d'utilisation d'annulation ainsi que le cas où vous pourriez vouloir dire attendre 5 secondes, si l'opération est terminée retourner le résultat de l'opération, si ce n'est pas le cas, retournez simplement que c'est un 'traitement occupé'. Le rappel effectue ensuite le traitement effectif du résultat. –
Plan astucieux pour se débarrasser de la restriction des paramètres d'entrée.Le cas d'utilisation que j'ai à l'esprit est de pouvoir créer des implémentations génériques de AsyncOperation qui limitent/limitent le nombre de threads utilisés, etc. –