Scala 使用Akka创建消息环的死信

Scala 使用Akka创建消息环的死信,scala,akka,actor,dead-letter,Scala,Akka,Actor,Dead Letter,我正在尝试使用远程参与者创建一个示例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://Act

我正在尝试使用远程参与者创建一个示例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")
  }
}
这是一个简单的例子,让我开始,但我不能让它工作,无论我尝试什么。有人知道我在哪里失败了吗

提前谢谢大家,

编辑:


在重新构建并运行您的示例后,我在传播消息函数中发现了一个错误

val nextHopId = localId-1
应该是

val nextHopId = if (currentPort == 50001) 16 else localId-1
如果它不能解决您的问题,请尝试运行我的快速、肮脏但有效的代码,看看它与您的代码有何不同:


在我的代码中,我只使用了参与者14、15和16。您可以使用
sbt“run 16”
等运行每一个操作。

您确定端口50015上存在actor#15吗?除非我对如何创建actor和actor系统有错误的理解,是的,我确定。是的,我在提交问题后才看到这个错误,但修复它没有帮助。我把我的代码改成了你的,但还是不起作用。。。可能是我的本地主机配置有问题吗?或者在我使用的akka版本(2.5.0)中,我添加了
akka remote
依赖项,它位于build.sbt的最后一行。理论上,防火墙可能会阻止通信,但这似乎不太可能。您能提供所有三个节点的完整输出吗?这是我的:(注意,我首先启动节点14,然后是节点15,然后是节点16):嗨!我试过你的代码和配置。节点14和15具有正常输出。然而,节点16给了我以下信息:我尝试使用Akka 2.5.0,但它仍然有效。你在Windows上吗?尝试禁用防火墙/防病毒软件。连接被阻塞。另外,application15.conf的内容是什么?
val nextHopId = if (currentPort == 50001) 16 else localId-1