Updated after feedback. See #1063

This commit is contained in:
Henrik Engstrom 2011-12-15 18:19:40 +01:00
parent 41ce42c8f7
commit d68777e76e
9 changed files with 73 additions and 138 deletions

View file

@ -342,12 +342,12 @@ class RoutingSpec extends AkkaSpec with DefaultTimeout with ImplicitSender {
"custom router" must {
"be started when constructed" in {
val routedActor = system.actorOf(Props(new TestActor).withRouter(VoteCountRouter()))
val routedActor = system.actorOf(Props[TestActor].withRouter(VoteCountRouter()))
routedActor.isTerminated must be(false)
}
"count votes as intended - not as in Florida" in {
val routedActor = system.actorOf(Props(new TestActor).withRouter(VoteCountRouter()))
val routedActor = system.actorOf(Props[TestActor].withRouter(VoteCountRouter()))
routedActor ! DemocratVote
routedActor ! DemocratVote
routedActor ! RepublicanVote
@ -375,20 +375,20 @@ class RoutingSpec extends AkkaSpec with DefaultTimeout with ImplicitSender {
//#crActors
class DemocratActor extends Actor {
val counter = new AtomicInteger(0)
var counter = 0
def receive = {
case DemocratVote counter.incrementAndGet()
case DemocratCountResult sender ! counter.get
case DemocratVote counter += 1
case DemocratCountResult sender ! counter
}
}
class RepublicanActor extends Actor {
val counter = new AtomicInteger(0)
var counter = 0
def receive = {
case RepublicanVote counter.incrementAndGet()
case RepublicanCountResult sender ! counter.get
case RepublicanVote counter += 1
case RepublicanCountResult sender ! counter
}
}
//#crActors
@ -401,8 +401,8 @@ class RoutingSpec extends AkkaSpec with DefaultTimeout with ImplicitSender {
def createRoute(props: Props,
actorContext: ActorContext,
ref: RoutedActorRef): Route = {
val democratActor = actorContext.actorOf(Props(new DemocratActor), "d")
val republicanActor = actorContext.actorOf(Props(new RepublicanActor), "r")
val democratActor = actorContext.actorOf(Props[DemocratActor], "d")
val republicanActor = actorContext.actorOf(Props[RepublicanActor], "r")
val routees = Vector[ActorRef](democratActor, republicanActor)
//#crRegisterRoutees

View file

@ -1,94 +1,7 @@
.. _routing-java:
Routing (Java)
==============
UntypedDispatcher
-----------------
An UntypedDispatcher is an actor that routes incoming messages to outbound actors.
.. code-block:: java
import static akka.actor.Actors.*;
import akka.actor.*;
import akka.routing.*;
//A Pinger is an UntypedActor that prints "Pinger: <message>"
class Pinger extends UntypedActor {
public void onReceive(Object message) throws Exception {
System.out.println("Pinger: " + message);
}
}
//A Ponger is an UntypedActor that prints "Ponger: <message>"
class Ponger extends UntypedActor {
public void onReceive(Object message) throws Exception {
System.out.println("Ponger: " + message);
}
}
public class MyRouter extends UntypedRouter {
private ActorRef pinger = actorOf(new Props(Pinger.class));
private ActorRef ponger = actorOf(new Props(Ponger.class));
//Route Ping-messages to the pinger, and Pong-messages to the ponger
public ActorRef route(Object message) {
if("Ping".equals(message)) return pinger;
else if("Pong".equals(message)) return ponger;
else throw new IllegalArgumentException("I do not understand " + message);
}
}
ActorRef router = actorOf(new Props(MyRouter.class));
router.tell("Ping"); //Prints "Pinger: Ping"
router.tell("Pong"); //Prints "Ponger: Pong"
UntypedLoadBalancer
-------------------
An UntypedLoadBalancer is an actor that forwards messages it receives to a boundless sequence of destination actors.
.. code-block:: java
import static akka.actor.Actors.*;
import akka.actor.*;
import akka.routing.*;
import static java.util.Arrays.asList;
//A Pinger is an UntypedActor that prints "Pinger: <message>"
class Pinger extends UntypedActor {
public void onReceive(Object message) throws Exception {
System.out.println("Pinger: " + message);
}
}
//A Ponger is an UntypedActor that prints "Ponger: <message>"
class Ponger extends UntypedActor {
public void onReceive(Object message) throws Exception {
System.out.println("Ponger: " + message);
}
}
//Our load balancer, sends messages to a pinger, then a ponger, rinse and repeat.
public class MyLoadBalancer extends UntypedLoadBalancer {
private InfiniteIterator<ActorRef> actors = new CyclicIterator<ActorRef>(asList(
actorOf(new Props(Pinger.class)),
actorOf(new Props(Ponger.class))
));
public InfiniteIterator<ActorRef> seq() {
return actors;
}
}
ActorRef balancer = actorOf(new Props(MyLoadBalancer.class));
balancer.tell("Pong"); //Prints "Pinger: Pong"
balancer.tell("Ping"); //Prints "Ponger: Ping"
balancer.tell("Ping"); //Prints "Pinger: Ping"
balancer.tell("Pong"); //Prints "Ponger: Pong
You can also send a 'new Routing.Broadcast(msg)' message to the router to have it be broadcasted out to all the actors it represents.
.. code-block:: java
balancer.tell(new Routing.Broadcast(new PoisonPill()));
TDB

View file

@ -1,3 +1,6 @@
/**
* Copyright (C) 2009-2011 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.docs.routing
import akka.routing.{ BasicNoBackoffFilter, SmallestMailboxSelector, DefaultActorPool }

View file

@ -1,3 +1,6 @@
/**
* Copyright (C) 2009-2011 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.docs.routing
import akka.actor.ActorRef

View file

@ -1,3 +1,6 @@
/**
* Copyright (C) 2009-2011 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.docs.routing
import akka.routing.ActorPool

View file

@ -1,3 +1,6 @@
/**
* Copyright (C) 2009-2011 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.docs.routing
import akka.routing.{ ScatterGatherFirstCompletedRouter, BroadcastRouter, RandomRouter, RoundRobinRouter }
@ -21,7 +24,7 @@ class PrintlnActor extends Actor {
//#fibonacciActor
class FibonacciActor extends Actor {
def receive = {
case FibonacciNumber(nbr) sender.tell(fibonacci(nbr))
case FibonacciNumber(nbr) sender tell fibonacci(nbr)
}
private def fibonacci(n: Int): Int = {

View file

@ -1,6 +1,8 @@
/**
* Copyright (C) 2009-2011 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.docs.routing
import com.typesafe.config.{ ConfigFactory, Config }
import akka.actor.{ Actor, Props, ActorSystem }
import akka.routing.RoundRobinRouter

View file

@ -1,3 +1,6 @@
/**
* Copyright (C) 2009-2011 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.docs.routing
import akka.routing.RoundRobinRouter

View file

@ -1,3 +1,6 @@
.. _routing-scala:
Routing (Scala)
===============
@ -39,7 +42,7 @@ and
Here is the configuration file to instruct the routers how many instances of routees to create::
akka.actor.deployment {
/user/router {
/router {
nr-of-instances = 5
}
}
@ -68,6 +71,8 @@ When run you should see a similar output to this:
If you look closely to the output you can see that each of the routees received two messages which
is exactly what you would expect from a round-robin router to happen.
(The name of an actor is automatically created in the format ``$letter`` unless you specify it -
hence the names printed above.)
RandomRouter
************
@ -164,7 +169,7 @@ Broadcast Messages
^^^^^^^^^^^^^^^^^^
There is a special type of message that will be sent to all routees regardless of the router.
This message is called 'Broadcast' and is used in the following manner:
This message is called `Broadcast`` and is used in the following manner:
.. code-block:: scala
@ -234,7 +239,7 @@ The actor pool is built around three concepts: capacity, filtering and selection
Selection
^^^^^^^^^
All pools require a *Selector* to be mixed-in. This trait controls how and how many actors in the pool will
All pools require a ``Selector`` to be mixed-in. This trait controls how and how many actors in the pool will
receive the incoming message. Define *selectionCount* to some positive number greater than one to route to
multiple actors. Currently two are provided:
@ -245,7 +250,7 @@ Partial Fills
*************
When selecting more than one pooled actor, its possible that in order to fulfill the requested amount,
the selection set must contain duplicates. By setting *partialFill* to **true**, you instruct the selector to
the selection set must contain duplicates. By setting ``partialFill`` to ``true``, you instruct the selector to
return only unique actors from the pool.
Capacity