It's not actually shown in docs anywhere, only exists for Scala, and has questionable semantics. If #24473 is ever revived I guess we should/can reintroduce the sample, include in docs, make it work etc.
This commit is contained in:
parent
a101ce4833
commit
83452be2ff
1 changed files with 0 additions and 81 deletions
|
|
@ -218,87 +218,6 @@ object PersistentActorCompileOnlyTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
object Rehydrating {
|
|
||||||
type Id = String
|
|
||||||
|
|
||||||
sealed trait Command
|
|
||||||
case class AddItem(id: Id) extends Command
|
|
||||||
case class RemoveItem(id: Id) extends Command
|
|
||||||
case class GetTotalPrice(sender: ActorRef[Int]) extends Command
|
|
||||||
/* Internal: */
|
|
||||||
case class GotMetaData(data: MetaData) extends Command
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Items have all kinds of metadata, but we only persist the 'id', and
|
|
||||||
* rehydrate the metadata on recovery from a registry
|
|
||||||
*/
|
|
||||||
case class Item(id: Id, name: String, price: Int)
|
|
||||||
case class Basket(items: Seq[Item]) {
|
|
||||||
def updatedWith(data: MetaData): Basket = ???
|
|
||||||
}
|
|
||||||
|
|
||||||
sealed trait Event
|
|
||||||
case class ItemAdded(id: Id) extends Event
|
|
||||||
case class ItemRemoved(id: Id) extends Event
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The metadata registry
|
|
||||||
*/
|
|
||||||
case class GetMetaData(id: Id, sender: ActorRef[MetaData])
|
|
||||||
case class MetaData(id: Id, name: String, price: Int)
|
|
||||||
val metadataRegistry: ActorRef[GetMetaData] = ???
|
|
||||||
|
|
||||||
def isFullyHydrated(basket: Basket, ids: List[Id]) = basket.items.map(_.id) == ids
|
|
||||||
|
|
||||||
val behavior: Behavior[Command] = Behaviors.setup { ctx =>
|
|
||||||
var basket = Basket(Nil)
|
|
||||||
var stash: Seq[Command] = Nil
|
|
||||||
val adapt = ctx.messageAdapter((m: MetaData) => GotMetaData(m))
|
|
||||||
|
|
||||||
def addItem(id: Id, self: ActorRef[Command]) =
|
|
||||||
Effect.persist[Event, List[Id]](ItemAdded(id)).thenRun(_ => metadataRegistry ! GetMetaData(id, adapt))
|
|
||||||
|
|
||||||
EventSourcedBehavior[Command, Event, List[Id]](
|
|
||||||
persistenceId = PersistenceId("basket", "1"),
|
|
||||||
emptyState = Nil,
|
|
||||||
commandHandler = { (state, cmd) =>
|
|
||||||
if (isFullyHydrated(basket, state))
|
|
||||||
cmd match {
|
|
||||||
case AddItem(id) => addItem(id, ctx.self)
|
|
||||||
case RemoveItem(id) => Effect.persist(ItemRemoved(id))
|
|
||||||
case GotMetaData(data) =>
|
|
||||||
basket = basket.updatedWith(data)
|
|
||||||
Effect.none
|
|
||||||
case GetTotalPrice(sender) =>
|
|
||||||
sender ! basket.items.map(_.price).sum
|
|
||||||
Effect.none
|
|
||||||
} else
|
|
||||||
cmd match {
|
|
||||||
case AddItem(id) => addItem(id, ctx.self)
|
|
||||||
case RemoveItem(id) => Effect.persist(ItemRemoved(id))
|
|
||||||
case GotMetaData(data) =>
|
|
||||||
basket = basket.updatedWith(data)
|
|
||||||
if (isFullyHydrated(basket, state)) {
|
|
||||||
stash.foreach(ctx.self ! _)
|
|
||||||
stash = Nil
|
|
||||||
}
|
|
||||||
Effect.none
|
|
||||||
case cmd: GetTotalPrice =>
|
|
||||||
stash :+= cmd
|
|
||||||
Effect.none
|
|
||||||
}
|
|
||||||
},
|
|
||||||
eventHandler = (state, evt) =>
|
|
||||||
evt match {
|
|
||||||
case ItemAdded(id) => id +: state
|
|
||||||
case ItemRemoved(id) => state.filter(_ != id)
|
|
||||||
}).receiveSignal {
|
|
||||||
case (state, RecoveryCompleted) =>
|
|
||||||
state.foreach(id => metadataRegistry ! GetMetaData(id, adapt))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
object FactoringOutEventHandling {
|
object FactoringOutEventHandling {
|
||||||
sealed trait Mood
|
sealed trait Mood
|
||||||
case object Happy extends Mood
|
case object Happy extends Mood
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue