LightArrayRevolverScheduler, see #2904
- based on a wheel (AtomicReferenceArray) from which atomic single-linked lists dangle - no locks - deterministic tests due to overridable time source - also bring docs up to date
This commit is contained in:
parent
9f2a0afc05
commit
8dea20a1f1
20 changed files with 863 additions and 202 deletions
|
|
@ -10,6 +10,7 @@ import java.util.concurrent.TimeUnit;
|
|||
//#imports1
|
||||
|
||||
//#imports2
|
||||
import akka.actor.Actor;
|
||||
import akka.actor.UntypedActor;
|
||||
import akka.actor.UntypedActorFactory;
|
||||
import akka.actor.Cancellable;
|
||||
|
|
@ -43,7 +44,7 @@ public class SchedulerDocTestBase {
|
|||
public void scheduleOneOffTask() {
|
||||
//#schedule-one-off-message
|
||||
system.scheduler().scheduleOnce(Duration.create(50, TimeUnit.MILLISECONDS),
|
||||
testActor, "foo", system.dispatcher());
|
||||
testActor, "foo", system.dispatcher(), null);
|
||||
//#schedule-one-off-message
|
||||
|
||||
//#schedule-one-off-thunk
|
||||
|
|
|
|||
|
|
@ -311,9 +311,8 @@ public class FaultHandlingDocSample {
|
|||
counter.tell(new UseStorage(null), getSelf());
|
||||
// Try to re-establish storage after while
|
||||
getContext().system().scheduler().scheduleOnce(
|
||||
Duration.create(10, "seconds"), getSelf(), Reconnect,
|
||||
getContext().dispatcher()
|
||||
);
|
||||
Duration.create(10, "seconds"), getSelf(), Reconnect,
|
||||
getContext().dispatcher(), null);
|
||||
} else if (msg.equals(Reconnect)) {
|
||||
// Re-establish storage after the scheduled delay
|
||||
initStorage();
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ public class SchedulerPatternTest {
|
|||
public void preStart() {
|
||||
getContext().system().scheduler().scheduleOnce(
|
||||
Duration.create(500, TimeUnit.MILLISECONDS),
|
||||
getSelf(), "tick", getContext().dispatcher());
|
||||
getSelf(), "tick", getContext().dispatcher(), null);
|
||||
}
|
||||
|
||||
// override postRestart so we don't call preStart and schedule a new message
|
||||
|
|
@ -98,7 +98,7 @@ public class SchedulerPatternTest {
|
|||
// send another periodic tick after the specified delay
|
||||
getContext().system().scheduler().scheduleOnce(
|
||||
Duration.create(1000, TimeUnit.MILLISECONDS),
|
||||
getSelf(), "tick", getContext().dispatcher());
|
||||
getSelf(), "tick", getContext().dispatcher(), null);
|
||||
// do something useful here
|
||||
//#schedule-receive
|
||||
target.tell(message, getSelf());
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import java.util.concurrent.TimeoutException;
|
|||
import scala.concurrent.Future;
|
||||
import scala.concurrent.duration.Duration;
|
||||
|
||||
import akka.actor.Actor;
|
||||
import akka.actor.ActorKilledException;
|
||||
import akka.actor.ActorRef;
|
||||
import akka.actor.ActorRefFactory;
|
||||
|
|
@ -79,7 +80,7 @@ public class SupervisedAsk {
|
|||
targetActor.forward(askParam.message, getContext());
|
||||
Scheduler scheduler = getContext().system().scheduler();
|
||||
timeoutMessage = scheduler.scheduleOnce(askParam.timeout.duration(),
|
||||
self(), new AskTimeout(), context().dispatcher());
|
||||
self(), new AskTimeout(), context().dispatcher(), null);
|
||||
} else if (message instanceof Terminated) {
|
||||
Throwable ex = new ActorKilledException("Target actor terminated.");
|
||||
caller.tell(new Status.Failure(ex), self());
|
||||
|
|
|
|||
|
|
@ -5,22 +5,23 @@
|
|||
Scheduler (Java)
|
||||
##################
|
||||
|
||||
Sometimes the need for making things happen in the future arises, and where do you go look then?
|
||||
Look no further than ``ActorSystem``! There you find the :meth:`scheduler` method that returns an instance
|
||||
of akka.actor.Scheduler, this instance is unique per ActorSystem and is used internally for scheduling things
|
||||
to happen at specific points in time. Please note that the scheduled tasks are executed by the default
|
||||
``MessageDispatcher`` of the ``ActorSystem``.
|
||||
Sometimes the need for making things happen in the future arises, and where do
|
||||
you go look then? Look no further than ``ActorSystem``! There you find the
|
||||
:meth:`scheduler` method that returns an instance of
|
||||
:class:`akka.actor.Scheduler`, this instance is unique per ActorSystem and is
|
||||
used internally for scheduling things to happen at specific points in time.
|
||||
|
||||
You can schedule sending of messages to actors and execution of tasks (functions or Runnable).
|
||||
You will get a ``Cancellable`` back that you can call :meth:`cancel` on to cancel the execution of the
|
||||
scheduled operation.
|
||||
You can schedule sending of messages to actors and execution of tasks
|
||||
(functions or Runnable). You will get a ``Cancellable`` back that you can call
|
||||
:meth:`cancel` on to cancel the execution of the scheduled operation.
|
||||
|
||||
.. warning::
|
||||
|
||||
The default implementation of ``Scheduler`` used by Akka is based on the Netty ``HashedWheelTimer``.
|
||||
It does not execute tasks at the exact time, but on every tick, it will run everything that is overdue.
|
||||
The accuracy of the default Scheduler can be modified by the "ticks-per-wheel" and "tick-duration" configuration
|
||||
properties. For more information, see: `HashedWheelTimers <http://www.cse.wustl.edu/~cdgill/courses/cs6874/TimingWheels.ppt>`_.
|
||||
The default implementation of ``Scheduler`` used by Akka is based on job
|
||||
buckets which are emptied according to a fixed schedule. It does not
|
||||
execute tasks at the exact time, but on every tick, it will run everything
|
||||
that is (over)due. The accuracy of the default Scheduler can be modified
|
||||
by the ``akka.scheduler.tick-duration`` configuration property.
|
||||
|
||||
Some examples
|
||||
-------------
|
||||
|
|
@ -53,19 +54,29 @@ From ``akka.actor.ActorSystem``
|
|||
:include: scheduler
|
||||
|
||||
|
||||
The Scheduler interface
|
||||
-----------------------
|
||||
The Scheduler Interface for Implementors
|
||||
----------------------------------------
|
||||
|
||||
.. includecode:: ../../../akka-actor/src/main/scala/akka/actor/Scheduler.scala
|
||||
The actual scheduler implementation is loaded reflectively upon
|
||||
:class:`ActorSystem` start-up, which means that it is possible to provide a
|
||||
different one using the ``akka.scheduler.implementation`` configuration
|
||||
property. The referenced class must implement the following interface:
|
||||
|
||||
.. includecode:: ../../../akka-actor/src/main/java/akka/actor/AbstractScheduler.java
|
||||
:include: scheduler
|
||||
|
||||
The Cancellable interface
|
||||
-------------------------
|
||||
|
||||
This allows you to ``cancel`` something that has been scheduled for execution.
|
||||
Scheduling a task will result in a :class:`Cancellable` (or throw an
|
||||
:class:`IllegalStateException` if attempted after the scheduler’s shutdown).
|
||||
This allows you to cancel something that has been scheduled for execution.
|
||||
|
||||
.. warning::
|
||||
This does not abort the execution of the task, if it had already been started.
|
||||
|
||||
This does not abort the execution of the task, if it had already been
|
||||
started. Check the return value of ``cancel`` to detect whether the
|
||||
scheduled task was canceled or will (eventually) have run.
|
||||
|
||||
.. includecode:: ../../../akka-actor/src/main/scala/akka/actor/Scheduler.scala
|
||||
:include: cancellable
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ class SchedulerDocSpec extends AkkaSpec(Map("akka.loglevel" -> "INFO")) {
|
|||
expectMsg(1 second, "foo")
|
||||
|
||||
//#schedule-one-off-thunk
|
||||
//Schedules a function to be executed (send the current time) to the testActor after 50ms
|
||||
//Schedules a function to be executed (send a message to the testActor) after 50ms
|
||||
system.scheduler.scheduleOnce(50 milliseconds) {
|
||||
testActor ! System.currentTimeMillis
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,22 +5,23 @@
|
|||
Scheduler (Scala)
|
||||
###################
|
||||
|
||||
Sometimes the need for making things happen in the future arises, and where do you go look then?
|
||||
Look no further than ``ActorSystem``! There you find the :meth:`scheduler` method that returns an instance
|
||||
of akka.actor.Scheduler, this instance is unique per ActorSystem and is used internally for scheduling things
|
||||
to happen at specific points in time. Please note that the scheduled tasks are executed by the default
|
||||
``MessageDispatcher`` of the ``ActorSystem``.
|
||||
Sometimes the need for making things happen in the future arises, and where do
|
||||
you go look then? Look no further than ``ActorSystem``! There you find the
|
||||
:meth:`scheduler` method that returns an instance of
|
||||
:class:`akka.actor.Scheduler`, this instance is unique per ActorSystem and is
|
||||
used internally for scheduling things to happen at specific points in time.
|
||||
|
||||
You can schedule sending of messages to actors and execution of tasks (functions or Runnable).
|
||||
You will get a ``Cancellable`` back that you can call :meth:`cancel` on to cancel the execution of the
|
||||
scheduled operation.
|
||||
You can schedule sending of messages to actors and execution of tasks
|
||||
(functions or Runnable). You will get a ``Cancellable`` back that you can call
|
||||
:meth:`cancel` on to cancel the execution of the scheduled operation.
|
||||
|
||||
.. warning::
|
||||
|
||||
The default implementation of ``Scheduler`` used by Akka is based on the Netty ``HashedWheelTimer``.
|
||||
It does not execute tasks at the exact time, but on every tick, it will run everything that is overdue.
|
||||
The accuracy of the default Scheduler can be modified by the "ticks-per-wheel" and "tick-duration" configuration
|
||||
properties. For more information, see: `HashedWheelTimers <http://www.cse.wustl.edu/~cdgill/courses/cs6874/TimingWheels.ppt>`_.
|
||||
The default implementation of ``Scheduler`` used by Akka is based on job
|
||||
buckets which are emptied according to a fixed schedule. It does not
|
||||
execute tasks at the exact time, but on every tick, it will run everything
|
||||
that is (over)due. The accuracy of the default Scheduler can be modified
|
||||
by the ``akka.scheduler.tick-duration`` configuration property.
|
||||
|
||||
Some examples
|
||||
-------------
|
||||
|
|
@ -44,16 +45,26 @@ From ``akka.actor.ActorSystem``
|
|||
The Scheduler interface
|
||||
-----------------------
|
||||
|
||||
The actual scheduler implementation is loaded reflectively upon
|
||||
:class:`ActorSystem` start-up, which means that it is possible to provide a
|
||||
different one using the ``akka.scheduler.implementation`` configuration
|
||||
property. The referenced class must implement the following interface:
|
||||
|
||||
.. includecode:: ../../../akka-actor/src/main/scala/akka/actor/Scheduler.scala
|
||||
:include: scheduler
|
||||
|
||||
The Cancellable interface
|
||||
-------------------------
|
||||
|
||||
This allows you to ``cancel`` something that has been scheduled for execution.
|
||||
Scheduling a task will result in a :class:`Cancellable` (or throw an
|
||||
:class:`IllegalStateException` if attempted after the scheduler’s shutdown).
|
||||
This allows you to cancel something that has been scheduled for execution.
|
||||
|
||||
.. warning::
|
||||
This does not abort the execution of the task, if it had already been started.
|
||||
|
||||
This does not abort the execution of the task, if it had already been
|
||||
started. Check the return value of ``cancel`` to detect whether the
|
||||
scheduled task was canceled or will (eventually) have run.
|
||||
|
||||
.. includecode:: ../../../akka-actor/src/main/scala/akka/actor/Scheduler.scala
|
||||
:include: cancellable
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue