Dans cet exercice, on suppose qu’on a prgramme (serveur, démon) qui reçoit des messages. Ces messages doivent être loggés dans un fichier pour inspection ultérieure. Ces messages arrivent dans un ordre indéterminé et donc il semble raisonnable d’avoir une tâche qui envoie le message à notre exécuteur pour que le message soit écrit dans le fichier de façon asynchrone quand le fichier est disponible.
On peut imaginer que le logging fait partie d’une application plus conséquente et qu’on ne veut pas bloquer toute l’application pendant qu’on écrit le fichier de logs.
Pour simplifier, on va uniquement logger les logins/logout d’utilisateurs fictifs. Leurs noms sont les suivants:
let names = vec!["Orestis", "Paul", "Florent", "Andres", "Fabien", "Quentin"];
login.txt
et logout.txt
. Il
faut donc créer une fonction créant un fichier en écriture s’il n’existe
pas ou en mode append
s’il existe déjà et retournant son
identifiant (un type File
) comme ressoruce partagée.AsyncWriteFuture
sur lequel vous
implémenterez le trait Future
permettant d’écrire le nom de
la personne se logant/délogant dans un fichier. En cas d’échec on
affiche un message d’erreur avec l’erreur qui a eu lieu. Sinon on
retourne Ok(())
.Finalement, écrivez un programme créant un itérateur contenant avec
les logins/logout à logger dans un futur chacun et
join_all()
le tout à la fin de l’exécution.
Pour cette application vous devez utiliser la librairie
futures-util
et la fonction join_all()
.