Class CallingThreadDispatcher

java.lang.Object
org.apache.pekko.dispatch.MessageDispatcher
org.apache.pekko.testkit.CallingThreadDispatcher
All Implemented Interfaces:
Executor, BatchingExecutor, scala.concurrent.ExecutionContext, scala.concurrent.ExecutionContextExecutor

public class CallingThreadDispatcher extends MessageDispatcher
Dispatcher which runs invocations on the current thread only. This dispatcher does not create any new threads, but it can be used from different threads concurrently for the same actor. The dispatch strategy is to run on the current thread unless the target actor is either suspendSwitch or already running on the current thread (if it is running on a different thread, then this thread will block until that other invocation is finished); if the invocation is not run, it is queued in a thread-local queue to be executed once the active invocation further up the call stack finishes. This leads to completely deterministic execution order if only one thread is used.

Suspending and resuming are global actions for one actor, meaning they can affect different threads, which leads to complications. If messages are queued (thread-locally) during the suspendSwitch period, the only thread to run them upon resume is the thread actually calling the resume method. Hence, all thread-local queues which are not currently being drained (possible, since suspend-queue-resume might happen entirely during an invocation on a different thread) are scooped up into the current thread-local queue which is then executed. It is possible to suspend an actor from within its call stack.

  • Constructor Details

  • Method Details

    • Id

      public static String Id()
    • log

      public LoggingAdapter log()
    • id

      public String id()
      Description copied from class: MessageDispatcher
      Identifier of this dispatcher, corresponds to the full key of the dispatcher configuration.
      Specified by:
      id in class MessageDispatcher
    • createMailbox

      protected CallingThreadMailbox createMailbox(Cell actor, MailboxType mailboxType)
    • shutdown

      protected void shutdown()
      Description copied from class: MessageDispatcher
      Called one time every time an actor is detached from this dispatcher and this dispatcher has no actors left attached Must be idempotent

      INTERNAL API

      Specified by:
      shutdown in class MessageDispatcher
    • throughput

      protected int throughput()
      Description copied from class: MessageDispatcher
      INTERNAL API
      Specified by:
      throughput in class MessageDispatcher
    • throughputDeadlineTime

      protected scala.concurrent.duration.FiniteDuration throughputDeadlineTime()
      Description copied from class: MessageDispatcher
      INTERNAL API
      Specified by:
      throughputDeadlineTime in class MessageDispatcher
    • registerForExecution

      protected boolean registerForExecution(org.apache.pekko.dispatch.Mailbox mbox, boolean hasMessageHint, boolean hasSystemMessageHint)
      Description copied from class: MessageDispatcher
      Suggest to register the provided mailbox for execution

      INTERNAL API

      Specified by:
      registerForExecution in class MessageDispatcher
    • shutdownTimeout

      protected scala.concurrent.duration.FiniteDuration shutdownTimeout()
      Description copied from class: MessageDispatcher
      When the dispatcher no longer has any actors registered, how long will it wait until it shuts itself down, defaulting to your pekko configs "pekko.actor.default-dispatcher.shutdown-timeout" or default specified in reference.conf

      INTERNAL API

      Specified by:
      shutdownTimeout in class MessageDispatcher
    • register

      protected void register(org.apache.pekko.actor.ActorCell actor)
      Description copied from class: MessageDispatcher
      If you override it, you must call it. But only ever once. See "attach" for only invocation.

      INTERNAL API

      Overrides:
      register in class MessageDispatcher
    • unregister

      protected void unregister(org.apache.pekko.actor.ActorCell actor)
      Description copied from class: MessageDispatcher
      If you override it, you must call it. But only ever once. See "detach" for the only invocation

      INTERNAL API

      Overrides:
      unregister in class MessageDispatcher
    • suspend

      protected void suspend(org.apache.pekko.actor.ActorCell actor)
      Description copied from class: MessageDispatcher
      After the call to this method, the dispatcher mustn't begin any new message processing for the specified reference
      Overrides:
      suspend in class MessageDispatcher
    • resume

      protected void resume(org.apache.pekko.actor.ActorCell actor)
      Description copied from class: MessageDispatcher
      After the call to this method, the dispatcher must begin any new message processing for the specified reference
      Overrides:
      resume in class MessageDispatcher
    • systemDispatch

      protected void systemDispatch(org.apache.pekko.actor.ActorCell receiver, SystemMessage message)
      Description copied from class: MessageDispatcher
      Will be called when the dispatcher is to queue an invocation for execution

      INTERNAL API

      Specified by:
      systemDispatch in class MessageDispatcher
    • dispatch

      protected void dispatch(org.apache.pekko.actor.ActorCell receiver, Envelope handle)
      Description copied from class: MessageDispatcher
      Will be called when the dispatcher is to queue an invocation for execution

      INTERNAL API

      Specified by:
      dispatch in class MessageDispatcher
    • executeTask

      protected void executeTask(TaskInvocation invocation)
      Description copied from class: MessageDispatcher
      INTERNAL API
      Specified by:
      executeTask in class MessageDispatcher