首页 文章

如何在OSGi包中使用Akka实现真正的应用程序模块化?

提问于
浏览
3

使用Akka actor时,创建的每个actor都会在ActorRegistry中注册 . ActorRegistry是一个单身人士,允许所有演员轻松查找和管理(开始,停止......) .

但是,在OSGi环境中,可以在内部使用Akka actor安装许多应用程序包(并且Akka作为包本身安装) . 应用程序包的某些参与者应该可用于其他捆绑包,因此可以充当导出的服务 . 其他人严格来说是内部的 . 然而,ActorRegistry包含所有bundle的所有actor(因为它是一个单独的),所以导出的和内部的都是 . 这意味着即使是捆绑内部使用的actor也可用于任何其他捆绑包 .

但是我希望能够更好地控制哪些参与者在捆绑范围之外可用 . 理想情况下,每个bundle都有自己的ActorRegistry,并决定将哪个actor作为OSGi服务发布 .

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

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

1 回答

  • 1

    根据我的记忆, ActorRegistry 是早期版本的Akka中的单身人士,而且从我现在的代码中可以看到,it no longer is . 现在 ActorRegistry 是一个final类,为Actor伴侣对象创建了一个实例:

    object Actor extends Logging {
       ...
       val registry = new ActorRegistry
       ...
    }
    
    class LocalActorRef { 
      ...
      def initializeActorInstance = {
         ...
         Actor.registry.register(this)
         ...
      }
      ...
      def stop = {
         ...
         Actor.remote.unregister(this)
         ...
      }
      ...
    }
    

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

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

相关问题