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