Akka 2.1 minimal remote actor przykład

EDIT Notice, I need to make the reverse changes of this https://github.com/akka/akka/commit/ce014ece3568938b2036c4ccfd21b92faba69607#L13L6 aby zaakceptowana odpowiedź działała z AKKA 2.1, która jest stabilną dystrybucją znajdującą się na stronie głównej akkas!


Przeczytałem wszystkie tutoriale, jakie znalazłem na akce, ale nic, co znalazłem, nie działa "po pudełku".

Używając eclipse, chcę stworzyć 2 programy.

Program1: zaczyna aktor " joe " i jakoś udostępnia go na 127.0.0.1: some_port

Program2: dostaje odniesienie do aktora " joe " w 127.0.0.1: some_port. Wysyła wiadomość powitalną do "joe".

Program 1 powinien wydrukować coś po otrzymaniu wiadomości. Chcę uruchomić ten przykład w eclipse używając AKKA 2.1. Czy ktoś może wymienić 2 programy, (program1 i program2) wraz z działającą aplikacją.plik conf, który robi to i nic więcej?


Edytuj > pokażę Ci, co mam. daleko:

Aktor

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")
  }
}

Podanie.conf

akka {
  actor {
    deployment {
      /greeter {
        remote = "akka://[email protected]:2553"
      }
    }
  }
}

Jednak ten program działa, gdy uruchamiam tylko Program2 i wyświetla:

Hello Felix
[INFO] [02/18/2013 12:27:29.999] [MySystem-akka.actor.default-dispatcher-2] [akka://MySystem/user/greeter] Hello Felix
Wygląda na to, że nie odbiera mojego podania.conf. Próbowałem umieścić go zarówno w ./ src / i ./ folder mojego projektu eclipse. Bez różnicy. Poza tym Wiem, że to naprawdę demote, ale potrzebuję tylko programu hello world, aby praca przy użyciu Akki. Spędziłem nad tym tyle czasu, nie uzyskując prostej aplikacji roboczej.
Author: SwankSwashbucklers, 2013-02-18

4 answers

Jak wspomniał korefn, zdalna dokumentacja wyjaśnia szczegółowo jego działanie. Łączy się również z przykładową aplikacją . Ten przykład powinien dać Ci wszystko, czego potrzebujesz, aby zacząć.


Edit

Aby uruchomić przykładową aplikację, wykonaj następujące kroki:

Clone from GitHub

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

Wejdź do katalogu akka i uruchom sbt

eecolor@BLACK:~/GihHub/akka$ sbt

Przełącz na akka-sample-project

akka > project akka-sample-remote

Call run on the projekt i wybierz 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://[email protected]:2552]
Started Calculator Application - waiting for messages
Przełącz się na inną konsolę i powtórz kilka pierwszych kroków]}
eecolor@BLACK:~/GihHub/akka$ sbt
akka > project akka-sample-remote

Wywołaj run i wybierz 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://[email protected]:2553]
Started Lookup Application
Sub result: 14 - 16 = -2
Sub result: 13 - 22 = -9
Add result: 56 + 93 = 149
Add result: 18 + 19 = 37

Przełącz się z powrotem na drugą konsolę i powinieneś zobaczyć coś takiego:

Calculating 14 - 16
Calculating 13 - 22
Calculating 56 + 93
Calculating 18 + 19
 6
Author: EECOLOR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-19 18:32:45

Aktualizacja dla Akka 2.2.3

Minimalną aplikację zdalną można utworzyć w następujący sposób:

Tworzenie 2 projektów w Eclipse: klient i Serwer

Serwer:

Kod serwera to

package server

import akka.actor.Actor
import akka.actor.ActorLogging
import akka.actor.ActorSystem
import akka.actor.Props

class Joe extends Actor {
  def receive = {
    case msg: String => println("joe received " + msg + " from " + sender)
    case _ => println("Received unknown msg ")
  }
}

object Server extends App {
  val system = ActorSystem("GreetingSystem")
  val joe = system.actorOf(Props[Joe], name = "joe")
  println(joe.path)
  joe ! "local msg!"
  println("Server ready")
}

Applinacja.conf dla serwera to

akka {
  loglevel = "DEBUG"
  actor {
     provider = "akka.remote.RemoteActorRefProvider"
  }
  remote {
     enabled-transports = ["akka.remote.netty.tcp"]
     netty.tcp {
         hostname = "127.0.0.1"
         port = 2552
     }
     log-sent-messages = on
     log-received-messages = on
  }
}

Klient:

Kod Klienta To

package client

import akka.actor._
import akka.actor.ActorDSL._

object Greet_Sender extends App {

   println("STARTING")

   implicit val system = ActorSystem("GreetingSystem-1")

   val joe = system.actorSelection("akka.tcp://[email protected]:2552/user/joe")

   println("That 's Joe:" + joe)

   val a = actor(new Act {
      whenStarting { joe ! "Hello Joe from remote" }
   })

   joe ! "Hello"

   println("Client has sent Hello to joe")
}

Aplikacja kliencka.conf to:

akka {
  #log-config-on-start = on
  stdout-loglevel = "DEBUG"
  loglevel = "DEBUG"
  actor {
      provider = "akka.remote.RemoteActorRefProvider"
  }
  remote {
    enabled-transports = ["akka.remote.netty.tcp"]
    log-sent-messages = on
    log-received-messages = on
    netty.tcp {
          hostname = "127.0.0.1"
          port = 0
    }
  }  
}

Konfiguracje muszą być umieszczone w dwóch plikach zwanych podanie.conf, zarówno w katalogu bin obu projektów.

 18
Author: Thomas Letschert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-01 17:41:13

Cóż, w twoim przykładzie Kod Klienta nigdy nie odwołuje się do pliku konfiguracyjnego i nie zadziała.

 0
Author: Michael Peng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-24 13:37:56

Akka domyślnie będzie korzystać z aplikacji.plik conf - tak więc nie musi być jawnie zaznaczony.

Jeśli ktoś chce to kod będzie (biorąc powyższy kod jako exmaple):

val configFile = getClass.getClassLoader.getResource("akka_local_application.conf").getFile
val config = ConfigFactory.parseFile(new File(configFile))
val system = ActorSystem("GreetingSystem",config)
val joe = system.actorOf(Props[Joe], name = "joe")
 0
Author: rak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-29 15:16:04