Scala PersistentFSM不';不要坚持写日记
我试图用下面的简单示例测试Akka 2.4-Scala PersistentFSM不';不要坚持写日记,scala,akka,actor,akka-persistence,Scala,Akka,Actor,Akka Persistence,我试图用下面的简单示例测试Akka 2.4-PersistentFSM()的一个新特性 本例生成5个随机整数并将其分配到序列中。我希望它能够持久化数据,并在应用程序的下一次运行时继续附加到现有的数字序列中。当前关于PersistentFSM的文档有点稀少,并且没有明确的方法来实现这一点。有什么想法吗 TestFSM.scala: import akka.actor.{Actor, ActorSystem, Props} import akka.persistence.fsm.Persistent
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"
PersistentFSM
现在,随着FSM的继续,状态更改和域事件都会隐式地持久化
尽管缺少您链接到的文档,但从代码中可以看出,persistAll
在适当的位置被调用:
建议您测试现有的实现,看看它是否确实存在
编辑:
我能够执行您的代码,没有更改,并查看创建的target/journal
目录。我使用了以下build.sbt
:
name := "Scratch"
version := "1.0"
scalaVersion := "2.11.7"
sbtVersion := "0.13.7"
mainClass := Some("TestFSM")
fork := true
libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.4.0"
libraryDependencies += "com.typesafe.akka" %% "akka-persistence" % "2.4.0"
libraryDependencies += "org.iq80.leveldb" % "leveldb" % "0.7"
libraryDependencies += "org.fusesource.leveldbjni" % "leveldbjni-all" % "1.8"
以及下面的application.conf
:
akka.persistence.journal.plugin = "akka.persistence.journal.leveldb"
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"
我认为
application.conf
是指定特定于应用程序的conf的合适方法,而不是reference.conf
,它是为库设计的。你能详细说明一下你正在做什么测试来确定事件是否得到持久化吗?@mattinbits目前我甚至不知道如何使它工作。这似乎是FSM
和persistentator
的合并功能,没有完整的示例。来自文档:“PersistentFSM以类似于FSM的方式处理传入消息。其内部状态作为一系列更改而持久化,稍后称为域事件。”-这表明了一种不同于通常的persist
方法的方法,该方法现在甚至已被弃用。如果在引擎盖下调用persistAll
,那么这将起作用,不是吗?甚至没有创建文件夹target/journal
,这是使用方法persist
在经典的persistentator
案例中发生的情况。您使用的是akka.persistence.journal.inmem
,顾名思义,它是一个仅内存中的日志。这就是为什么我在上面问你做了什么来测试持久性是否有效。尝试使用akka.persistence.journal.plugin=“akka.persistence.journal.leveldb”谢谢,我没有注意到。我现在已将其更改为akka.persistence.journal.plugin=“akka.persistence.journal.leveldb”
,但没有区别-仍然没有创建日志文件夹。请参见上面的编辑,当我执行代码时,目录已创建。谢谢,它一定是它想要的application.conf,现在一切正常。