Updated docs with changes to 'actorOf(Props(..))'
Signed-off-by: Jonas Bonér <jonas@jonasboner.com>
This commit is contained in:
parent
c9b787f029
commit
d725c9c681
21 changed files with 100 additions and 98 deletions
|
|
@ -328,7 +328,7 @@ created actor::
|
||||||
|
|
||||||
val clusterNode = Cluster.newNode(NodeAddress("test-cluster", "node1")).start
|
val clusterNode = Cluster.newNode(NodeAddress("test-cluster", "node1")).start
|
||||||
|
|
||||||
val hello = actorOf(Props[HelloActor].start.asInstanceOf[LocalActorRef]
|
val hello = actorOf(Props[HelloActor]).asInstanceOf[LocalActorRef]
|
||||||
|
|
||||||
val serializeMailbox = false
|
val serializeMailbox = false
|
||||||
val nrOfInstances = 5
|
val nrOfInstances = 5
|
||||||
|
|
|
||||||
|
|
@ -117,8 +117,7 @@ object Pi extends App {
|
||||||
val latch = new CountDownLatch(1)
|
val latch = new CountDownLatch(1)
|
||||||
|
|
||||||
// create the master
|
// create the master
|
||||||
val master = actorOf(
|
val master = actorOf(Props(new Master(nrOfWorkers, nrOfMessages, nrOfElements, latch)))
|
||||||
new Master(nrOfWorkers, nrOfMessages, nrOfElements, latch))
|
|
||||||
|
|
||||||
// start the calculation
|
// start the calculation
|
||||||
master ! Calculate
|
master ! Calculate
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ Example of creating a listener from Scala (from Java you just have to create an
|
||||||
case EventHandler.Debug(instance, message) => ...
|
case EventHandler.Debug(instance, message) => ...
|
||||||
case genericEvent => ...
|
case genericEvent => ...
|
||||||
}
|
}
|
||||||
})
|
}))
|
||||||
|
|
||||||
To add the listener:
|
To add the listener:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -221,6 +221,7 @@ We start by creating a ``Pi.java`` file and adding these import statements at th
|
||||||
import static akka.actor.Actors.poisonPill;
|
import static akka.actor.Actors.poisonPill;
|
||||||
import static java.util.Arrays.asList;
|
import static java.util.Arrays.asList;
|
||||||
|
|
||||||
|
import akka.actor.Props;
|
||||||
import akka.actor.ActorRef;
|
import akka.actor.ActorRef;
|
||||||
import akka.actor.UntypedActor;
|
import akka.actor.UntypedActor;
|
||||||
import akka.actor.UntypedActorFactory;
|
import akka.actor.UntypedActorFactory;
|
||||||
|
|
@ -337,15 +338,15 @@ The master actor is a little bit more involved. In its constructor we need to cr
|
||||||
// create the workers
|
// create the workers
|
||||||
final ActorRef[] workers = new ActorRef[nrOfWorkers];
|
final ActorRef[] workers = new ActorRef[nrOfWorkers];
|
||||||
for (int i = 0; i < nrOfWorkers; i++) {
|
for (int i = 0; i < nrOfWorkers; i++) {
|
||||||
workers[i] = actorOf(Worker.class);
|
workers[i] = actorOf(new Props(Worker.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
// wrap them with a load-balancing router
|
// wrap them with a load-balancing router
|
||||||
ActorRef router = actorOf(Props(new UntypedActorFactory() {
|
ActorRef router = actorOf(new Props(new UntypedActorFactory() {
|
||||||
public UntypedActor create() {
|
public UntypedActor create() {
|
||||||
return new PiRouter(workers);
|
return new PiRouter(workers);
|
||||||
}
|
}
|
||||||
});
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -404,15 +405,15 @@ Here is the master actor::
|
||||||
// create the workers
|
// create the workers
|
||||||
final ActorRef[] workers = new ActorRef[nrOfWorkers];
|
final ActorRef[] workers = new ActorRef[nrOfWorkers];
|
||||||
for (int i = 0; i < nrOfWorkers; i++) {
|
for (int i = 0; i < nrOfWorkers; i++) {
|
||||||
workers[i] = actorOf(Worker.class);
|
workers[i] = actorOf(new Props(Worker.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
// wrap them with a load-balancing router
|
// wrap them with a load-balancing router
|
||||||
router = actorOf(Props(new UntypedActorFactory() {
|
router = actorOf(new Props(new UntypedActorFactory() {
|
||||||
public UntypedActor create() {
|
public UntypedActor create() {
|
||||||
return new PiRouter(workers);
|
return new PiRouter(workers);
|
||||||
}
|
}
|
||||||
});
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
// message handler
|
// message handler
|
||||||
|
|
@ -495,11 +496,11 @@ Now the only thing that is left to implement is the runner that should bootstrap
|
||||||
final CountDownLatch latch = new CountDownLatch(1);
|
final CountDownLatch latch = new CountDownLatch(1);
|
||||||
|
|
||||||
// create the master
|
// create the master
|
||||||
ActorRef master = actorOf(Props(new UntypedActorFactory() {
|
ActorRef master = actorOf(new Props(new UntypedActorFactory() {
|
||||||
public UntypedActor create() {
|
public UntypedActor create() {
|
||||||
return new Master(nrOfWorkers, nrOfMessages, nrOfElements, latch);
|
return new Master(nrOfWorkers, nrOfMessages, nrOfElements, latch);
|
||||||
}
|
}
|
||||||
});
|
}));
|
||||||
|
|
||||||
// start the calculation
|
// start the calculation
|
||||||
master.tell(new Calculate());
|
master.tell(new Calculate());
|
||||||
|
|
@ -519,6 +520,7 @@ Before we package it up and run it, let's take a look at the full code now, with
|
||||||
import static akka.actor.Actors.poisonPill;
|
import static akka.actor.Actors.poisonPill;
|
||||||
import static java.util.Arrays.asList;
|
import static java.util.Arrays.asList;
|
||||||
|
|
||||||
|
import akka.actor.Props;
|
||||||
import akka.actor.ActorRef;
|
import akka.actor.ActorRef;
|
||||||
import akka.actor.UntypedActor;
|
import akka.actor.UntypedActor;
|
||||||
import akka.actor.UntypedActorFactory;
|
import akka.actor.UntypedActorFactory;
|
||||||
|
|
@ -629,15 +631,15 @@ Before we package it up and run it, let's take a look at the full code now, with
|
||||||
// create the workers
|
// create the workers
|
||||||
final ActorRef[] workers = new ActorRef[nrOfWorkers];
|
final ActorRef[] workers = new ActorRef[nrOfWorkers];
|
||||||
for (int i = 0; i < nrOfWorkers; i++) {
|
for (int i = 0; i < nrOfWorkers; i++) {
|
||||||
workers[i] = actorOf(Worker.class);
|
workers[i] = actorOf(new Props(Worker.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
// wrap them with a load-balancing router
|
// wrap them with a load-balancing router
|
||||||
router = actorOf(Props(new UntypedActorFactory() {
|
router = actorOf(new Props(new UntypedActorFactory() {
|
||||||
public UntypedActor create() {
|
public UntypedActor create() {
|
||||||
return new PiRouter(workers);
|
return new PiRouter(workers);
|
||||||
}
|
}
|
||||||
});
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
// message handler
|
// message handler
|
||||||
|
|
@ -691,11 +693,11 @@ Before we package it up and run it, let's take a look at the full code now, with
|
||||||
final CountDownLatch latch = new CountDownLatch(1);
|
final CountDownLatch latch = new CountDownLatch(1);
|
||||||
|
|
||||||
// create the master
|
// create the master
|
||||||
ActorRef master = actorOf(Props(new UntypedActorFactory() {
|
ActorRef master = actorOf(new Props(new UntypedActorFactory() {
|
||||||
public UntypedActor create() {
|
public UntypedActor create() {
|
||||||
return new Master(nrOfWorkers, nrOfMessages, nrOfElements, latch);
|
return new Master(nrOfWorkers, nrOfMessages, nrOfElements, latch);
|
||||||
}
|
}
|
||||||
});
|
}));
|
||||||
|
|
||||||
// start the calculation
|
// start the calculation
|
||||||
master.tell(new Calculate());
|
master.tell(new Calculate());
|
||||||
|
|
|
||||||
|
|
@ -364,8 +364,7 @@ The ``Pi`` object is a perfect container module for our actors and messages, so
|
||||||
val latch = new CountDownLatch(1)
|
val latch = new CountDownLatch(1)
|
||||||
|
|
||||||
// create the master
|
// create the master
|
||||||
val master = actorOf(
|
val master = actorOf(Props(new Master(nrOfWorkers, nrOfMessages, nrOfElements, latch)))
|
||||||
new Master(nrOfWorkers, nrOfMessages, nrOfElements, latch))
|
|
||||||
|
|
||||||
// start the calculation
|
// start the calculation
|
||||||
master ! Calculate
|
master ! Calculate
|
||||||
|
|
|
||||||
|
|
@ -318,7 +318,7 @@ Erlang actor's PID.
|
||||||
|
|
||||||
The actor's life-cycle is:
|
The actor's life-cycle is:
|
||||||
|
|
||||||
- Created & Started -- ``Actor.actorOf(Props[MyActor]`` -- can receive messages
|
- Created & Started -- ``Actor.actorOf(Props[MyActor])`` -- can receive messages
|
||||||
- Stopped -- ``actorRef.stop()`` -- can **not** receive messages
|
- Stopped -- ``actorRef.stop()`` -- can **not** receive messages
|
||||||
|
|
||||||
Once the actor has been stopped it is dead and can not be started again.
|
Once the actor has been stopped it is dead and can not be started again.
|
||||||
|
|
|
||||||
|
|
@ -73,13 +73,14 @@ So your listener Actor needs to be able to handle these two messages. Example:
|
||||||
import akka.actor.TypedActorRegistered;
|
import akka.actor.TypedActorRegistered;
|
||||||
import akka.actor.TypedActorUnregistered;
|
import akka.actor.TypedActorUnregistered;
|
||||||
import akka.actor.UntypedActor;
|
import akka.actor.UntypedActor;
|
||||||
|
import akka.actor.Props;
|
||||||
import akka.event.EventHandler;
|
import akka.event.EventHandler;
|
||||||
|
|
||||||
public class RegistryListener extends UntypedActor {
|
public class RegistryListener extends UntypedActor {
|
||||||
public void onReceive(Object message) throws Exception {
|
public void onReceive(Object message) throws Exception {
|
||||||
if (message instanceof ActorRegistered) {
|
if (message instanceof ActorRegistered) {
|
||||||
ActorRegistered event = (ActorRegistered) message;
|
ActorRegistered event = (ActorRegistered) message;
|
||||||
EventHandler.info(this, String.format("Actor registered: %s - %s",
|
EventHandler.info(this, String.format("Actor registered: %s - %s",
|
||||||
event.actor().actorClassName(), event.actor().getUuid()));
|
event.actor().actorClassName(), event.actor().getUuid()));
|
||||||
event.actor().actorClassName(), event.actor().getUuid()));
|
event.actor().actorClassName(), event.actor().getUuid()));
|
||||||
} else if (message instanceof ActorUnregistered) {
|
} else if (message instanceof ActorUnregistered) {
|
||||||
|
|
@ -94,5 +95,5 @@ The above actor can be added as listener of registry events:
|
||||||
|
|
||||||
import static akka.actor.Actors.*;
|
import static akka.actor.Actors.*;
|
||||||
|
|
||||||
ActorRef listener = actorOf(RegistryListener.class);
|
ActorRef listener = actorOf(new Props(RegistryListener.class));
|
||||||
registry().addListener(listener);
|
registry().addListener(listener);
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ Dispatchers (Java)
|
||||||
.. sidebar:: Contents
|
.. sidebar:: Contents
|
||||||
|
|
||||||
.. contents:: :local:
|
.. contents:: :local:
|
||||||
|
|
||||||
Module stability: **SOLID**
|
Module stability: **SOLID**
|
||||||
|
|
||||||
The Dispatcher is an important piece that allows you to configure the right semantics and parameters for optimal performance, throughput and scalability. Different Actors have different needs.
|
The Dispatcher is an important piece that allows you to configure the right semantics and parameters for optimal performance, throughput and scalability. Different Actors have different needs.
|
||||||
|
|
@ -129,7 +129,7 @@ should have, as shown above. This defines the number of messages for a specific
|
||||||
Actor the dispatcher should process in one single sweep; in other words, the
|
Actor the dispatcher should process in one single sweep; in other words, the
|
||||||
dispatcher will bunch up to ``throughput`` message invocations together when
|
dispatcher will bunch up to ``throughput`` message invocations together when
|
||||||
having elected an actor to run. Setting this to a higher number will increase
|
having elected an actor to run. Setting this to a higher number will increase
|
||||||
throughput but lower fairness, and vice versa. If you don't specify it explicitly
|
throughput but lower fairness, and vice versa. If you don't specify it explicitly
|
||||||
then it uses the value (5) defined for ``default-dispatcher`` in the :ref:`configuration`.
|
then it uses the value (5) defined for ``default-dispatcher`` in the :ref:`configuration`.
|
||||||
|
|
||||||
Browse the :ref:`scaladoc` or look at the code for all the options available.
|
Browse the :ref:`scaladoc` or look at the code for all the options available.
|
||||||
|
|
@ -145,10 +145,10 @@ Creating a Dispatcher with a priority mailbox using PriorityGenerator:
|
||||||
.. code-block:: java
|
.. code-block:: java
|
||||||
|
|
||||||
package some.pkg;
|
package some.pkg;
|
||||||
|
|
||||||
import akka.actor.*;
|
import akka.actor.*;
|
||||||
import akka.dispatch.*;
|
import akka.dispatch.*;
|
||||||
|
|
||||||
public class Main {
|
public class Main {
|
||||||
// A simple Actor that just prints the messages it processes
|
// A simple Actor that just prints the messages it processes
|
||||||
public static class MyActor extends UntypedActor {
|
public static class MyActor extends UntypedActor {
|
||||||
|
|
@ -167,7 +167,7 @@ Creating a Dispatcher with a priority mailbox using PriorityGenerator:
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
// Create a new PriorityGenerator, lower prio means more important
|
// Create a new PriorityGenerator, lower prio means more important
|
||||||
PriorityGenerator gen = new PriorityGenerator() {
|
PriorityGenerator gen = new PriorityGenerator() {
|
||||||
public int gen(Object message) {
|
public int gen(Object message) {
|
||||||
if (message.equals("highpriority")) return 0; // "highpriority" messages should be treated first if possible
|
if (message.equals("highpriority")) return 0; // "highpriority" messages should be treated first if possible
|
||||||
|
|
@ -177,7 +177,7 @@ Creating a Dispatcher with a priority mailbox using PriorityGenerator:
|
||||||
};
|
};
|
||||||
// We create an instance of the actor that will print out the messages it processes
|
// We create an instance of the actor that will print out the messages it processes
|
||||||
// We create a new Priority dispatcher and seed it with the priority generator
|
// We create a new Priority dispatcher and seed it with the priority generator
|
||||||
ActorRef ref = Actors.actorOf((new Props()).withCreator(MyActor.class).withDispatcher(new Dispatcher("foo", 5, new UnboundedPriorityMailbox(gen))));
|
ActorRef ref = Actors.actorOf(new Props(MyActor.class).withDispatcher(new Dispatcher("foo", 5, new UnboundedPriorityMailbox(gen))));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,8 +27,8 @@ An UntypedDispatcher is an actor that routes incoming messages to outbound actor
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MyRouter extends UntypedRouter {
|
public class MyRouter extends UntypedRouter {
|
||||||
private ActorRef pinger = actorOf(Pinger.class);
|
private ActorRef pinger = actorOf(new Props(Pinger.class));
|
||||||
private ActorRef ponger = actorOf(Ponger.class);
|
private ActorRef ponger = actorOf(new Props(Ponger.class));
|
||||||
|
|
||||||
//Route Ping-messages to the pinger, and Pong-messages to the ponger
|
//Route Ping-messages to the pinger, and Pong-messages to the ponger
|
||||||
public ActorRef route(Object message) {
|
public ActorRef route(Object message) {
|
||||||
|
|
@ -38,7 +38,7 @@ An UntypedDispatcher is an actor that routes incoming messages to outbound actor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ActorRef router = actorOf(MyRouter.class);
|
ActorRef router = actorOf(new Props(MyRouter.class));
|
||||||
router.tell("Ping"); //Prints "Pinger: Ping"
|
router.tell("Ping"); //Prints "Pinger: Ping"
|
||||||
router.tell("Pong"); //Prints "Ponger: Pong"
|
router.tell("Pong"); //Prints "Ponger: Pong"
|
||||||
|
|
||||||
|
|
@ -71,8 +71,8 @@ An UntypedLoadBalancer is an actor that forwards messages it receives to a bound
|
||||||
//Our load balancer, sends messages to a pinger, then a ponger, rinse and repeat.
|
//Our load balancer, sends messages to a pinger, then a ponger, rinse and repeat.
|
||||||
public class MyLoadBalancer extends UntypedLoadBalancer {
|
public class MyLoadBalancer extends UntypedLoadBalancer {
|
||||||
private InfiniteIterator<ActorRef> actors = new CyclicIterator<ActorRef>(asList(
|
private InfiniteIterator<ActorRef> actors = new CyclicIterator<ActorRef>(asList(
|
||||||
actorOf(Pinger.class),
|
actorOf(new Props(Pinger.class)),
|
||||||
actorOf(Ponger.class)
|
actorOf(new Props(Ponger.class))
|
||||||
));
|
));
|
||||||
|
|
||||||
public InfiniteIterator<ActorRef> seq() {
|
public InfiniteIterator<ActorRef> seq() {
|
||||||
|
|
@ -80,7 +80,7 @@ An UntypedLoadBalancer is an actor that forwards messages it receives to a bound
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ActorRef balancer = actorOf(MyLoadBalancer.class);
|
ActorRef balancer = actorOf(new Props(MyLoadBalancer.class));
|
||||||
balancer.tell("Pong"); //Prints "Pinger: Pong"
|
balancer.tell("Pong"); //Prints "Pinger: Pong"
|
||||||
balancer.tell("Ping"); //Prints "Ponger: Ping"
|
balancer.tell("Ping"); //Prints "Ponger: Ping"
|
||||||
balancer.tell("Ping"); //Prints "Pinger: Ping"
|
balancer.tell("Ping"); //Prints "Pinger: Ping"
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ Software Transactional Memory (Java)
|
||||||
.. sidebar:: Contents
|
.. sidebar:: Contents
|
||||||
|
|
||||||
.. contents:: :local:
|
.. contents:: :local:
|
||||||
|
|
||||||
Module stability: **SOLID**
|
Module stability: **SOLID**
|
||||||
|
|
||||||
Overview of STM
|
Overview of STM
|
||||||
|
|
@ -287,7 +287,7 @@ Here is an example of using ``retry`` to block until an account has enough money
|
||||||
final Ref<Double> account1 = new Ref<Double>(100.0);
|
final Ref<Double> account1 = new Ref<Double>(100.0);
|
||||||
final Ref<Double> account2 = new Ref<Double>(100.0);
|
final Ref<Double> account2 = new Ref<Double>(100.0);
|
||||||
|
|
||||||
ActorRef transferer = Actors.actorOf(Transferer.class);
|
ActorRef transferer = Actors.actorOf(new Props(Transferer.class));
|
||||||
|
|
||||||
transferer.tell(new Transfer(account1, account2, 500.0));
|
transferer.tell(new Transfer(account1, account2, 500.0));
|
||||||
// Transferer: not enough money - retrying
|
// Transferer: not enough money - retrying
|
||||||
|
|
@ -410,7 +410,7 @@ You can also have two alternative blocking transactions, one of which can succee
|
||||||
final Ref<Integer> left = new Ref<Integer>(100);
|
final Ref<Integer> left = new Ref<Integer>(100);
|
||||||
final Ref<Integer> right = new Ref<Integer>(100);
|
final Ref<Integer> right = new Ref<Integer>(100);
|
||||||
|
|
||||||
ActorRef brancher = Actors.actorOf(Brancher.class);
|
ActorRef brancher = Actors.actorOf(new Props(Brancher.class));
|
||||||
|
|
||||||
brancher.tell(new Branch(left, right, 500));
|
brancher.tell(new Branch(left, right, 500));
|
||||||
// not enough on left - retrying
|
// not enough on left - retrying
|
||||||
|
|
|
||||||
|
|
@ -102,8 +102,8 @@ Here is an example of coordinating two simple counter UntypedActors so that they
|
||||||
|
|
||||||
.. code-block:: java
|
.. code-block:: java
|
||||||
|
|
||||||
ActorRef counter1 = actorOf(Counter.class);
|
ActorRef counter1 = actorOf(new Props(Counter.class));
|
||||||
ActorRef counter2 = actorOf(Counter.class);
|
ActorRef counter2 = actorOf(new Props(Counter.class));
|
||||||
|
|
||||||
counter1.tell(new Coordinated(new Increment(counter2)));
|
counter1.tell(new Coordinated(new Increment(counter2)));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ Typed Actors (Java)
|
||||||
.. sidebar:: Contents
|
.. sidebar:: Contents
|
||||||
|
|
||||||
.. contents:: :local:
|
.. contents:: :local:
|
||||||
|
|
||||||
Module stability: **SOLID**
|
Module stability: **SOLID**
|
||||||
|
|
||||||
The Typed Actors are implemented through `Typed Actors <http://en.wikipedia.org/wiki/Active_object>`_. It uses AOP through `AspectWerkz <http://aspectwerkz.codehaus.org/>`_ to turn regular POJOs into asynchronous non-blocking Actors with semantics of the Actor Model. Each method dispatch is turned into a message that is put on a queue to be processed by the Typed Actor sequentially one by one.
|
The Typed Actors are implemented through `Typed Actors <http://en.wikipedia.org/wiki/Active_object>`_. It uses AOP through `AspectWerkz <http://aspectwerkz.codehaus.org/>`_ to turn regular POJOs into asynchronous non-blocking Actors with semantics of the Actor Model. Each method dispatch is turned into a message that is put on a queue to be processed by the Typed Actor sequentially one by one.
|
||||||
|
|
@ -36,7 +36,7 @@ If you have a POJO with an interface implementation separation like this:
|
||||||
.. code-block:: java
|
.. code-block:: java
|
||||||
|
|
||||||
import akka.actor.TypedActor;
|
import akka.actor.TypedActor;
|
||||||
|
|
||||||
public class RegistrationServiceImpl extends TypedActor implements RegistrationService {
|
public class RegistrationServiceImpl extends TypedActor implements RegistrationService {
|
||||||
public void register(User user, Credentials cred) {
|
public void register(User user, Credentials cred) {
|
||||||
... // register user
|
... // register user
|
||||||
|
|
@ -137,7 +137,7 @@ Here is an example:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MathTypedActor math = TypedActor.actorOf(MathTypedActor .class, MathTypedActorImpl.class);
|
MathTypedActor math = TypedActor.typedActorOf(MathTypedActor.class, MathTypedActorImpl.class);
|
||||||
|
|
||||||
// This method will return immediately when called, caller should wait on the Future for the result
|
// This method will return immediately when called, caller should wait on the Future for the result
|
||||||
Future<Integer> future = math.square(10);
|
Future<Integer> future = math.square(10);
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,7 @@ one-liner. Here's an example.
|
||||||
}
|
}
|
||||||
|
|
||||||
// start and expose actor via tcp
|
// start and expose actor via tcp
|
||||||
val myActor = actorOf(Props[MyActor]
|
val myActor = actorOf(Props[MyActor])
|
||||||
|
|
||||||
The above example exposes an actor over a tcp endpoint on port 6200 via Apache
|
The above example exposes an actor over a tcp endpoint on port 6200 via Apache
|
||||||
Camel's `Mina component`_. The actor implements the endpointUri method to define
|
Camel's `Mina component`_. The actor implements the endpointUri method to define
|
||||||
|
|
@ -362,7 +362,7 @@ after the ActorRef method returned.
|
||||||
|
|
||||||
import akka.actor.Actor._
|
import akka.actor.Actor._
|
||||||
|
|
||||||
val actor = actorOf(Props[Consumer1] // create Consumer actor and activate endpoint in background
|
val actor = actorOf(Props[Consumer1]) // create Consumer actor and activate endpoint in background
|
||||||
|
|
||||||
**Java**
|
**Java**
|
||||||
|
|
||||||
|
|
@ -371,7 +371,7 @@ after the ActorRef method returned.
|
||||||
import static akka.actor.Actors.*;
|
import static akka.actor.Actors.*;
|
||||||
import akka.actor.ActorRef;
|
import akka.actor.ActorRef;
|
||||||
|
|
||||||
ActorRef actor = actorOf(Consumer1.class); // create Consumer actor and activate endpoint in background
|
ActorRef actor = actorOf(new Props(Consumer1.class)); // create Consumer actor and activate endpoint in background
|
||||||
|
|
||||||
|
|
||||||
Typed actors
|
Typed actors
|
||||||
|
|
@ -544,7 +544,7 @@ still in progress after the ``ActorRef.stop`` method returned.
|
||||||
|
|
||||||
import akka.actor.Actor._
|
import akka.actor.Actor._
|
||||||
|
|
||||||
val actor = actorOf(Props[Consumer1] // create Consumer actor
|
val actor = actorOf(Props[Consumer1]) // create Consumer actor
|
||||||
actor // activate endpoint in background
|
actor // activate endpoint in background
|
||||||
// ...
|
// ...
|
||||||
actor.stop // deactivate endpoint in background
|
actor.stop // deactivate endpoint in background
|
||||||
|
|
@ -556,7 +556,7 @@ still in progress after the ``ActorRef.stop`` method returned.
|
||||||
import static akka.actor.Actors.*;
|
import static akka.actor.Actors.*;
|
||||||
import akka.actor.ActorRef;
|
import akka.actor.ActorRef;
|
||||||
|
|
||||||
ActorRef actor = actorOf(Consumer1.class); // create Consumer actor and activate endpoint in background
|
ActorRef actor = actorOf(new Props(Consumer1.class)); // create Consumer actor and activate endpoint in background
|
||||||
// ...
|
// ...
|
||||||
actor.stop(); // deactivate endpoint in background
|
actor.stop(); // deactivate endpoint in background
|
||||||
|
|
||||||
|
|
@ -872,7 +872,7 @@ actor and register it at the remote server.
|
||||||
// ...
|
// ...
|
||||||
startCamelService
|
startCamelService
|
||||||
|
|
||||||
val consumer = val consumer = actorOf(Props[RemoteActor1]
|
val consumer = val consumer = actorOf(Props[RemoteActor1])
|
||||||
|
|
||||||
remote.start("localhost", 7777)
|
remote.start("localhost", 7777)
|
||||||
remote.register(consumer) // register and start remote consumer
|
remote.register(consumer) // register and start remote consumer
|
||||||
|
|
@ -888,7 +888,7 @@ actor and register it at the remote server.
|
||||||
// ...
|
// ...
|
||||||
CamelServiceManager.startCamelService();
|
CamelServiceManager.startCamelService();
|
||||||
|
|
||||||
ActorRef actor = actorOf(RemoteActor1.class);
|
ActorRef actor = actorOf(new Props(RemoteActor1.class));
|
||||||
|
|
||||||
remote().start("localhost", 7777);
|
remote().start("localhost", 7777);
|
||||||
remote().register(actor); // register and start remote consumer
|
remote().register(actor); // register and start remote consumer
|
||||||
|
|
@ -1028,7 +1028,7 @@ used.
|
||||||
import akka.actor.Actor._
|
import akka.actor.Actor._
|
||||||
import akka.actor.ActorRef
|
import akka.actor.ActorRef
|
||||||
|
|
||||||
val producer = actorOf(Props[Producer1]
|
val producer = actorOf(Props[Producer1])
|
||||||
val response = (producer ? "akka rocks").get
|
val response = (producer ? "akka rocks").get
|
||||||
val body = response.bodyAs[String]
|
val body = response.bodyAs[String]
|
||||||
|
|
||||||
|
|
@ -1040,7 +1040,7 @@ used.
|
||||||
import static akka.actor.Actors.*;
|
import static akka.actor.Actors.*;
|
||||||
import akka.camel.Message;
|
import akka.camel.Message;
|
||||||
|
|
||||||
ActorRef producer = actorOf(Producer1.class);
|
ActorRef producer = actorOf(new Props(Producer1.class));
|
||||||
Message response = (Message)producer.sendRequestReply("akka rocks");
|
Message response = (Message)producer.sendRequestReply("akka rocks");
|
||||||
String body = response.getBodyAs(String.class)
|
String body = response.getBodyAs(String.class)
|
||||||
|
|
||||||
|
|
@ -1156,7 +1156,7 @@ argument.
|
||||||
import akka.actor.ActorRef;
|
import akka.actor.ActorRef;
|
||||||
|
|
||||||
ActorRef target = ...
|
ActorRef target = ...
|
||||||
ActorRef producer = actorOf(Props(new Producer1Factory(target));
|
ActorRef producer = actorOf(Props(new Producer1Factory(target)));
|
||||||
producer;
|
producer;
|
||||||
|
|
||||||
Before producing messages to endpoints, producer actors can pre-process them by
|
Before producing messages to endpoints, producer actors can pre-process them by
|
||||||
|
|
@ -1946,7 +1946,7 @@ ends at the target actor.
|
||||||
import akka.camel.{Message, CamelContextManager, CamelServiceManager}
|
import akka.camel.{Message, CamelContextManager, CamelServiceManager}
|
||||||
|
|
||||||
object CustomRouteExample extends Application {
|
object CustomRouteExample extends Application {
|
||||||
val target = actorOf(Props[CustomRouteTarget]
|
val target = actorOf(Props[CustomRouteTarget])
|
||||||
|
|
||||||
CamelServiceManager.startCamelService
|
CamelServiceManager.startCamelService
|
||||||
CamelContextManager.mandatoryContext.addRoutes(new CustomRouteBuilder(target.uuid))
|
CamelContextManager.mandatoryContext.addRoutes(new CustomRouteBuilder(target.uuid))
|
||||||
|
|
@ -1982,7 +1982,7 @@ ends at the target actor.
|
||||||
|
|
||||||
public class CustomRouteExample {
|
public class CustomRouteExample {
|
||||||
public static void main(String... args) throws Exception {
|
public static void main(String... args) throws Exception {
|
||||||
ActorRef target = actorOf(CustomRouteTarget.class);
|
ActorRef target = actorOf(new Props(CustomRouteTarget.class));
|
||||||
CamelServiceManager.startCamelService();
|
CamelServiceManager.startCamelService();
|
||||||
CamelContextManager.getMandatoryContext().addRoutes(new CustomRouteBuilder(target.getUuid()));
|
CamelContextManager.getMandatoryContext().addRoutes(new CustomRouteBuilder(target.getUuid()));
|
||||||
}
|
}
|
||||||
|
|
@ -2545,9 +2545,9 @@ as shown in the following snippet (see also `sample.camel.Boot`_).
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wire and start the example actors
|
// Wire and start the example actors
|
||||||
val httpTransformer = actorOf(Props(new HttpTransformer)
|
val httpTransformer = actorOf(Props(new HttpTransformer))
|
||||||
val httpProducer = actorOf(Props(new HttpProducer(httpTransformer))
|
val httpProducer = actorOf(Props(new HttpProducer(httpTransformer)))
|
||||||
val httpConsumer = actorOf(Props(new HttpConsumer(httpProducer))
|
val httpConsumer = actorOf(Props(new HttpConsumer(httpProducer)))
|
||||||
|
|
||||||
The `jetty endpoints`_ of HttpConsumer and HttpProducer support asynchronous
|
The `jetty endpoints`_ of HttpConsumer and HttpProducer support asynchronous
|
||||||
in-out message exchanges and do not allocate threads for the full duration of
|
in-out message exchanges and do not allocate threads for the full duration of
|
||||||
|
|
@ -2637,9 +2637,9 @@ follows.
|
||||||
CamelContextManager.init()
|
CamelContextManager.init()
|
||||||
CamelContextManager.mandatoryContext.addRoutes(new CustomRouteBuilder)
|
CamelContextManager.mandatoryContext.addRoutes(new CustomRouteBuilder)
|
||||||
|
|
||||||
val producer = actorOf(Props[Producer1]
|
val producer = actorOf(Props[Producer1])
|
||||||
val mediator = actorOf(Props(new Transformer(producer))
|
val mediator = actorOf(Props(new Transformer(producer)))
|
||||||
val consumer = actorOf(Props(new Consumer3(mediator))
|
val consumer = actorOf(Props(new Consumer3(mediator)))
|
||||||
}
|
}
|
||||||
|
|
||||||
class CustomRouteBuilder extends RouteBuilder {
|
class CustomRouteBuilder extends RouteBuilder {
|
||||||
|
|
@ -2741,11 +2741,11 @@ Wiring these actors to implement the above example is as simple as
|
||||||
|
|
||||||
// Setup publish/subscribe example
|
// Setup publish/subscribe example
|
||||||
val jmsUri = "jms:topic:test"
|
val jmsUri = "jms:topic:test"
|
||||||
val jmsSubscriber1 = actorOf(Props(new Subscriber("jms-subscriber-1", jmsUri))
|
val jmsSubscriber1 = actorOf(Props(new Subscriber("jms-subscriber-1", jmsUri)))
|
||||||
val jmsSubscriber2 = actorOf(Props(new Subscriber("jms-subscriber-2", jmsUri))
|
val jmsSubscriber2 = actorOf(Props(new Subscriber("jms-subscriber-2", jmsUri)))
|
||||||
val jmsPublisher = actorOf(Props(new Publisher("jms-publisher", jmsUri))
|
val jmsPublisher = actorOf(Props(new Publisher("jms-publisher", jmsUri)))
|
||||||
|
|
||||||
val jmsPublisherBridge = actorOf(Props(new PublisherBridge("jetty:http://0.0.0.0:8877/camel/pub/jms", jmsPublisher))
|
val jmsPublisherBridge = actorOf(Props(new PublisherBridge("jetty:http://0.0.0.0:8877/camel/pub/jms", jmsPublisher)))
|
||||||
}
|
}
|
||||||
|
|
||||||
To publish messages to subscribers one could of course also use the JMS API
|
To publish messages to subscribers one could of course also use the JMS API
|
||||||
|
|
@ -2838,10 +2838,10 @@ to be changed.
|
||||||
|
|
||||||
// Setup publish/subscribe example
|
// Setup publish/subscribe example
|
||||||
val cometdUri = "cometd://localhost:8111/test/abc?resourceBase=target"
|
val cometdUri = "cometd://localhost:8111/test/abc?resourceBase=target"
|
||||||
val cometdSubscriber = actorOf(Props(new Subscriber("cometd-subscriber", cometdUri))
|
val cometdSubscriber = actorOf(Props(new Subscriber("cometd-subscriber", cometdUri)))
|
||||||
val cometdPublisher = actorOf(Props(new Publisher("cometd-publisher", cometdUri))
|
val cometdPublisher = actorOf(Props(new Publisher("cometd-publisher", cometdUri)))
|
||||||
|
|
||||||
val cometdPublisherBridge = actorOf(Props(new PublisherBridge("jetty:http://0.0.0.0:8877/camel/pub/cometd", cometdPublisher))
|
val cometdPublisherBridge = actorOf(Props(new PublisherBridge("jetty:http://0.0.0.0:8877/camel/pub/cometd", cometdPublisher)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -2884,7 +2884,7 @@ seconds:
|
||||||
startCamelService
|
startCamelService
|
||||||
|
|
||||||
// create and start a quartz actor
|
// create and start a quartz actor
|
||||||
val myActor = actorOf(Props[MyQuartzActor]
|
val myActor = actorOf(Props[MyQuartzActor])
|
||||||
|
|
||||||
} // end main
|
} // end main
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -102,5 +102,5 @@ The above actor can be added as listener of registry events:
|
||||||
import akka.actor._
|
import akka.actor._
|
||||||
import akka.actor.Actor._
|
import akka.actor.Actor._
|
||||||
|
|
||||||
val listener = actorOf(Props[RegistryListener]
|
val listener = actorOf(Props[RegistryListener])
|
||||||
registry.addListener(listener)
|
registry.addListener(listener)
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,7 @@ Creating Actors with default constructor
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
|
|
||||||
.. includecode:: code/ActorDocSpec.scala
|
.. includecode:: code/ActorDocSpec.scala
|
||||||
:include: imports2,system-actorOf
|
:include: imports2,system-actorOf
|
||||||
|
|
||||||
The call to :meth:`actorOf` returns an instance of ``ActorRef``. This is a handle to
|
The call to :meth:`actorOf` returns an instance of ``ActorRef``. This is a handle to
|
||||||
the ``Actor`` instance which you can use to interact with the ``Actor``. The
|
the ``Actor`` instance which you can use to interact with the ``Actor``. The
|
||||||
|
|
@ -87,7 +87,7 @@ Creating Actors with non-default constructor
|
||||||
--------------------------------------------
|
--------------------------------------------
|
||||||
|
|
||||||
If your Actor has a constructor that takes parameters then you can't create it
|
If your Actor has a constructor that takes parameters then you can't create it
|
||||||
using ``actorOf(Props[TYPE]``. Instead you can use a variant of ``actorOf`` that takes
|
using ``actorOf(Props[TYPE])``. Instead you can use a variant of ``actorOf`` that takes
|
||||||
a call-by-name block in which you can create the Actor in any way you like.
|
a call-by-name block in which you can create the Actor in any way you like.
|
||||||
|
|
||||||
Here is an example:
|
Here is an example:
|
||||||
|
|
|
||||||
|
|
@ -253,7 +253,5 @@ class ActorDocSpec extends AkkaSpec(Map("akka.loglevel" -> "INFO")) {
|
||||||
//#hot-swap-actor
|
//#hot-swap-actor
|
||||||
|
|
||||||
val actor = system.actorOf(Props(new HotSwapActor))
|
val actor = system.actorOf(Props(new HotSwapActor))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -26,8 +26,8 @@ To use it you can either create a Router through the ``routerActor()`` factory m
|
||||||
|
|
||||||
//Two actors, one named Pinger and one named Ponger
|
//Two actors, one named Pinger and one named Ponger
|
||||||
//The actor(pf) method creates an anonymous actor and starts it
|
//The actor(pf) method creates an anonymous actor and starts it
|
||||||
val pinger = actorOf(Props(new Actor { def receive = { case x => println("Pinger: " + x) } })
|
val pinger = actorOf(Props(new Actor { def receive = { case x => println("Pinger: " + x) } }))
|
||||||
val ponger = actorOf(Props(new Actor { def receive = { case x => println("Ponger: " + x) } })
|
val ponger = actorOf(Props(new Actor { def receive = { case x => println("Ponger: " + x) } }))
|
||||||
|
|
||||||
//A router that dispatches Ping messages to the pinger
|
//A router that dispatches Ping messages to the pinger
|
||||||
//and Pong messages to the ponger
|
//and Pong messages to the ponger
|
||||||
|
|
@ -53,8 +53,8 @@ Or by mixing in akka.routing.Router:
|
||||||
|
|
||||||
class MyRouter extends Actor with Router {
|
class MyRouter extends Actor with Router {
|
||||||
//Our pinger and ponger actors
|
//Our pinger and ponger actors
|
||||||
val pinger = actorOf(Props(new Actor { def receive = { case x => println("Pinger: " + x) } })
|
val pinger = actorOf(Props(new Actor { def receive = { case x => println("Pinger: " + x) } }))
|
||||||
val ponger = actorOf(Props(new Actor { def receive = { case x => println("Ponger: " + x) } })
|
val ponger = actorOf(Props(new Actor { def receive = { case x => println("Ponger: " + x) } }))
|
||||||
//When we get a ping, we dispatch to the pinger
|
//When we get a ping, we dispatch to the pinger
|
||||||
//When we get a pong, we dispatch to the ponger
|
//When we get a pong, we dispatch to the ponger
|
||||||
def routes = {
|
def routes = {
|
||||||
|
|
@ -64,7 +64,7 @@ Or by mixing in akka.routing.Router:
|
||||||
}
|
}
|
||||||
|
|
||||||
//Create an instance of our router, and start it
|
//Create an instance of our router, and start it
|
||||||
val d = actorOf(Props[MyRouter]
|
val d = actorOf(Props[MyRouter])
|
||||||
|
|
||||||
d ! Ping //Prints "Pinger: Ping"
|
d ! Ping //Prints "Pinger: Ping"
|
||||||
d ! Pong //Prints "Ponger: Pong"
|
d ! Pong //Prints "Ponger: Pong"
|
||||||
|
|
@ -90,8 +90,8 @@ Example using the ``loadBalancerActor()`` factory method:
|
||||||
//Two actors, one named Pinger and one named Ponger
|
//Two actors, one named Pinger and one named Ponger
|
||||||
//The actor(pf) method creates an anonymous actor and starts it
|
//The actor(pf) method creates an anonymous actor and starts it
|
||||||
|
|
||||||
val pinger = actorOf(Props(new Actor { def receive = { case x => println("Pinger: " + x) } })
|
val pinger = actorOf(Props(new Actor { def receive = { case x => println("Pinger: " + x) } }))
|
||||||
val ponger = actorOf(Props(new Actor { def receive = { case x => println("Ponger: " + x) } })
|
val ponger = actorOf(Props(new Actor { def receive = { case x => println("Ponger: " + x) } }))
|
||||||
|
|
||||||
//A load balancer that given a sequence of actors dispatches them accordingly
|
//A load balancer that given a sequence of actors dispatches them accordingly
|
||||||
//a CyclicIterator works in a round-robin-fashion
|
//a CyclicIterator works in a round-robin-fashion
|
||||||
|
|
@ -117,14 +117,14 @@ Or by mixing in akka.routing.LoadBalancer
|
||||||
|
|
||||||
//A load balancer that balances between a pinger and a ponger
|
//A load balancer that balances between a pinger and a ponger
|
||||||
class MyLoadBalancer extends Actor with LoadBalancer {
|
class MyLoadBalancer extends Actor with LoadBalancer {
|
||||||
val pinger = actorOf(Props(new Actor { def receive = { case x => println("Pinger: " + x) } })
|
val pinger = actorOf(Props(new Actor { def receive = { case x => println("Pinger: " + x) } }))
|
||||||
val ponger = actorOf(Props(new Actor { def receive = { case x => println("Ponger: " + x) } })
|
val ponger = actorOf(Props(new Actor { def receive = { case x => println("Ponger: " + x) } }))
|
||||||
|
|
||||||
val seq = new CyclicIterator[ActorRef](List(pinger,ponger))
|
val seq = new CyclicIterator[ActorRef](List(pinger,ponger))
|
||||||
}
|
}
|
||||||
|
|
||||||
//Create an instance of our loadbalancer, and start it
|
//Create an instance of our loadbalancer, and start it
|
||||||
val d = actorOf(Props[MyLoadBalancer]
|
val d = actorOf(Props[MyLoadBalancer])
|
||||||
|
|
||||||
d ! Pong //Prints "Pinger: Pong"
|
d ! Pong //Prints "Pinger: Pong"
|
||||||
d ! Pong //Prints "Ponger: Pong"
|
d ! Pong //Prints "Ponger: Pong"
|
||||||
|
|
|
||||||
|
|
@ -371,7 +371,7 @@ Here is an example of using ``retry`` to block until an account has enough money
|
||||||
val account1 = Ref(100.0)
|
val account1 = Ref(100.0)
|
||||||
val account2 = Ref(100.0)
|
val account2 = Ref(100.0)
|
||||||
|
|
||||||
val transferer = Actor.actorOf(Props(new Transferer)
|
val transferer = Actor.actorOf(Props(new Transferer))
|
||||||
|
|
||||||
transferer ! Transfer(account1, account2, 500.0)
|
transferer ! Transfer(account1, account2, 500.0)
|
||||||
// INFO Transferer: not enough money - retrying
|
// INFO Transferer: not enough money - retrying
|
||||||
|
|
@ -427,7 +427,7 @@ You can also have two alternative blocking transactions, one of which can succee
|
||||||
val ref1 = Ref(0)
|
val ref1 = Ref(0)
|
||||||
val ref2 = Ref(0)
|
val ref2 = Ref(0)
|
||||||
|
|
||||||
val brancher = Actor.actorOf(Props(new Brancher)
|
val brancher = Actor.actorOf(Props(new Brancher))
|
||||||
|
|
||||||
brancher ! Branch(ref1, ref2, 1)
|
brancher ! Branch(ref1, ref2, 1)
|
||||||
// INFO Brancher: not enough on left - retrying
|
// INFO Brancher: not enough on left - retrying
|
||||||
|
|
|
||||||
|
|
@ -236,7 +236,7 @@ common task easy:
|
||||||
|
|
||||||
"send back messages unchanged" in {
|
"send back messages unchanged" in {
|
||||||
|
|
||||||
val echo = Actor.actorOf(Props[EchoActor]
|
val echo = Actor.actorOf(Props[EchoActor])
|
||||||
echo ! "hello world"
|
echo ! "hello world"
|
||||||
expectMsg("hello world")
|
expectMsg("hello world")
|
||||||
|
|
||||||
|
|
@ -431,7 +431,7 @@ maximum time bound, the overall block may take arbitrarily longer in this case.
|
||||||
class SomeSpec extends WordSpec with MustMatchers with TestKit {
|
class SomeSpec extends WordSpec with MustMatchers with TestKit {
|
||||||
"A Worker" must {
|
"A Worker" must {
|
||||||
"send timely replies" in {
|
"send timely replies" in {
|
||||||
val worker = actorOf(...)
|
val worker = ActorSystem().actorOf(...)
|
||||||
within (500 millis) {
|
within (500 millis) {
|
||||||
worker ! "some work"
|
worker ! "some work"
|
||||||
expectMsg("some result")
|
expectMsg("some result")
|
||||||
|
|
@ -471,7 +471,7 @@ simply mix in `ÌmplicitSender`` into your test.
|
||||||
class SomeSpec extends WordSpec with MustMatchers with TestKit with ImplicitSender {
|
class SomeSpec extends WordSpec with MustMatchers with TestKit with ImplicitSender {
|
||||||
"A Worker" must {
|
"A Worker" must {
|
||||||
"send timely replies" in {
|
"send timely replies" in {
|
||||||
val worker = actorOf(...)
|
val worker = ActorSystem().actorOf(...)
|
||||||
within (500 millis) {
|
within (500 millis) {
|
||||||
worker ! "some work" // testActor is the "sender" for this message
|
worker ! "some work" // testActor is the "sender" for this message
|
||||||
expectMsg("some result")
|
expectMsg("some result")
|
||||||
|
|
@ -506,7 +506,7 @@ using a small example::
|
||||||
|
|
||||||
val probe1 = TestProbe()
|
val probe1 = TestProbe()
|
||||||
val probe2 = TestProbe()
|
val probe2 = TestProbe()
|
||||||
val actor = Actor.actorOf(Props[MyDoubleEcho]
|
val actor = ActorSystem().actorOf(Props[MyDoubleEcho])
|
||||||
actor ! (probe1.ref, probe2.ref)
|
actor ! (probe1.ref, probe2.ref)
|
||||||
actor ! "hello"
|
actor ! "hello"
|
||||||
probe1.expectMsg(50 millis, "hello")
|
probe1.expectMsg(50 millis, "hello")
|
||||||
|
|
@ -553,8 +553,9 @@ concerning volume and timing of the message flow while still keeping the
|
||||||
network functioning::
|
network functioning::
|
||||||
|
|
||||||
val probe = TestProbe()
|
val probe = TestProbe()
|
||||||
val source = Actor.actorOf(Props(new Source(probe))
|
val system = ActorSystem()
|
||||||
val dest = Actor.actorOf(Props[Destination]
|
val source = system.actorOf(Props(new Source(probe)))
|
||||||
|
val dest = system.actorOf(Props[Destination])
|
||||||
source ! "start"
|
source ! "start"
|
||||||
probe.expectMsg("work")
|
probe.expectMsg("work")
|
||||||
probe.forward(dest)
|
probe.forward(dest)
|
||||||
|
|
@ -613,7 +614,7 @@ or from the client code
|
||||||
|
|
||||||
.. code-block:: scala
|
.. code-block:: scala
|
||||||
|
|
||||||
val ref = Actor.actorOf(Props[MyActor].withDispatcher(CallingThreadDispatcher.global))
|
val ref = system.actorOf(Props[MyActor].withDispatcher(CallingThreadDispatcher.global))
|
||||||
|
|
||||||
As the :class:`CallingThreadDispatcher` does not have any configurable state,
|
As the :class:`CallingThreadDispatcher` does not have any configurable state,
|
||||||
you may always use the (lazily) preallocated one as shown in the examples.
|
you may always use the (lazily) preallocated one as shown in the examples.
|
||||||
|
|
|
||||||
|
|
@ -24,14 +24,16 @@ Ray Roestenburg's example code from `his blog <http://roestenburg.agilesquad.com
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class TestKitUsageSpec extends WordSpec with BeforeAndAfterAll with ShouldMatchers with TestKit {
|
class TestKitUsageSpec extends WordSpec with BeforeAndAfterAll with ShouldMatchers with TestKit {
|
||||||
val echoRef = actorOf(Props(new EchoActor)
|
val system = ActorSystem()
|
||||||
val forwardRef = actorOf(Props(new ForwardingActor(testActor))
|
import system._
|
||||||
val filterRef = actorOf(Props(new FilteringActor(testActor))
|
val echoRef = actorOf(Props(new EchoActor))
|
||||||
|
val forwardRef = actorOf(Props(new ForwardingActor(testActor)))
|
||||||
|
val filterRef = actorOf(Props(new FilteringActor(testActor)))
|
||||||
val randomHead = Random.nextInt(6)
|
val randomHead = Random.nextInt(6)
|
||||||
val randomTail = Random.nextInt(10)
|
val randomTail = Random.nextInt(10)
|
||||||
val headList = List().padTo(randomHead, "0")
|
val headList = List().padTo(randomHead, "0")
|
||||||
val tailList = List().padTo(randomTail, "1")
|
val tailList = List().padTo(randomTail, "1")
|
||||||
val seqRef = actorOf(Props(new SequencingActor(testActor, headList, tailList))
|
val seqRef = actorOf(Props(new SequencingActor(testActor, headList, tailList)))
|
||||||
|
|
||||||
override protected def afterAll(): scala.Unit = {
|
override protected def afterAll(): scala.Unit = {
|
||||||
stopTestActor
|
stopTestActor
|
||||||
|
|
|
||||||
|
|
@ -64,8 +64,8 @@ Here is an example of coordinating two simple counter Actors so that they both i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val counter1 = Actor.actorOf(Props[Counter]
|
val counter1 = Actor.actorOf(Props[Counter])
|
||||||
val counter2 = Actor.actorOf(Props[Counter]
|
val counter2 = Actor.actorOf(Props[Counter])
|
||||||
|
|
||||||
counter1 ! Coordinated(Increment(Some(counter2)))
|
counter1 ! Coordinated(Increment(Some(counter2)))
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue