J'essaye de tester une nouvelle fonctionnalité de Akka 2.4 - PersistentFSM
(http://doc.akka.io/docs/akka/2.4.0/scala/persistence.html#Persistent_FSM) avec l'exemple simple ci-dessous.PersistentFSM ne persiste pas à journal
Cet exemple génère 5 entiers aléatoires et l'affiche dans la séquence. Ce que je voudrais qu'il fasse est de persister les données et à la prochaine exécution de l'application continue d'ajouter à la séquence existante de nombres. La documentation actuelle sur PersistentFSM
est un peu rare et il n'y a pas de moyen clair de faire ce travail. Des idées?
TestFSM.scala:
import akka.actor.{Actor, ActorSystem, Props}
import akka.persistence.fsm.PersistentFSM
import akka.persistence.fsm.PersistentFSM.FSMState
import scala.reflect._
import scala.util.Random
final case class SetNumber(num: Integer)
sealed trait State extends FSMState
case object Idle extends State {
override def identifier: String = "Idle"
}
case object Active extends State {
override def identifier: String = "Active"
}
sealed trait Data {
def add(number: Integer): Data
}
case object Empty extends Data {
def add(number: Integer) = Numbers(Vector(number))
}
final case class Numbers(queue: Seq[Integer]) extends Data {
def add(number: Integer) = Numbers(queue :+ number)
}
sealed trait DomainEvt
case class SetNumberEvt(num: Integer) extends DomainEvt
class Generator extends Actor with PersistentFSM[State, Data, DomainEvt] {
override def applyEvent(domainEvent: DomainEvt, currentData: Data): Data = {
domainEvent match {
case SetNumberEvt(num) => currentData.add(num)
}
}
override def persistenceId: String = "generator"
override def domainEventClassTag: ClassTag[DomainEvt] = classTag[DomainEvt]
startWith(Idle, Empty)
when(Idle) {
case Event(SetNumber(num), Empty) =>
goto(Active) applying SetNumberEvt(num)
}
when(Active) {
case Event(SetNumber(num), numbers: Data) =>
println(numbers)
stay applying SetNumberEvt(num)
}
initialize()
}
object TestFSM extends App {
val system = ActorSystem()
val actor = system.actorOf(Props[Generator])
actor ! SetNumber(Random.nextInt())
actor ! SetNumber(Random.nextInt())
actor ! SetNumber(Random.nextInt())
actor ! SetNumber(Random.nextInt())
actor ! SetNumber(Random.nextInt())
Thread.sleep(1000)
system.terminate()
}
reference.conf:
akka.persistence.journal.plugin = "akka.persistence.journal.inmem"
akka.persistence.snapshot-store.plugin = "akka.persistence.snapshot-store.local"
akka.persistence.journal.leveldb.dir = "target/journal"
akka.persistence.snapshot-store.local.dir = "target/snapshots"
Pouvez-vous élaborer sur le test que vous faites pour établir si les événements sont persistants ou non? – mattinbits
@mattinbits pour le moment je ne suis même pas sûr de savoir comment le faire fonctionner. Cela semble être une fonctionnalité fusionnée de 'FSM' et' PersistentActor' sans un exemple complet. De la documentation: "PersistentFSM gère les messages entrants d'une manière FSM.L'état interne est persisté comme une séquence de changements, plus tard appelés événements de domaine." - ceci suggère une approche différente de la méthode habituelle 'persist' qui est maintenant même obsolète. – Caballero