Я пытаюсь протестировать новую функцию Akka 2.4 - PersistentFSM
(http://doc.akka.io/docs/akka/2.4.0/scala/persistence.html#Persistent_FSM) с помощью простого примера ниже.PersistentFSM не сохраняется в журнале
В этом примере генерируется 5 случайных целых чисел и объявляется в последовательности. Мне бы хотелось, чтобы это продолжалось, и при следующем запуске приложения продолжайте добавлять существующую последовательность чисел. Текущая документация на PersistentFSM
немного скудна, и нет четкого способа сделать эту работу. Есть идеи?
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"
Можете ли вы уточнить, какой тест вы проводите, чтобы установить, сохраняются ли события? – mattinbits
@mattinbits на данный момент я даже не уверен, как заставить его работать. Это, кажется, объединенная функциональность 'FSM' и' PersistentActor' без полного примера. Из документации: «PersistentFSM обрабатывает входящие сообщения в формате FSM, а его внутреннее состояние сохраняется как последовательность изменений, которые позже называются событиями домена». - это предполагает другой подход от обычного метода 'persist', который теперь даже устарел. – Caballero