阿卡2.1最小远程角色示例(Akka 2.1 minimal remote actor exampl

2019-07-20 02:50发布

编辑请注意,我需要做的这种反向变化https://github.com/akka/akka/commit/ce014ece3568938b2036c4ccfd21b92faba69607#L13L6 ,以与AKKA 2.1接受的答案工作,这是akkas主页找到稳定的销售!


我已阅读所有的教程我能找到AKKA,但没有我发现作品“开盒即用”。

使用Eclipse,我要创建2个项目。

PROGRAM1:启动演员“乔”,不知何故使得它可在127.0.0.1:some_port

程序2:在得到一个127.0.0.1:some_port参考男主角“乔”。 发送Hello消息,“乔”。

收到消息时,计划1应打印的东西。 我想运行使用AKKA 2.1月食这个例子。 可有人表2周的方案,(程序1和程序2)一起工作application.conf文件,这是否和没有别的?


编辑>让我告诉你,我有这么远:

演员

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

}

程序2

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。 我试图把它无论是在我的Eclipse项目的./src/和./文件夹。 没有不同。 另外,我知道这是真的降级的部署,但我需要只是一个Hello World程序使用AKKA工作。 我花了这这么多时间没有得到一个简单的工作程序。

Answer 1:

作为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


Answer 2:

更新阿卡2.2.3

一个最小的远程应用程序可以创建如下:

在Eclipse中创建2个项目:客户端和服务器

服务器:

服务器的代码

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目录中。



Answer 3:

那么,在你的例子,客户端代码永远不会引用配置文件,它不会工作。



Answer 4:

阿卡默认情况下将使用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")


文章来源: Akka 2.1 minimal remote actor example