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 {
|
||||
sealed trait Mood
|
||||
case object Happy extends Mood
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue