Interface FSM<S,D>
- All Superinterfaces:
Actor,ActorLogging,Listeners
- All Known Subinterfaces:
LoggingFSM<S,D>
- All Known Implementing Classes:
AbstractFSM,AbstractFSMWithStash,AbstractLoggingFSM,ClusterSingletonManager
object A {
trait State
case class One extends State
case class Two extends State
case class Data(i : Int)
}
class A extends Actor with FSM[A.State, A.Data] {
import A._
startWith(One, Data(42))
when(One) {
case Event(SomeMsg, Data(x)) => ...
case Event(SomeOtherMsg, _) => ... // when data not needed
}
when(Two, stateTimeout = 5 seconds) { ... }
initialize()
}
Within the partial function the following values are returned for effecting state transitions:
- stay for staying in the same state
- stay using Data(...) for staying in the same state, but with
different data
- stay forMax 5.millis for staying with a state timeout; can be
combined with using
- goto(...) for changing into a different state; also supports
using and forMax
- stop for terminating this FSM actor
Each of the above also supports the method replying(AnyRef) for
sending a reply before changing state.
While changing state, custom handlers may be invoked which are registered
using onTransition. This is meant to enable concentrating
different concerns in different places; you may choose to use
when for describing the properties of a state, including of
course initiating transitions, but you can describe the transitions using
onTransition to avoid having to duplicate that code among
multiple paths which lead to a transition:
onTransition {
case Active -> _ => cancelTimer("activeTimer")
}
Multiple such blocks are supported and all of them will be called, not only the first matching one.
Another feature is that other actors may subscribe for transition events by
sending a SubscribeTransitionCallback message to this actor.
Stopping a listener without unregistering will not remove the listener from the
subscription list; use UnsubscribeTransitionCallback before stopping
the listener.
State timeouts set an upper bound to the time which may pass before another message is received in the current state. If no external message is available, then upon expiry of the timeout a StateTimeout message is sent. Note that this message will only be received in the state for which the timeout was set and that any message received will cancel the timeout (possibly to be started again by the next transition).
Another feature is the ability to install and cancel single-shot as well as repeated timers which arrange for the sending of a user-specified message:
setTimer("tock", TockMsg, 1 second, true) // repeating
setTimer("lifetime", TerminateMsg, 1 hour, false) // single-shot
cancelTimer("tock")
isTimerActive("tock")
-
Nested Class Summary
Nested ClassesModifier and TypeInterfaceDescriptionstatic classThis extractor is just convenience for matching a (S, S) pair, including a reminder what the new state is.static final classMessage type which is sent directly to the subscribed actor inpekko.actor.FSM.SubscribeTransitionCallBackbefore sending anypekko.actor.FSM.Transitionmessages.static classstatic final classAll messages sent to thepekko.actor.FSMwill be wrapped inside anEvent, which allows pattern matching to extract both state and data.static classstatic final classSignifies that thepekko.actor.FSMis shutting itself down because of an error, e.g.static classstatic classINTERNAL APIstatic classINTERNAL APIstatic final classLog Entry of thepekko.actor.LoggingFSM, can be obtained by callinggetLog.static classstatic classDefault reason if callingstop().static classA partial function value which does not match anything and can be used to “reset”whenUnhandledandonTerminationhandlers.static interfaceReason why thispekko.actor.FSMis shutting down.static classReason given when someone was callingsystem.stop(fsm)from outside; also applies toStopsupervision directive.static classINTERNAL API Using a subclass for binary compatibility reasonsstatic classINTERNAL APIstatic classstatic classThis captures all of the managed state of thepekko.actor.FSM: the state name, the state data, possibly custom timeout, stop reason and replies accumulated while processing the last message.static classThis case object is received in case of a state timeout.static final classCase class representing the state of thepekko.actor.FSMwithin theonTerminationblock.static classstatic final classSend this to anpekko.actor.FSMto request first theFSM.CurrentStateand then a series ofFSM.Transitionupdates.static classstatic final classINTERNAL APIstatic classstatic interfaceINTERNAL APIstatic final classstatic final classMessage type which is used to communicate transitions between states to all subscribed listeners (usepekko.actor.FSM.SubscribeTransitionCallBack).static classstatic final classUnsubscribe frompekko.actor.FSM.Transitionnotifications which was effected by sending the correspondingpekko.actor.FSM.SubscribeTransitionCallBack.static classNested classes/interfaces inherited from interface org.apache.pekko.actor.Actor
Actor.emptyBehavior$, Actor.ignoringBehavior$ -
Method Summary
Modifier and TypeMethodDescriptionThis extractor is just convenience for matching a (S, S) pair, including a reminder what the new state is.voidapplyState(FSM.State<S, D> nextState) voidcancelTimer(String name) voidcurrentState_$eq(FSM.State<S, D> x$1) booleanEvent()voidgeneration_$eq(long x$1) voidvoidhandleTransition(S prev, S next) voidbooleanbooleanisTimerActive(String name) voidlogTermination(FSM.Reason reason) By defaultpekko.actor.FSM.Failureis logged at error level and other reason types are not logged.voidmakeTransition(FSM.State<S, D> nextState) voidnextState_$eq(FSM.State<S, D> x$1) voidonTermination(scala.PartialFunction<FSM.StopEvent<S, D>, scala.runtime.BoxedUnit> terminationHandler) voidonTransition(scala.PartialFunction<scala.Tuple2<S, S>, scala.runtime.BoxedUnit> transitionHandler) voidvoidThis case object is received in case of a state timeout.voidvoidpostStop()User overridable callback.voidprocessEvent(FSM.Event<D> event, Object source) voidprocessMsg(Object value, Object source) scala.PartialFunction<Object,scala.runtime.BoxedUnit> receive()Scala API: This defines the initial actor behavior, it must return a partial function with the actor logic.voidregister(S name, scala.PartialFunction<FSM.Event<D>, FSM.State<S, D>> function, scala.Option<scala.concurrent.duration.FiniteDuration> timeout) voidsetStateTimeout(S state, scala.Option<scala.concurrent.duration.FiniteDuration> timeout) voidstartSingleTimer(String name, Object msg, scala.concurrent.duration.FiniteDuration delay) voidstartTimer(String name, Object msg, scala.concurrent.duration.FiniteDuration timeout, FSM.TimerMode mode) voidstartTimerAtFixedRate(String name, Object msg, scala.concurrent.duration.FiniteDuration interval) voidstartTimerWithFixedDelay(String name, Object msg, scala.concurrent.duration.FiniteDuration delay) voidSet initial state.scala.Option<scala.concurrent.duration.FiniteDuration>This case object is received in case of a state timeout.stay()Produce "empty" transition descriptor.stop()Produce change descriptor to stop this FSM actor with reason "Normal".stop(FSM.Reason reason) Produce change descriptor to stop this FSM actor including specified reason.stop(FSM.Reason reason, D stateData) Produce change descriptor to stop this FSM actor including specified reason.voidCallonTerminationhook; if you want to retain this behavior when overriding make sure to callsuper.postStop().voidvoidterminateEvent_$eq(scala.PartialFunction<FSM.StopEvent<S, D>, scala.runtime.BoxedUnit> x$1) voidtimeoutFuture_$eq(scala.Option<Cancellable> x$1) voidtransitionEvent_$eq(scala.collection.immutable.List<scala.PartialFunction<scala.Tuple2<S, S>, scala.runtime.BoxedUnit>> x$1) voidwhen(S stateName, scala.concurrent.duration.FiniteDuration stateTimeout, scala.PartialFunction<FSM.Event<D>, FSM.State<S, D>> stateFunction) Insert a new StateFunction at the end of the processing chain for the given state.scala.concurrent.duration.FiniteDurationvoidMethods inherited from interface org.apache.pekko.actor.Actor
aroundPostRestart, aroundPostStop, aroundPreRestart, aroundPreStart, aroundReceive, context, org$apache$pekko$actor$Actor$_setter_$context_$eq, org$apache$pekko$actor$Actor$_setter_$self_$eq, postRestart, preRestart, preStart, self, sender, supervisorStrategy, unhandledMethods inherited from interface org.apache.pekko.actor.ActorLogging
_log_$eq, logMethods inherited from interface org.apache.pekko.routing.Listeners
gossip, gossip$default$2, listenerManagement, listeners, org$apache$pekko$routing$Listeners$_setter_$listeners_$eq
-
Method Details
-
org$apache$pekko$actor$FSM$_setter_$Event_$eq
-
org$apache$pekko$actor$FSM$_setter_$StopEvent_$eq
-
org$apache$pekko$actor$FSM$_setter_$StateTimeout_$eq
This case object is received in case of a state timeout. -
super$postStop
void super$postStop()CallonTerminationhook; if you want to retain this behavior when overriding make sure to callsuper.postStop().Please note that this method is called by default from
preRestart(), so override that one ifonTerminationshall not be called during restart. -
Event
FSM.Event$ Event() -
StopEvent
FSM.StopEvent$ StopEvent() -
$minus$greater
FSM.$minus$greater$ $minus$greater()This extractor is just convenience for matching a (S, S) pair, including a reminder what the new state is. -
StateTimeout
FSM.StateTimeout$ StateTimeout()This case object is received in case of a state timeout. -
when
void when(S stateName, scala.concurrent.duration.FiniteDuration stateTimeout, scala.PartialFunction<FSM.Event<D>, FSM.State<S, D>> stateFunction) Insert a new StateFunction at the end of the processing chain for the given state. If the stateTimeout parameter is set, entering this state without a differing explicit timeout setting will trigger a StateTimeout event; the same is true when using #stay.- Parameters:
stateName- designator for the statestateTimeout- default state timeout for this statestateFunction- partial function describing response to input
-
when$default$2
scala.concurrent.duration.FiniteDuration when$default$2() -
startWith
void startWith(S stateName, D stateData, scala.Option<scala.concurrent.duration.FiniteDuration> timeout) Set initial state. Call this method from the constructor before theinitialize()method. If different state is needed after a restart this method, followed byinitialize(), can be used in the actor life cycle hookspekko.actor.Actor#preStartandpekko.actor.Actor#postRestart.- Parameters:
stateName- initial state designatorstateData- initial state datatimeout- state timeout for the initial state, overriding the default timeout for that state
-
startWith$default$3
scala.Option<scala.concurrent.duration.FiniteDuration> startWith$default$3() -
stay
Produce "empty" transition descriptor. Return this from a state function when no state change is to be effected.No transition event will be triggered by
stay(). If you want to trigger an event likeS -> SforonTransitionto handle usegotoinstead.- Returns:
- descriptor for staying in current state
-
stop
Produce change descriptor to stop this FSM actor with reason "Normal". -
stop
Produce change descriptor to stop this FSM actor including specified reason. -
stop
Produce change descriptor to stop this FSM actor including specified reason. -
transform
-
startTimerWithFixedDelay
-
startTimerAtFixedRate
-
startSingleTimer
-
startTimer
void startTimer(String name, Object msg, scala.concurrent.duration.FiniteDuration timeout, FSM.TimerMode mode) -
cancelTimer
-
isTimerActive
-
setStateTimeout
-
isStateTimerActive
boolean isStateTimerActive() -
onTransition
-
total2pf
-
onTermination
void onTermination(scala.PartialFunction<FSM.StopEvent<S, D>, scala.runtime.BoxedUnit> terminationHandler) -
whenUnhandled
-
initialize
void initialize() -
stateName
S stateName() -
stateData
D stateData() -
nextStateData
D nextStateData() -
debugEvent
boolean debugEvent() -
currentState_$eq
-
timeoutFuture_$eq
-
nextState_$eq
-
generation_$eq
void generation_$eq(long x$1) -
register
-
handleEvent_$eq
-
terminateEvent_$eq
-
transitionEvent_$eq
-
handleTransition
-
receive
scala.PartialFunction<Object,scala.runtime.BoxedUnit> receive()Description copied from interface:ActorScala API: This defines the initial actor behavior, it must return a partial function with the actor logic. -
processMsg
-
processEvent
-
applyState
-
makeTransition
-
postStop
void postStop()Description copied from interface:ActorUser overridable callback. Is called asynchronously after 'actor.stop()' is invoked. Empty default implementation. -
terminate
-
logTermination
By defaultpekko.actor.FSM.Failureis logged at error level and other reason types are not logged. It is possible to override this behavior.
-