关于java:Akka actors和aroundReceive()方法

Akka actors and aroundReceive() method

我正在尝试学习Akka(使用Java)并理解一些代码。我已经在Actor类中看到了类似这样的方法签名:

1
2
@Override
public void aroundReceive(PartialFunction<Object, BoxedUnit> receive, Object msg)

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


PartialFunction<Object, BoxedUnit>一样,(未类型化的)actor中的receive函数就是该实例的一个实例(在Scala API中已经清楚地表明了这一点,而在Java API中则不太明显)。

执行此操作的Actor(通常通过Scala mixin或扩展覆盖它的抽象类)将采用程序员实现的actor的receive函数并拦截对某些消息(例如定时消息)的调用或执行pre -/对传递到给定的receive

上的消息进行后处理

PartialFunction<Object, BoxedUnit>基本上是指:

  • 这个函数不能保证任何特定的输入都有结果;调用者有责任事先检查(isDefinedAt)该函数是否有结果,或者接受该函数将引发异常。 (PartialFunction:未在其整个域中定义的函数)
  • Object(或用Scala术语Any(从技术上讲是AnyRef,但是自动装箱让我们暂时忘记了)):该函数理论上可以接受任何内容
  • BoxedUnit表示该函数没有返回有用的结果(Scala中的Unit类似于Java中的void,但实际上是一个对象(准确地说是一个单例))。

(某种程度上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

此方法的一个目的是使用自定义行为packagereceive方法。您可以在"计时器"特征中看到一个示例。