Scala PersistentFSM不';不要坚持写日记

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

我试图用下面的简单示例测试Akka 2.4-
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,现在一切正常。