172 lines
No EOL
5 KiB
ReStructuredText
172 lines
No EOL
5 KiB
ReStructuredText
.. _dispatchers-scala:
|
|
|
|
Dispatchers (Scala)
|
|
===================
|
|
|
|
.. sidebar:: Contents
|
|
|
|
.. contents:: :local:
|
|
|
|
An Akka ``MessageDispatcher`` is what makes Akka Actors "tick", it is the engine of the machine so to speak.
|
|
All ``MessageDispatcher`` implementations are also an ``ExecutionContext``, which means that they can be used
|
|
to execute arbitrary code, for instance :ref:`futures-scala`.
|
|
|
|
Default dispatcher
|
|
------------------
|
|
|
|
Every ``ActorSystem`` will have a default dispatcher that will be used in case nothing else is configured for an ``Actor``.
|
|
The default dispatcher can be configured, and is by default a ``Dispatcher`` with a "fork-join-executor", which gives excellent performance in most cases.
|
|
|
|
Setting the dispatcher for an Actor
|
|
-----------------------------------
|
|
|
|
So in case you want to give your ``Actor`` a different dispatcher than the default, you need to do two things, of which the first is:
|
|
|
|
.. includecode:: ../scala/code/akka/docs/dispatcher/DispatcherDocSpec.scala#defining-dispatcher
|
|
|
|
.. note::
|
|
The "dispatcherId" you specify in withDispatcher is in fact a path into your configuration.
|
|
So in this example it's a top-level section, but you could for instance put it as a sub-section,
|
|
where you'd use periods to denote sub-sections, like this: ``"foo.bar.my-dispatcher"``
|
|
|
|
And then you just need to configure that dispatcher in your configuration:
|
|
|
|
.. includecode:: ../scala/code/akka/docs/dispatcher/DispatcherDocSpec.scala#my-dispatcher-config
|
|
|
|
And here's another example that uses the "thread-pool-executor":
|
|
|
|
.. includecode:: ../scala/code/akka/docs/dispatcher/DispatcherDocSpec.scala#my-thread-pool-dispatcher-config
|
|
|
|
For more options, see the default-dispatcher section of the :ref:`configuration`.
|
|
|
|
Types of dispatchers
|
|
--------------------
|
|
|
|
There are 4 different types of message dispatchers:
|
|
|
|
* Dispatcher
|
|
|
|
- Sharability: Unlimited
|
|
|
|
- Mailboxes: Any, creates one per Actor
|
|
|
|
- Use cases: Default dispatcher, Bulkheading
|
|
|
|
- Driven by: ``java.util.concurrent.ExecutorService``
|
|
specify using "executor" using "fork-join-executor",
|
|
"thread-pool-executor" or the FQCN of
|
|
an ``akka.dispatcher.ExecutorServiceConfigurator``
|
|
|
|
* PinnedDispatcher
|
|
|
|
- Sharability: None
|
|
|
|
- Mailboxes: Any, creates one per Actor
|
|
|
|
- Use cases: Bulkheading
|
|
|
|
- Driven by: Any ``akka.dispatch.ThreadPoolExecutorConfigurator``
|
|
by default a "thread-pool-executor"
|
|
|
|
* BalancingDispatcher
|
|
|
|
- Sharability: Actors of the same type only
|
|
|
|
- Mailboxes: Any, creates one for all Actors
|
|
|
|
- Use cases: Work-sharing
|
|
|
|
- Driven by: ``java.util.concurrent.ExecutorService``
|
|
specify using "executor" using "fork-join-executor",
|
|
"thread-pool-executor" or the FQCN of
|
|
an ``akka.dispatcher.ExecutorServiceConfigurator``
|
|
|
|
* CallingThreadDispatcher
|
|
|
|
- Sharability: Unlimited
|
|
|
|
- Mailboxes: Any, creates one per Actor per Thread (on demand)
|
|
|
|
- Use cases: Testing
|
|
|
|
- Driven by: The calling thread (duh)
|
|
|
|
More dispatcher configuration examples
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
Configuring a ``PinnedDispatcher``:
|
|
|
|
.. includecode:: ../scala/code/akka/docs/dispatcher/DispatcherDocSpec.scala#my-pinned-dispatcher-config
|
|
|
|
And then using it:
|
|
|
|
.. includecode:: ../scala/code/akka/docs/dispatcher/DispatcherDocSpec.scala#defining-pinned-dispatcher
|
|
|
|
Mailboxes
|
|
---------
|
|
|
|
An Akka ``Mailbox`` holds the messages that are destined for an ``Actor``.
|
|
Normally each ``Actor`` has its own mailbox, but with example a ``BalancingDispatcher`` all actors with the same ``BalancingDispatcher`` will share a single instance.
|
|
|
|
Builtin implementations
|
|
^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
Akka comes shipped with a number of default mailbox implementations:
|
|
|
|
* UnboundedMailbox
|
|
|
|
- Backed by a ``java.util.concurrent.ConcurrentLinkedQueue``
|
|
|
|
- Blocking: No
|
|
|
|
- Bounded: No
|
|
|
|
* BoundedMailbox
|
|
|
|
- Backed by a ``java.util.concurrent.LinkedBlockingQueue``
|
|
|
|
- Blocking: Yes
|
|
|
|
- Bounded: Yes
|
|
|
|
* UnboundedPriorityMailbox
|
|
|
|
- Backed by a ``java.util.concurrent.PriorityBlockingQueue``
|
|
|
|
- Blocking: Yes
|
|
|
|
- Bounded: No
|
|
|
|
* BoundedPriorityMailbox
|
|
|
|
- Backed by a ``java.util.PriorityBlockingQueue`` wrapped in an ``akka.util.BoundedBlockingQueue``
|
|
|
|
- Blocking: Yes
|
|
|
|
- Bounded: Yes
|
|
|
|
* Durable mailboxes, see :ref:`durable-mailboxes`.
|
|
|
|
Mailbox configuration examples
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
How to create a PriorityMailbox:
|
|
|
|
.. includecode:: ../scala/code/akka/docs/dispatcher/DispatcherDocSpec.scala#prio-mailbox
|
|
|
|
And then add it to the configuration:
|
|
|
|
.. includecode:: ../scala/code/akka/docs/dispatcher/DispatcherDocSpec.scala#prio-dispatcher-config
|
|
|
|
And then an example on how you would use it:
|
|
|
|
.. includecode:: ../scala/code/akka/docs/dispatcher/DispatcherDocSpec.scala#prio-dispatcher
|
|
|
|
Creating your own Mailbox type
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
An example is worth a thousand quacks:
|
|
|
|
.. includecode:: ../scala/code/akka/docs/dispatcher/DispatcherDocSpec.scala#mailbox-implementation-example
|
|
|
|
And then you just specify the FQCN of your MailboxType as the value of the "mailbox-type" in the dispatcher configuration. |