akka.testkit
Class CallingThreadDispatcher

java.lang.Object
  extended by akka.dispatch.MessageDispatcher
      extended by akka.testkit.CallingThreadDispatcher
All Implemented Interfaces:
scala.concurrent.ExecutionContext

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.

Since:
1.1

Nested Class Summary
 
Nested classes/interfaces inherited from interface scala.concurrent.ExecutionContext
scala.concurrent.ExecutionContext.Implicits$
 
Constructor Summary
CallingThreadDispatcher(MessageDispatcherConfigurator _configurator)
           
 
Method Summary
 java.lang.ThreadLocal<scala.collection.immutable.List<java.lang.Runnable>> _tasksLocal()
           
 boolean batchable(java.lang.Runnable runnable)
          Override this to define which runnables will be batched.
protected  CallingThreadMailbox createMailbox(akka.actor.Cell actor, MailboxType mailboxType)
           
protected  void dispatch(akka.actor.ActorCell receiver, Envelope handle)
          Will be called when the dispatcher is to queue an invocation for execution
 void execute(java.lang.Runnable runnable)
           
protected  void executeTask(TaskInvocation invocation)
          INTERNAL API
 java.lang.String id()
          Identifier of this dispatcher, corresponds to the full key of the dispatcher configuration.
static java.lang.String Id()
           
 LoggingAdapter log()
           
protected  void register(akka.actor.ActorCell actor)
          If you override it, you must call it.
protected  boolean registerForExecution(akka.dispatch.Mailbox mbox, boolean hasMessageHint, boolean hasSystemMessageHint)
          Suggest to register the provided mailbox for execution
protected  void resume(akka.actor.ActorCell actor)
           
protected  void shutdown()
          Called one time every time an actor is detached from this dispatcher and this dispatcher has no actors left attached Must be idempotent
protected  scala.concurrent.duration.FiniteDuration shutdownTimeout()
          When the dispatcher no longer has any actors registered, how long will it wait until it shuts itself down, defaulting to your akka configs "akka.actor.default-dispatcher.shutdown-timeout" or default specified in reference.conf
protected  void suspend(akka.actor.ActorCell actor)
          After the call to this method, the dispatcher mustn't begin any new message processing for the specified reference
protected  void systemDispatch(akka.actor.ActorCell receiver, akka.dispatch.sysmsg.SystemMessage message)
          Will be called when the dispatcher is to queue an invocation for execution
protected  int throughput()
          INTERNAL API
protected  scala.concurrent.duration.FiniteDuration throughputDeadlineTime()
          INTERNAL API
protected  void unregister(akka.actor.ActorCell actor)
          If you override it, you must call it.
 
Methods inherited from class akka.dispatch.MessageDispatcher
actors, attach, configurator, debug, detach, eventStream, inhabitants, isThroughputDeadlineTimeDefined, mailboxes, printActors, reportFailure, RESCHEDULED, SCHEDULED, unbatchedExecute, UNSCHEDULED
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface scala.concurrent.ExecutionContext
execute, prepare
 

Constructor Detail

CallingThreadDispatcher

public CallingThreadDispatcher(MessageDispatcherConfigurator _configurator)
Method Detail

Id

public static java.lang.String Id()

log

public LoggingAdapter log()

id

public java.lang.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(akka.actor.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(akka.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 akka configs "akka.actor.default-dispatcher.shutdown-timeout" or default specified in reference.conf

INTERNAL API

Specified by:
shutdownTimeout in class MessageDispatcher

register

protected void register(akka.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(akka.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(akka.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(akka.actor.ActorCell actor)
Overrides:
resume in class MessageDispatcher

systemDispatch

protected void systemDispatch(akka.actor.ActorCell receiver,
                              akka.dispatch.sysmsg.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(akka.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

_tasksLocal

public java.lang.ThreadLocal<scala.collection.immutable.List<java.lang.Runnable>> _tasksLocal()

execute

public void execute(java.lang.Runnable runnable)
Specified by:
execute in interface java.util.concurrent.Executor

batchable

public boolean batchable(java.lang.Runnable runnable)
Override this to define which runnables will be batched.