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

Akka路由:发送到路由器的回复以死信告终

沈嘉瑞
2023-03-14
sender.tell([Message], context.parent)

主要的类别是:

object Starbucks extends App {
  implicit val system = ActorSystem.create("StarBucks")

  val employees = List(
    system.actorOf(Props[Employee], "Penny"),
    system.actorOf(Props[Employee], "Leonard"),
    system.actorOf(Props[Employee], "Sheldon")
  )

  val customers = List(
    ("Raj", "Tall Latte Machiato"),
    ("Howard", "Double Tall Cappuccino"),
    ("Bernadette", "Grande Spicy Pumpkin Latte"),
    ("Amy", "Dopio Espresso")
  )

  val starBucks = system.actorOf(
        Props.empty.withRouter(SmallestMailboxRouter(routees=employees)))

  customers foreach { request =>
    println("Customer %s orders a %s".format(request._1, request._2))
    starBucks ! CanIHave(request._1, request._2)
  }
}

路由的执行元类为:

class Employee extends Actor {
  def receive = {
    case CanIHave(coffee, name) => {
      println("Employee %s writes '%s' and '%s' on a cup".format(self.path.name, coffee, name) )
      sender.tell(MakeCoffee(coffee, name), context.parent)
    }
    case MakeCoffee(coffee, name) => {
      println("Employee %s makes a %s for %s ".format(self.path.name, coffee, name) )
      sender.tell(CoffeeReady(coffee, name), context.parent)
    }
    case CoffeeReady(coffee, name) => {
      println("Employee %s shouts: %s for %s is ready!".format(self.path, name, coffee, name))
    }
  }
}

共有1个答案

林鸿彩
2023-03-14

您的问题是,您的路由不是由路由器本身创建的,而是由Akka系统创建的:

system.actorOf(Props[Employee], "Penny")

因此,员工级别的context.parent将返回Akka系统,该系统将您的消息重定向到死信邮箱。

编辑:根据文档,请参阅路由器、路由和发件人一节,其中明确说明

Note that different code would be needed if the routees were 
not children of the router, i.e. if they were provided when the router was created.
 类似资料:
  • 如何从Akka HTTP路由向Akka Sink发送元素/消息?我的HTTP路由仍然需要返回正常的HTTP响应。 我想这需要一个支流/枢纽。正常的HTTP路由是来自HttpRequest的流- 下面是一个非常简单的单路由akka http应用程序。为了简单起见,我使用了一个简单的println水槽。我的生产用例显然将涉及一个不那么琐碎的水槽。 编辑:或者在使用低级akka http API时,如何

  • 对于路由器的重要性,我的脑海中一直存在着这样的疑问。我在当前的项目中使用了Akka路由器。但是,我对它的重要性有点困惑。出了下面两种方法,哪一种更有好处。 具有路由器和路由。 根据需要创建尽可能多的演员。 所以我想了解一下上面的设计哪一个更好呢?或者换句话说,在这种情况下(1)比(2)有优势,反之亦然。

  • 在阅读了Akka的文档和网上的一些帖子之后,我仍然对路由器和调度器之间的关系没有一个清楚的认识。 1)路由器是否总是使用dispatcher向路由进行调度?路由器是否可以不使用dispatcher完成其工作? 2)如果配置中没有定义额外的调度器,我的理解是将使用默认调度器。在我的actor系统中,我有一个集群,其中有两个生产者actor使用路由器actor和三个消费者actor。生产者和消费者都运

  • 考虑以下事项: 我有一个应用模板,一个HeaderTemboard,和参数化的路由集与相同的处理程序(在应用模板)。我希望在没有找到东西的时候能够服务404路线。例如, /CA/SanFrancisco应该由区域查找和处理,而 /SanFranciscoz应该是404。 下面是我如何快速测试路线的。 问题是 /SanFranciscoz总是由区域页面处理,但我希望它是404。此外,如果我向第一个路

  • 有人能解释一下(如果可能的话,用一些代码或参考)独立路由器和自包含的路由器参与者之间有什么区别吗? 提前谢谢你。 编辑: 与此相比有何不同?: 在性能或能力方面有什么区别吗?