scalaakkaactorremote-actors

Akka 2.1 minimal remote actor example


EDIT Notice, I needed to make the reverse changes of this https://github.com/akka/akka/commit/ce014ece3568938b2036c4ccfd21b92faba69607#L13L6 to make the accepted answer work with AKKA 2.1 which is the stable distribution found on akkas homepage!


I have read all the tutorials I could find on AKKA, but nothing I found works "out of box".

Using eclipse, I want to create 2 programs.

Program1: starts actor "joe" and somehow makes it available on 127.0.0.1:some_port

Program2: gets a reference to actor "joe" at 127.0.0.1:some_port. Sends a hello message to "joe".

Program 1 should print something when the message is received. I want to run this example in eclipse using AKKA 2.1. Can someone list 2 programs, (program1 and program2) together with a working application.conf file that does this and nothing else?


edit> let me show you what I got so far:

actor

case class Greeting(who: String) extends Serializable

class GreetingActor extends Actor with ActorLogging {
  def receive = {
    case Greeting(who) ⇒ println("Hello " + who);log.info("Hello " + who)
  }
}

Program1:

package test

import akka.actor.ActorSystem

object Machine1 {

  def main(args: Array[String]): Unit = {
    val system = ActorSystem("MySystem")
  }

}

Program2

package test

import akka.actor.ActorSystem
import akka.actor.Props
import akka.actor.actorRef2Scala

object Machine2 {
  def main(args: Array[String]): Unit = {
    val system = ActorSystem("MySystem")
    val greeter = system.actorOf(Props[GreetingActor], name = "greeter")
    greeter ! Greeting("Felix")
  }
}

application.conf

akka {
  actor {
    deployment {
      /greeter {
        remote = "akka://MySystem@127.0.0.1:2553"
      }
    }
  }
}

However, this program works when I start only Program2 and it outputs:

Hello Felix
[INFO] [02/18/2013 12:27:29.999] [MySystem-akka.actor.default-dispatcher-2] [akka://MySystem/user/greeter] Hello Felix

It seems that it is not picking up my application.conf. I tried placing it both in the ./src/ and ./ folder of my eclipse project. No difference. Also, I know this is really demote deployment, but I need just a hello world program to work using AKKA. I spent so much time on this without getting a simple working application.


Solution

  • As korefn mentioned, the remote documentation explains it's workings in detail. It also links to an example application. That example should give you everything you need to get started.


    Edit

    To get the sample application running perform the following steps:

    Clone from GitHub

    eecolor@BLACK:~/GihHub$ git clone https://github.com/akka/akka.git
    

    Go into the akka directory and run sbt

    eecolor@BLACK:~/GihHub/akka$ sbt
    

    Switch to the akka-sample-project

    akka > project akka-sample-remote
    

    Call run on the project and select the CalcApp

    Multiple main classes detected, select one to run:
    
     [1] sample.remote.calculator.java.JCreationApp
     [2] sample.remote.calculator.LookupApp
     [3] sample.remote.calculator.CalcApp
     [4] sample.remote.calculator.java.JLookupApp
     [5] sample.remote.calculator.CreationApp
     [6] sample.remote.calculator.java.JCalcApp
    
    Enter number: 3
    
    [info] Running sample.remote.calculator.CalcApp 
    [INFO] [02/19/2013 19:22:09.055] [run-main] [Remoting] Starting remoting
    [INFO] [02/19/2013 19:22:09.230] [run-main] [Remoting] Remoting started; listening on addresses :[akka.tcp://CalculatorApplication@127.0.0.1:2552]
    Started Calculator Application - waiting for messages
    

    Switch to another console and repeat the first few steps

    eecolor@BLACK:~/GihHub/akka$ sbt
    akka > project akka-sample-remote
    

    Call run and select the LookupApp

    akka-sample-remote > run
    
    Multiple main classes detected, select one to run:
    
     [1] sample.remote.calculator.java.JCreationApp
     [2] sample.remote.calculator.LookupApp
     [3] sample.remote.calculator.CalcApp
     [4] sample.remote.calculator.java.JLookupApp
     [5] sample.remote.calculator.CreationApp
     [6] sample.remote.calculator.java.JCalcApp
    
    Enter number: 2
    
    [info] Running sample.remote.calculator.LookupApp 
    [INFO] [02/19/2013 19:23:39.358] [run-main] [Remoting] Starting remoting
    [INFO] [02/19/2013 19:23:39.564] [run-main] [Remoting] Remoting started; listening on addresses :[akka.tcp://LookupApplication@127.0.0.1:2553]
    Started Lookup Application
    Sub result: 14 - 16 = -2
    Sub result: 13 - 22 = -9
    Add result: 56 + 93 = 149
    Add result: 18 + 19 = 37
    

    Switch back to the other console and you should see something like this:

    Calculating 14 - 16
    Calculating 13 - 22
    Calculating 56 + 93
    Calculating 18 + 19