3

当使用 Akka Actor 时,创建的每个 Actor 都会在 ActorRegistry 中注册。ActorRegistry 是一个单例,允许轻松查找和管理所有参与者(启动、停止...)。

然而,在 OSGi 环境中,可以在内部使用 Akka Actor 安装多个应用程序包(并且 Akka 本身作为包安装)。应用程序包的一些参与者应该对其他包可用,并作为导出的服务。其他的则严格在捆绑包内部。然而,ActorRegistry 包含所有捆绑包的所有参与者(因为它是单例),因此包括导出的和内部的。这意味着即使是捆绑包内部使用的演员也可用于任何其他捆绑包。

但我想更好地控制哪些演员在捆绑范围之外可用。理想情况下,每个包都有自己的 ActorRegistry,并决定它的哪些演员作为 OSGi 服务发布。

那么,在 OSGi 环境中将 Akka 用于模块化应用程序以实现真正的模块化的最佳方式是什么?

(关于这个的背景http://blog.xume.com/2011/02/actorregistry-scope-using-akka-in-osgi.html

4

1 回答 1

1

据我回忆,ActorRegistry在早期版本的 Akka 中是一个单例,而且,从我现在在代码中看到的,它不再是. 现在ActorRegistry是一个最终类,为 Actor 伴生对象创建了一个实例:

object Actor extends Logging {
   ...
   val registry = new ActorRegistry
   ...
}

class LocalActorRef { 
  ...
  def initializeActorInstance = {
     ...
     Actor.registry.register(this)
     ...
  }
  ...
  def stop = {
     ...
     Actor.remote.unregister(this)
     ...
  }
  ...
}

因此,您显然可以创建注册表的多个实例。

ActorRegistry其次,如您所知,演员在at start/方法中注册/注销自己stop,因此,在您的情况下,我将以子类化/混合Actor/ LocalActorRef(重载start/stop负责注册,并在此处添加您正在寻找的功能)和/或添加您自己的ActorRegistry.

于 2011-02-08T08:48:14.707 回答