pekko/akka-docs/rst/scala/code/docs/persistence/PersistentActorExample.scala
Richard Imaoka ea9617aa25 Update Persistence Snapshot documentation (#22419)
* Update Persistence Snapshot documentation (#22233)

* Use copy of ExampleState as it is mutable
2017-03-14 13:30:32 +01:00

60 lines
1.5 KiB
Scala

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()
}