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>
是告诉我们和编译器尽可能少的信息的类型)。
我正在尝试学习 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>
是告诉我们和编译器尽可能少的信息的类型)。