Package org.akka.essentials.java.router.custom.example

Source Code of org.akka.essentials.java.router.custom.example.BurstyMessageRouter

package org.akka.essentials.java.router.custom.example;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import akka.actor.ActorRef;
import akka.actor.Props;
import akka.actor.SupervisorStrategy;
import akka.dispatch.Dispatchers;
import akka.routing.CustomRoute;
import akka.routing.CustomRouterConfig;
import akka.routing.Destination;
import akka.routing.RouteeProvider;

/**
* Router that sends burst of packets to one actor before sending to the next.
* The packet burst is a configurable value
*
* @author Munish
*
*/
public class BurstyMessageRouter extends CustomRouterConfig {

  int noOfInstances;
  int messageBurst;

  public BurstyMessageRouter(int inNoOfInstances, int inMessageBurst) {
    noOfInstances = inNoOfInstances;
    messageBurst = inMessageBurst;
  }

  public String routerDispatcher() {
    return Dispatchers.DefaultDispatcherId();
  }

  public SupervisorStrategy supervisorStrategy() {
    return SupervisorStrategy.defaultStrategy();
  }

  @Override
  public CustomRoute createCustomRoute(RouteeProvider routeeProvider) {

    // create the arraylist for holding the actors
    final List<ActorRef> routees = new ArrayList<ActorRef>(noOfInstances);
    for (int i = 0; i < noOfInstances; i++) {
      // initialize the actors and add to the arraylist
      routees.add(routeeProvider.context().actorOf(
          new Props(MsgEchoActor.class)));
    }
    // register the list
    routeeProvider.registerRoutees(routees);

    return new CustomRoute() {
      int messageCount = 0;
      int actorSeq = 0;
      ActorRef actor = routees.get(actorSeq);

      public Iterable<Destination> destinationsFor(ActorRef sender,
          Object message) {
        List<Destination> destinationList = Arrays
            .asList(new Destination[] { new Destination(sender,
                actor) });
        // increment message count
        synchronized (this) {
          messageCount++;
        }
        // check message count
        if (messageCount == messageBurst) {
          actorSeq++;
          // reset the counter
          synchronized (this) {
            messageCount = 0;
          }
          // reset actorseq counter
          if (actorSeq == noOfInstances) {
            actorSeq = 0;
          }
          actor = routees.get(actorSeq);
        }
        return destinationList;
      }
    };
  }
}
TOP

Related Classes of org.akka.essentials.java.router.custom.example.BurstyMessageRouter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.