2017-02-14 13:10:23 +02:00
|
|
|
package scala.docs.persistence
|
2013-10-15 09:01:07 +02:00
|
|
|
|
2014-05-21 01:35:21 +02:00
|
|
|
//#persistent-actor-example
|
2013-10-15 09:01:07 +02:00
|
|
|
import akka.actor._
|
|
|
|
|
import akka.persistence._
|
|
|
|
|
|
2014-06-26 13:56:01 +02:00
|
|
|
case class Cmd(data: String)
|
|
|
|
|
case class Evt(data: String)
|
2013-10-15 09:01:07 +02:00
|
|
|
|
2014-06-26 13:56:01 +02:00
|
|
|
case class ExampleState(events: List[String] = Nil) {
|
|
|
|
|
def updated(evt: Evt): ExampleState = copy(evt.data :: events)
|
|
|
|
|
def size: Int = events.length
|
2013-10-15 09:01:07 +02:00
|
|
|
override def toString: String = events.reverse.toString
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-26 13:56:01 +02:00
|
|
|
class ExamplePersistentActor extends PersistentActor {
|
|
|
|
|
override def persistenceId = "sample-id-1"
|
|
|
|
|
|
2013-10-15 09:01:07 +02:00
|
|
|
var state = ExampleState()
|
|
|
|
|
|
|
|
|
|
def updateState(event: Evt): Unit =
|
2014-06-26 13:56:01 +02:00
|
|
|
state = state.updated(event)
|
2013-10-15 09:01:07 +02:00
|
|
|
|
|
|
|
|
def numEvents =
|
|
|
|
|
state.size
|
|
|
|
|
|
2014-01-19 17:46:32 +01:00
|
|
|
val receiveRecover: Receive = {
|
2013-12-03 16:34:26 +01:00
|
|
|
case evt: Evt => updateState(evt)
|
|
|
|
|
case SnapshotOffer(_, snapshot: ExampleState) => state = snapshot
|
2013-10-15 09:01:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
val receiveCommand: Receive = {
|
2013-12-03 16:34:26 +01:00
|
|
|
case Cmd(data) =>
|
2013-10-15 09:01:07 +02:00
|
|
|
persist(Evt(s"${data}-${numEvents}"))(updateState)
|
2013-12-03 16:34:26 +01:00
|
|
|
persist(Evt(s"${data}-${numEvents + 1}")) { event =>
|
2013-10-15 09:01:07 +02:00
|
|
|
updateState(event)
|
|
|
|
|
context.system.eventStream.publish(event)
|
|
|
|
|
}
|
2013-12-03 16:34:26 +01:00
|
|
|
case "snap" => saveSnapshot(state)
|
|
|
|
|
case "print" => println(state)
|
2013-10-15 09:01:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
2014-05-21 01:35:21 +02:00
|
|
|
//#persistent-actor-example
|
2013-10-15 09:01:07 +02:00
|
|
|
|
2014-05-21 01:35:21 +02:00
|
|
|
object PersistentActorExample extends App {
|
2013-10-15 09:01:07 +02:00
|
|
|
|
|
|
|
|
val system = ActorSystem("example")
|
2014-06-26 13:56:01 +02:00
|
|
|
val persistentActor = system.actorOf(Props[ExamplePersistentActor], "persistentActor-4-scala")
|
|
|
|
|
|
|
|
|
|
persistentActor ! Cmd("foo")
|
|
|
|
|
persistentActor ! Cmd("baz")
|
|
|
|
|
persistentActor ! Cmd("bar")
|
|
|
|
|
persistentActor ! "snap"
|
|
|
|
|
persistentActor ! Cmd("buzz")
|
|
|
|
|
persistentActor ! "print"
|
2013-10-15 09:01:07 +02:00
|
|
|
|
2016-04-14 11:36:24 +02:00
|
|
|
Thread.sleep(10000)
|
2014-08-25 15:49:28 +02:00
|
|
|
system.terminate()
|
2013-10-15 09:01:07 +02:00
|
|
|
}
|