3

Akka アクターを使用すると、作成されたすべてのアクターが ActorRegistry に登録されます。ActorRegistry はシングルトンであり、すべてのアクターの簡単な検索と管理 (開始、停止など) を可能にします。

ただし、OSGi 環境では、多数のアプリケーション バンドルをそれぞれ Akka アクターを内部的に使用してインストールできます (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コンパニオン オブジェクト用にインスタンスが作成された最終クラスです。

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

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

したがって、明らかにレジストリの複数のインスタンスを作成できます。

第二に、ご存知のように、アクターはActorRegistryat start/stopメソッドで自分自身を登録/登録解除します。したがって、あなたの場合、サブクラス化/ミキシングActor/ LocalActorRef(オーバーロードstart/stop登録の責任を負い、探している機能をここに追加します) および/または独自の を追加しますActorRegistry

于 2011-02-08T08:48:14.707 に答える