【问题标题】:Dead Letters using Akka to create a message ringDead Letters 使用 Akka 创建消息环
【发布时间】:2017-10-02 18:29:29
【问题描述】:

我正在尝试使用远程参与者创建一个示例 Akka 应用程序。例如,目标是创建 16 个以顺序方式交换消息的参与者(参与者 16 与参与者 15、15 到 14 等对话,1 与参与者 16 对话)。但是,我在通信方面遇到了问题,因为我一直有这个错误。

[信息] [05/04/2017 15:45:58.248] [ActorFlasks-akka.actor.default-dispatcher-4] [akka://ActorFlasks/deadLetters] 消息 [java.lang.String] 来自 演员[akka://ActorFlasks/user/16#-2022012132] 到 演员[akka://ActorFlasks/deadLetters] 未交付。 [1] 死了 遇到的字母。

为此,我运行了 16 个应用程序的终端实例,始终使用不同的配置文件。我在每个实例中创建actorsystem,如下所示:

object Main extends App {

    val localId = args(0)

    val configFile = getClass.getClassLoader.getResource(s"application$localId.conf").getFile
    val config = ConfigFactory.parseFile(new File(configFile))
    val system = ActorSystem("ActorFlasks" , config)
    val remote = system.actorOf(Props[CyclonManager], name=localId)

    remote ! "START"
}

一个配置文件的例子是这样的:

akka {
  actor {
    provider = remote
  }
  remote {
    enabled-transports = ["akka.remote.netty.tcp"]
    netty.tcp {
      hostname = "localhost"
      port = 50001
    }
 }
}

演员是这样定义的:

class CyclonManager extends Actor {

  def propagateMessage(): Unit = {
    val localId = self.path.name.toInt
    val currentPort = 50000 + localId
    val nextHopPort = if (currentPort == 50001) 50016 else currentPort - 1
    val nextHopId = localId-1

    val nextHopRef = context.actorSelection(s"akka.tcp://ActorFlasks@localhost:$nextHopPort/user/$nextHopId")

    nextHopRef ! "NEXT"
  }

  override def receive: Receive = {
    case "START" =>
      if (self.path.name == "16") {
        propagateMessage()
      }
    case "NEXT" =>
      propagateMessage()
    case _ =>
      println("Unrecognized message")
  }
}

这是一个让我开始的简单示例,但无论我尝试什么都无法让它工作。有人知道我哪里失败了吗?

提前谢谢你,

编辑:

akka {
  actor {
    provider = "akka.remote.RemoteActorRefProvider"
  }
  remote {
    enabled-transports = ["akka.remote.netty.tcp"]
    netty.tcp {
      hostname = "localhost"
      port = 50015
    }
 }
}

【问题讨论】:

  • 你确定演员 #15 存在于端口 50015 上吗?
  • 除非我对如何创建演员和演员系统有错误的理解,否则我确定。

标签: scala akka actor dead-letter


【解决方案1】:

在重构并运行您的示例后,我在propagateMessage 函数中发现了一个错误。

val nextHopId = localId-1

应该是

val nextHopId = if (currentPort == 50001) 16 else localId-1

如果它不能解决您的问题,请尝试运行我快速而肮脏但有效的代码,看看它与您的有何不同:https://gist.github.com/grantzvolsky/4a53ce78610038a9d44788d7151dc416

在我的代码中,我只使用了演员 14、15 和 16。您可以使用 sbt "run 16" 等来运行每个演员。

【讨论】:

  • 是的,我在提交问题后才看到这个错误,但修复它并没有帮助。我将代码更改为您的代码,但仍然无法正常工作...问题可能出在我的本地主机配置上吗?或者使用我正在使用的 akka 版本(2.5.0)
  • 我确实添加了 akka-remote 依赖项,它位于我的 build.sbt 的最后一行。从理论上讲,您的防火墙可能会阻止通信,但这似乎不太可能。你会提供所有三个节点的完整输出吗?这是我的:(注意我先启动节点 14,然后是 15,然后是 16):imgur.com/a/l53pV
  • 嗨!我试过你的代码和配置。节点 14 和 15 具有正常输出。但是,节点 16 给了我以下信息:imgur.com/a/tZi6T
  • 我尝试使用 Akka 2.5.0,它仍然有效。你在 Windows 上吗?尝试禁用防火墙/防病毒。有东西阻塞了连接。
  • 另外,你的application15.conf的内容是什么?
猜你喜欢
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 2016-10-08
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多