Пример минимального удаленного актера Akka 2.1
РЕДАКТИРОВАТЬ Обратите внимание, мне нужно было сделать обратные изменения этого https://github.com/akka/akka/commit/ce014ece3568938b2036c4ccfd21b92faba69607 чтобы заставить принятый ответ работать с AKKA 2.1, который является стабильным дистрибутивом, найденным на домашней странице akkas!
Я прочитал все учебники, которые я смог найти на AKKA, но ничего не нашел работ "из коробки".
Используя eclipse, я хочу создать 2 программы.
Program1: запускает актера "Джо" и каким-то образом делает его доступным на 127.0.0.1:some_port
Program2: получает ссылку на актера "Джо" в 127.0.0.1:some_port. Посылает приветственное сообщение "Джо".
Программа 1 должна что-то напечатать при получении сообщения. Я хочу запустить этот пример в Eclipse, используя AKKA 2.1. Может кто-нибудь перечислить 2 программы (program1 и program2) вместе с рабочим файлом application.conf, который делает это и ничего больше?
edit> позвольте мне показать вам, что я получил до сих пор:
актер
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)
}
}
Программа1:
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"
}
}
}
}
Тем не менее, эта программа работает, когда я запускаю только Program2 и выводит:
Hello Felix
[INFO] [02/18/2013 12:27:29.999] [MySystem-akka.actor.default-dispatcher-2] [akka://MySystem/user/greeter] Hello Felix
Кажется, что это не подхватывает мой application.conf. Я попытался поместить его в папку./src/ и./ моего проекта eclipse. Нет разницы. Кроме того, я знаю, что это действительно демо-развертывание, но мне нужна просто программа hello world для работы с использованием AKKA. Я потратил столько времени на это, не получив простого рабочего приложения.
4 ответа
Как упоминалось в korefn, удаленная документация подробно объясняет его работу. Это также ссылки на пример приложения. Этот пример должен дать вам все необходимое для начала.
редактировать
Чтобы запустить пример приложения, выполните следующие действия:
Клон из GitHub
eecolor@BLACK:~/GihHub$ git clone https://github.com/akka/akka.git
Войдите в akka
каталог и запустить sbt
eecolor@BLACK:~/GihHub/akka$ sbt
Переключиться на akka-sample-project
akka > project akka-sample-remote
Вызов run
на проекте и выберите 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
Переключитесь на другую консоль и повторите первые несколько шагов
eecolor@BLACK:~/GihHub/akka$ sbt
akka > project akka-sample-remote
Вызов run
и выберите 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
Переключитесь обратно на другую консоль, и вы должны увидеть что-то вроде этого:
Calculating 14 - 16
Calculating 13 - 22
Calculating 56 + 93
Calculating 18 + 19
Обновление для Akka 2.2.3
Минимальное удаленное приложение может быть создано следующим образом:
Создайте 2 проекта в Eclipse: клиент и сервер
Сервер:
Код для сервера
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")
}
Applincation.conf для сервера
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
}
}
Клиент:
Код клиента
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://GreetingSystem@127.0.0.1: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")
}
Клиентский application.conf - это:
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
}
}
}
Конфигурации должны быть помещены в два файла с именем application.conf, оба в каталоге bin двух проектов.
Ну, в вашем примере, код клиента никогда не ссылается на файл конфигурации, и он не будет работать.
Акка по умолчанию будет использовать файл application.conf, поэтому его не нужно явно выбирать.
если кто-то хочет, то код будет (принимая код выше в качестве примера):
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")