Не в состоянии упорствовать актер - PullRequest
0 голосов
/ 08 ноября 2018

Я хочу сохранять события в Акке только в случае сбоя в актере. Я пытаюсь следующий код для достижения постоянства.

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

...