Akka 演员和 aroundReceive() 方法

Akka actors and aroundReceive() method

我正在尝试学习 Akka(使用 Java)并理解一些代码。我在 Actor class :

中看到过这样的方法签名
@Override
public void aroundReceive(PartialFunction<Object, BoxedUnit> receive, Object msg)

我以前从未听说过这种方法,也不理解。该方法的目的是什么?这个 PartialFunction<Object, BoxedUnit> 收到的参数来自哪里?我认为由程序员来实现接收对象。

首先,我在 Scala 中使用 Akka,而不是在 Java 中。我希望这个答案能给你一个线索。 在 Scala 中,这个方法是 @InternalApi。 Scala 中的文档是:

Marks APIs that are considered internal to Akka and may change at any point in time without any warning. For example, this annotation should be used when the Scala {@code private[akka]} access restriction is used, as Java has no way of representing this package restricted access and such methods and classes are represented as {@code public} in byte-code

此方法的一个目的是用自定义行为包装接收方法。您可以在 Timers 特征中看到一个示例。

至于 PartialFunction<Object, BoxedUnit>,(未类型化的)actor 中的 receive 函数就是它的一个实例(这在 Scala API 中非常清楚,并且稍微少一点-所以在 Java API).

实现此功能的 Actor(通常通过 Scala 混合或扩展覆盖它的抽象 class)将从程序员实现的 actor 中获取 receive 函数并拦截对某些消息的调用(例如定时消息)或执行 pre-/post-processing 传递给给定 receive.

的消息

PartialFunction<Object, BoxedUnit> 基本上意味着:

  • 这是一个不承诺对任何特定输入产生结果的函数;调用者有责任事先检查 (isDefinedAt) 函数是否会有结果或接受函数将抛出异常。 (PartialFunction: 一个没有在其整个域上定义的函数)
  • Object(或者用 Scala 术语 Any(技术上 AnyRef,但自动装箱让我们暂时忘记这一点)):该函数理论上可以接受任何东西
  • BoxedUnit表示函数returns没有有用的结果(Scala中的Unit就像Java中的void,但实际上是一个对象(准确地说是单身))。

(在某种程度上,PartialFunction<Object, BoxedUnit> 是告诉我们和编译器尽可能少的信息的类型)。