Interface Stash

All Superinterfaces:
Actor, RequiresMessageQueue<DequeBasedMessageQueueSemantics>, StashSupport, UnrestrictedStash
All Known Subinterfaces:
AbstractPersistentActorLike, AsyncWriteProxy, AtLeastOnceDelivery, AtLeastOnceDeliveryLike, Eventsourced, PersistenceStash, PersistentActor, PersistentFSM<S,D,E>
All Known Implementing Classes:
AbstractActorWithStash, AbstractFSMWithStash, AbstractPersistentActor, AbstractPersistentActorWithAtLeastOnceDelivery, AbstractPersistentActorWithTimers, AbstractPersistentFSM, AbstractPersistentLoggingFSM, JournalPerfSpec.BenchActor, PersistencePluginProxy, PersistentShardCoordinator, UntypedAbstractActorWithStash

The Stash trait enables an actor to temporarily stash away messages that can not or should not be handled using the actor's current behavior.

Example:
    class ActorWithProtocol extends Actor with Stash {
      def receive = {
        case "open" =>
          unstashAll()
          context.become({
            case "write" => // do writing...
            case "close" =>
              unstashAll()
              context.unbecome()
            case msg => stash()
          }, discardOld = false)
        case "done" => // done
        case msg    => stash()
      }
    }
  

Note that the Stash trait can only be used together with actors that have a deque-based mailbox. By default Stash based actors request a Deque based mailbox since the stash trait extends RequiresMessageQueue[DequeBasedMessageQueueSemantics]. You can override the default mailbox provided when DequeBasedMessageQueueSemantics are requested via config:

    pekko.actor.mailbox.requirements {
      "org.apache.pekko.dispatch.BoundedDequeBasedMessageQueueSemantics" = your-custom-mailbox
    }
  
Alternatively, you can add your own requirement marker to the actor and configure a mailbox type to be used for your marker.

For a Stash that also enforces unboundedness of the deque see pekko.actor.UnboundedStash. For a Stash that does not enforce any mailbox type see pekko.actor.UnrestrictedStash.

Note that the Stash trait must be mixed into (a subclass of) the Actor trait before any trait/class that overrides the preRestart callback. This means it's not possible to write Actor with MyActor with Stash if MyActor overrides preRestart.