Routing (Java)

Routing (Java)

UntypedDispatcher

An UntypedDispatcher is an actor that routes incoming messages to outbound actors.

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 MyDispatcher extends UntypedDispatcher {
  private ActorRef pinger = actorOf(Pinger.class).start();
  private ActorRef ponger = actorOf(Ponger.class).start();

  //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 dispatcher = actorOf(MyDispatcher.class).start();
dispatcher.tell("Ping"); //Prints "Pinger: Ping"
dispatcher.tell("Pong"); //Prints "Ponger: Pong"

UntypedLoadBalancer

An UntypedLoadBalancer is an actor that forwards messages it receives to a boundless sequence of destination actors.

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(Pinger.class).start(),
    actorOf(Ponger.class).start()
  ));

  public InfiniteIterator<ActorRef> seq() {
    return actors;
  }
}

ActorRef dispatcher = actorOf(MyLoadBalancer.class).start();
dispatcher.tell("Pong"); //Prints "Pinger: Pong"
dispatcher.tell("Ping"); //Prints "Ponger: Ping"
dispatcher.tell("Ping"); //Prints "Pinger: Ping"
dispatcher.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.

router.tell(new Routing.Broadcast(new PoisonPill()));

Contents