Akka:UnboundedPriorityMailbox - 是否可以按复杂类型对消息进行优先级排序?

Akka : UnboundedPriorityMailbox - Is it possible to prioritize messages by complicated type?

UnboundedPriorityMailbox 可以选择按类型(如 int 字符串等)对邮件进行优先级排序。是否可以按 class 属性 的类型对消息进行优先级排序?

我的意思是,我知道该选项可用:

case x: Int => 1
// String Messages
case x: String => 0
// Long messages
case x: Long => 2
// other messages
case _ => 3

消息的顺序(优先级)为:

myPriorityActor ! “Hello”
myPriorityActor ! “I am priority actor”
myPriorityActor ! “I process string messages first,then integer, long and others”
myPriorityActor ! 5
myPriorityActor ! 3
myPriorityActor ! 1
myPriorityActor ! 6.0
myPriorityActor ! 5.0

Link 例如: https://medium.com/knoldus/how-to-create-a-priority-based-mailbox-for-an-akka-actor-232b488e33d4

我想知道是否可以按 Class 属性.

的类型对队列进行优先排序

例如:

case x: Student.name=> 1
// String Messages
case x: Student.salary=> 0
// Long messages
case x: Student.School=> 2

这样的事情可能吗?

从根本上讲,这与Akka无关。您所做的只是返回一个部分函数,​​该函数具有接受 Any 并返回 Int 的接口。是的,在幕后,该函数将用于确定消息的优先级,但从 Akka 的角度来看,它对您的函数一无所知。邮箱只是调用您提供的函数来确定它收到的每条消息的相对优先级。

关键是这实际上是一个 Scala 问题,你最好只用一个 Scala 标签来问你的问题:你想写一个部分函数函数,它查看“class 属性" 和 returns 一个整数。

我认为你的问题的答案是否定的,但我不能 100% 确定我理解你的问题。我认为答案的关键是理解我刚才所说的:这里没有魔法。您只是提供一个 partial function 接受 Any 和 returns 一个 Int (或不适用)。 Scala 模式匹配正在对类型进行一些自动检测和类型转换,但您可以通过自己在 if 语句中执行一堆 .getClass 调用来执行相同的操作(在更多代码行中)。

所以您唯一需要回答的真正问题是“我可以写一个执行此操作的 if 语句吗?”

因此,如果我的函数接收到“Thomas Jefferson”的输入,您能否编写 if 语句将其转换为与其消息优先级相对应的 Int 值。本能地,我认为你做不到。因为我希望 Student.name 和 Student.School 都是 String 类型,你很难区分它们。因此,我无法编写可以区分“Thomas Jefferson”这个人和“Thomas Jefferson”学校的 if 语句。但是,另一方面,这完全取决于您如何定义类型。也许您已经为学校学习了 Stringclass。在这种情况下,您可以查看类型并区分它们。

但是,底线是,这只是一个将 Anys 转换为 Ints 的函数。如果您可以编写执行此操作的函数,Akka 将利用该函数来确定消息的优先级。

虽然我也断言这个问题在现实世界中有点没有实际意义。优先邮箱在现实世界的应用程序中非常罕见,如果你有它们,你可能不会发送简单类型。大多数消息可能是某种信封,不会是简单的类型。您可以通过信封轻松区分“HighPriorityCancel”消息和“GetGrade”消息。