Cut the sample using stashing in an EventSourcedBehavior for now #23853 (#28512)

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:
Johan Andrén 2020-01-24 16:33:03 +01:00 committed by GitHub
parent a101ce4833
commit 83452be2ff
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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