无法坚持演员

时间:2018-11-08 07:09:02

标签: scala akka akka-persistence

我只想在actor发生故障时才在Akka中保留事件。我正在尝试以下代码来实现持久性。

package persistence

import akka.actor._
import akka.persistence._

case class Cmd(data: String)
case class Evt(data: String)

case class ExampleState(events: List[String] = Nil) {
  def updated(evt: Evt): ExampleState = copy(evt.data :: events)
  def size: Int = events.length
  override def toString: String = events.reverse.toString
}

class ExamplePersistentActor extends PersistentActor {
    var list = new java.util.ArrayList[String]
  override def postStop (): Unit = {
    println("inside postStop")
    println(list.size())
    import scala.collection.JavaConversions._
    for( data <- list) {
      persist(Evt(s"${data}-${numEvents}")) { event ⇒
        println("persisting")
        updateState(event)
        context.system.eventStream.publish(event)
        if (lastSequenceNr % snapShotInterval == 0 && lastSequenceNr != 0)
          saveSnapshot(state)
      }
    }
  }
  override def persistenceId = "sample-id-1"

  var state = ExampleState()

  def updateState(event: Evt): Unit =
    state = state.updated(event)

  def numEvents =
    state.size

  val receiveRecover: Receive = {
    case evt: Evt                                 ⇒ updateState(evt)
    case SnapshotOffer(_, snapshot: ExampleState) ⇒ state = snapshot
  }

  val snapShotInterval = 1000
  val receiveCommand: Receive = {
    case 'test =>
      println("test")
    case Cmd(data) ⇒
      println(data)
      list.add(data)
    case "print" ⇒ println(state)
  }
}
//#persistent-actor-example

object PersistentActorExample extends App {

  val system = ActorSystem("example")
  val persistentActor = system.actorOf(Props[ExamplePersistentActor], "persistentActor-4-scala")
  persistentActor ! 'test
  persistentActor ! Cmd("foo")
  persistentActor ! Cmd("baz")
  persistentActor ! Cmd("bar")
  persistentActor ! Cmd("buzz")
  persistentActor ! "print"
  Thread.sleep(10000)
  persistentActor ! PoisonPill
  system.terminate()
}

有人可以在上述代码中为我提供帮助吗?这段代码是实现我想要的最佳方法吗?还是我必须寻找其他方式?

我可以想到的另一种方法是添加一个shutdown hook,但我不知道我是否能够在akka persistence中使用shutdown hook

0 个答案:

没有答案