package scala.docs.persistence //#persistent-actor-example 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 { 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 Cmd(data) => persist(Evt(s"${data}-${numEvents}")) { event => updateState(event) context.system.eventStream.publish(event) if (lastSequenceNr % snapShotInterval == 0 && lastSequenceNr != 0) saveSnapshot(state) } 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 ! Cmd("foo") persistentActor ! Cmd("baz") persistentActor ! Cmd("bar") persistentActor ! Cmd("buzz") persistentActor ! "print" Thread.sleep(10000) system.terminate() }