当前位置: 首页 > 知识库问答 >
问题:

Akka 2.1最小远程演员示例

吴高远
2023-03-14

编辑通知,我需要对此进行反向更改https://github.com/akka/akka/commit/ce014ece3568938b2036c4ccfd21b92faba69607#L13L6让公认的答案与AKKA2.1一起工作,AKKA2.1是akkas主页上的稳定发行版!

我已经阅读了所有的教程,我可以找到AKKA,但没有我发现的作品"开箱即用"。

使用eclipse,我想创建两个程序。

程序1:启动演员“乔”,并以某种方式使其在127.0上可用。0.1:某些端口

程序2:在127.0.0.1:some_port获得对演员“乔”的引用。向“乔”发送问候信息。

当收到信息时,程序1应打印一些内容。我想使用AKKA 2.1在eclipse中运行这个示例。有人能列出2个程序(程序1和程序2)和一个工作应用程序吗。执行此操作而不执行其他操作的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)
  }
}

方案1:

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

应用形态

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

但是,当我只启动程序2时,这个程序可以工作,它输出:

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

看来它没有收到我的申请。我试着把这两个都放在地图上/src/和./我的eclipse项目的文件夹。没有区别。另外,我知道这确实是降级部署,但我只需要一个hello world程序就可以使用AKKA工作。我花了这么多时间在这上面,却没有得到一个简单的工作应用程序。

共有3个答案

吴弘壮
2023-03-14

在您的示例中,客户机代码从未引用配置文件,因此无法正常工作。

公西天逸
2023-03-14

正如韩国广播公司提到的,远程留档详细解释了它的工作原理。它还链接到一个示例应用程序。这个例子应该给你开始需要的一切。

要使示例应用程序运行,请执行以下步骤:

从GitHub克隆

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

进入akka目录并运行sbt

eecolor@BLACK:~/GihHub/akka$ sbt

切换到akka-samle-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
邵祺
2023-03-14

更新Akka 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")
}

应用程序。服务器的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")
}

客户端应用程序。配置文件是:

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

 类似资料:
  • 我正在运行Akka2.0.2微内核,希望为不受信任的远程参与者实现一个身份验证方案。 首先想到的是设置一个身份验证执行元,该执行元在身份验证成功时返回对工作执行元的引用。 也就是说,我要阻止远程参与者在没有身份验证的情况下访问我的微内核参与者系统中的参与者。 在actorOf()中不给工作执行元一个名字是不够的,因为它会得到一个容易猜测的自动生成的名字。有没有一种方法可以禁用Actor的远程查找,

  • 得到2张桌子 表1-执行元:ACTOR_ID、FIRST_NAME、LAST_NAME、LAST_UPDATE 表2-FILM_ACTOR:ACTOR_ID、FILM_ID、LAST_UPDATE 我已经尝试了以下关于寻找谁曾在最多的电影中扮演

  • 我从这里得到上面的错误消息: 特别是从第二行。。进口是 akka版本是2.2.1,scala是2.10.2,我正在使用sbt 0.13来构建它。 编辑:我用 结果如下:

  • 我已经有了两个查询 选择每个演员n次(n=在电影中出现)。我的查询:选择actor.first_name,actor.last_name FROM actor.INNER连接actor.actor_id=film_actor.actor_id; 结果: 结果:演员1出演了19部电影。 但我要的是:出演电影最多的演员: 任何帮助都是非常感谢的。谢谢你!

  • 环境配置(仅限演示) 你需要一个包含 OpenSSH 的 Linux 操作系统(例如 Ubuntu): ❯ docker run --name yubico-ubuntu -p 2222:22 -it ubuntu 在 Docker 容器内: ❯ apt-get update ❯ apt-get install -y openssh-server vim ❯ mkdir -p /root/.ssh

  • 我经常发现自己使用一个“主”角色,为子任务创建许多子角色。当子任务完成时,主角也应该停止自己。所以当时,我观察子角色并停止主角色context.children.is。 我经常使用这种模式,但因为我从未读过这方面的文章。我不确定,这是一个好主意还是失败的演员有问题。。。? 我已经读过Akka 2中的关机模式,但是这种方法在Java中似乎比我的解决方案更复杂? 以下是我针对具有两个子任务的主要参与者

  • uView 会将各个版本的演示在此展示,目前演示的版本有H5,安卓,微信小程序,其他版本的演示将会陆续添加。 使用方法 H5版本可以用微信或者手机浏览器扫描二维码即可 微信小程序只能通过微信扫码查看 安卓版本只能在安卓使用,可以用安卓浏览器或者QQ扫码进行安装(微信中不能扫码安装),安装过程中您可能需要勾选相应的提示,允许安装来自非应用市场的APP,或者您需要在设置中打开 允许安装来自未知来源的应

  • 我很想知道调整大小,或者在本例中增加单个节点系统上的actor池中actor的数量是否真的会影响性能。 我有一个带超线程的四核系统。在任何给定的点上,系统可以运行8个线程。假设执行元执行的大多数操作都是CPU绑定的,那么将池中的执行元数量从20个增加到40个会有什么收获呢?