他のアクターのサービス層アクターによって一般的に使用されるものがあるとしましょう。たとえば、ドメイン オブジェクトを格納および取得するレジストリ サービスは次のとおりです。
case class DomainObject(id: UUID)
class Registry extends akka.actor.Actor {
def receive: Receive = {
case o: DomainObject => store(o) // save or update object
case id: UUID => sender ! retrieve(id) // retrieve object and send it back
}
}
そのようなレジストリのインスタンスを、それを使用する可能性のあるすべてのアクターに明示的に渡したくありません。その代わりに、どういうわけかそれを「見つける」ことができるようにしてほしい.
このために、私は2つの解決策を考えることができます:
Identify
メッセージ: 各レジストリ ユーザー アクターは、何らかの構成からレジストリ アクター名を認識しており、識別メッセージを送信できます。AgentIdentity
メッセージが返されたら、次の手順に進みます。val registryName = ... // some name val registryId = ... // some id var registry = _ def preStart() { context.actorSelection(registryName) ! Identify(registryId) } def receive: Receive = { case ActorIdentity(`registryId`, ref) => registry = ref }
ユーザー アクターの初期化の直後に、システムなどにレジストリがあるかどうかがわからず、操作できるかどうかがわからないフェーズがあるため、この方法は好きではありません。
Akka 拡張機能: 次のような拡張機能を作成できます。
を。初期化時に指定されたアクター システムにレジストリ アクターのインスタンスを作成します。
b. エクステンションの何らかのメソッドを介して、このアクターを必要とするユーザーに返します。
object RegistryKey extends ExtensionKey[RegistryExtension] class RegistryExtesion(system: ExtendedActorSystem) extends RegistryKey { val registry = system.actorOf(Props[Registry], "registry") }
問題は、どちらの方法が優れているか、そして Akka Extesions をこれに使用できるかどうかです。