TP #10 - Akka
Générateur d'Inbox Item
- Créer un acteur actors.GenerateInboxItemActor qui permet de créer un instance de type models.InboxItem avec des données générées.
package actors;
import akka.actor.AbstractActor;
import akka.actor.ActorRef;
import akka.actor.Props;
import models.InboxItem;
import play.Logger;
import javax.inject.Inject;
import javax.inject.Named;
import java.util.UUID;
public class GenerateInboxItemActor extends AbstractActor {
public static final String NAME = "gen-inbox-item-actor";
@Override
public Receive createReceive() {
return receiveBuilder().
match(Boolean.class, (msg) -> {
String uuid = UUID.randomUUID().toString();
InboxItem item = null;
// TODO créer un object InboxItem
// title = Task + UUID
// url = http://UUID.fr
// note = NOTE + UUID
Logger.info("{} : {}", NAME, item);
}).build();
}
}
- Créer une classe
StartupTask:
public class StartupTask {
private final ActorRef genInboxItemActor;
private final ActorSystem actorSystem;
private final ExecutionContext executionContext;
@Inject
public StartupTask(@Named(GenerateInboxItemActor.NAME) ActorRef genInboxItemActor, ActorSystem actorSystem, ExecutionContext executionContext) {
this.genInboxItemActor = genInboxItemActor;
this.actorSystem = actorSystem;
this.executionContext = executionContext;
this.onStartup();
}
private void onStartup() {
// Démarrage du générateur d'InboxItem
actorSystem.scheduler().schedule(
Duration.create(0, TimeUnit.SECONDS), // initialDelay
Duration.create(5, TimeUnit.SECONDS), // interval
genInboxItemActor,
true, // message,
executionContext,
ActorRef.noSender()
);
}
}
- Mettre à jour le module Guice :
public class Module extends AbstractModule implements AkkaGuiceSupport {
@Override
protected void configure() {
// Choix de l'implémentation de l'interface InboxItemService
bind(InboxItemService.class).to(InboxItemServiceJpa.class);
bindActor(GenerateInboxItemActor.class, GenerateInboxItemActor.NAME);
bind(StartupTask.class).asEagerSingleton();
}
}
Lancer l'application et vérifier le résultat dans la console.
Compléter l'acteur pour qu'il crée bien un objet InboxItem.
Acteur de sauvegarde d'Inbox Item
Créer un acteur actors.SaveInboxItemActor qui reçoit des messages de type models.InboxItem.
Cet acteur insère les données dans la base de données via le service InboxItemService.
Modifier l'acteur actors.GenerateInboxItemActor pour qu'il envoie un message à actors.SaveInboxItemActor à l'issue de la génération de l'instance de type models.InboxItem.
Vérifier que la liste des Inbox Items s'alimente.
Acteur de création d'action TODO
- Ajouter une table todo_item:
CREATE TABLE TODO_ITEM (
ID varchar(255) NOT NULL,
TITLE varchar(255) NOT NULL,
DONE boolean,
DESCRIPTION varchar(255),
PRIMARY KEY (id)
);
Créer le modèle models.TodoItem correspondant à la table ci-dessus.
Créer un acteur actors.CreateTodoItemActor qui reçoit en entrée un identifiant d'Inbox Item.
A partir de cet identifiant, l'acteur génère une instance de models.TodoItem à partir des informations d'Inbox Item.
TodoItem.title = "Do : " + InboxItem.title
TodoItem.description = "Do : " + InboxItem.url + " " + InboxItem.note
TodoItem.done = false
L'instance models.TodoItem est sauvegarder en base de données.
La donnée Inbox Item est supprimée.
Bouton TODO !
- Ajouter un bouton TODO ! dans la page de la liste des Inbox Item.

Ce bouton permet de transformer un Item Box en Todo Item via l'acteur actors.CreateTodoItemActor. Le résultat de l'action dépend de la fin du traitement de l'acteur. L'utilisateur est redirigé vers la page de liste de TODO.
Implémenter la page de liste de Todo Item.
Vérifier le résultat.