Package org.akka.essentials.clientserver.sample

Source Code of org.akka.essentials.clientserver.sample.ClientActorSystem

package org.akka.essentials.clientserver.sample;

import static akka.actor.Actors.poisonPill;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Address;
import akka.actor.AddressFromURIString;
import akka.actor.Deploy;
import akka.actor.Props;
import akka.actor.UntypedActor;
import akka.actor.UntypedActorFactory;
import akka.event.Logging;
import akka.event.LoggingAdapter;
import akka.kernel.Bootable;
import akka.remote.RemoteScope;

import com.typesafe.config.ConfigFactory;

public class ClientActorSystem implements Bootable {

  private LoggingAdapter log = null;
  private ActorSystem system;
  private ActorRef actor;
  private ActorRef remoteActor;

  /*
   * Default Constructor
   */
  public ClientActorSystem() {
    system = ActorSystem.create("ClientSys", ConfigFactory.load()
        .getConfig("ClientSys"));
    log = Logging.getLogger(system, this);

  }

  /*
   * Method demonstrates how to get a reference to the ServerActor deployed
   * on a remote node and how to pass the message to the same.
   * Key here is system.actorFor()
   */
  @SuppressWarnings("serial")
  public void remoteActorRefDemo() {
    log.info("Creating a reference to remote actor");
    // creating a reference to the remote ServerActor
    // by passing the complete remote actor path
    remoteActor = system
        .actorFor("akka://ServerSys@127.0.0.1:2552/user/serverActor");

    log.info("ServerActor with hashcode #" + remoteActor.hashCode());
   
    // create a local actor and pass the reference of the remote actor
    actor = system.actorOf(new Props(new UntypedActorFactory() {
      public UntypedActor create() {
        return new ClientActor(remoteActor);
      }
    }));
    // send a message to the local client actor
    actor.tell("Start-RemoteActorRef");
  }

  /*
   * Method demonstrates how to create an instance of ServerActor on remote
   * node and how to pass the message to the same. This method demonstrates one
   * way to create the server node address
   * Key here is system.actorOf()
   *
   * refer to the ServerActorSystem for information on new server actor creation
   * identified via hashcode's
   */
  @SuppressWarnings("serial")
  public void remoteActorCreationDemo1() {
    log.info("Creating a actor using remote deployment mechanism");

    // create the address object that points to the remote server
    Address addr = new Address("akka", "ServerSys", "127.0.0.1", 2552);

    // creating the ServerActor on the specified remote server
    final ActorRef serverActor = system.actorOf(new Props(ServerActor.class)
        .withDeploy(new Deploy(new RemoteScope(addr))));

    // create a local actor and pass the reference of the remote actor
    actor = system.actorOf(new Props(new UntypedActorFactory() {
      public UntypedActor create() {
        return new ClientActor(serverActor);
      }
    }));
    // send a message to the local client actor
    actor.tell("Start-RemoteActorCreationDemo1");
  }
 
  /*
   * Method demonstrates how to create an instance of ServerActor on remote
   * node and how to pass the message to the same. This method demonstrates an
   * alternate way to create the server node address
   * Key here is system.actorOf()
   *
   * Refer to the ServerActorSystem for information on new server actor creation
   * identified via hashcode's
   */
  @SuppressWarnings("serial")
  public void remoteActorCreationDemo2() {
    log.info("Creating a actor with remote deployment");

    // alternate way to create the address object that points to the remote
    // server
    Address addr = AddressFromURIString
        .parse("akka://ServerSys@127.0.0.1:2552");

    // creating the ServerActor on the specified remote server
    final ActorRef serverActor = system.actorOf(new Props(ServerActor.class)
        .withDeploy(new Deploy(new RemoteScope(addr))));

    // create a local actor and pass the reference of the remote actor
    actor = system.actorOf(new Props(new UntypedActorFactory() {
      public UntypedActor create() {
        return new ClientActor(serverActor);
      }
    }));
    // send a message to the local client actor
    actor.tell("Start-RemoteActorCreationDemo2");
  }

  /*
   * Method demonstrates the way to create an actor using remote deployment but the address
   * is not hard coded. The deployment information is picked from the application.conf
   *  akka{ 
   *    actor {   
   *       deployment {
   *           /remoteServerActor {
   *                   remote = "akka://ServerSys@127.0.0.1:2552"
   *          }
   *       }
   *     }
   *   }
   *   The deployment name "remoteServerActor" is passed as the parameter to the system.actorOf()
   *   method
   *  
   *   This option allows to move the actor creation in an existing application from local node to
   *   any remote node
   *
   * Refer to the ServerActorSystem for information on new server actor creation
   * identified via hashcode's
     * 
   */
  @SuppressWarnings("serial")
  public void remoteActorCreationDemo3() {
    log.info("Creating a actor with remote deployment");

    // creating the ServerActor on the specified remote server
    final ActorRef serverActor = system.actorOf(new Props(ServerActor.class),"remoteServerActor");

    // create a local actor and pass the reference of the remote actor
    actor = system.actorOf(new Props(new UntypedActorFactory() {
      public UntypedActor create() {
        return new ClientActor(serverActor);
      }
    }));
    // send a message to the local client actor
    actor.tell("Start-RemoteActorCreationDemo3");
  }

  public void shutdown() {
   
    log.info("Sending PoisonPill to ServerActorSystem");
    remoteActor.tell(poisonPill());
   
    log.info("Shutting down the ClientActorSystem");
    system.shutdown();
  }

  public void startup() {
  }

  public static void main(String[] args) {

    ClientActorSystem cAS = new ClientActorSystem();
    cAS.remoteActorRefDemo();
    cAS.remoteActorCreationDemo1();
    cAS.remoteActorCreationDemo2();
    cAS.remoteActorCreationDemo3();
    cAS.shutdown();
  }

}
TOP

Related Classes of org.akka.essentials.clientserver.sample.ClientActorSystem

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.