他の俳優のサービス層の俳優によって一般的に使用されているものがあるとします。たとえば、ドメインオブジェクト取り出し店や、レジストリサービス:Akka - コモン・サービスの俳優:識別または拡張
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 }
右のユーザ俳優初期化した後、システム等でレジストリは、すべてがあれば、我々が知らない段階がありますので、私はこの方法を好きではないし、したがって、私たちは今までに動作するかどうかわからない。
アッカ拡張機能:
:私は希望拡張機能を作成することができます。初期化時に、指定されたActor Systemでレジストリアクタのインスタンスを作成します。
b。 Extensionの何らかの方法でこのアクタを必要とするユーザに返します。
object RegistryKey extends ExtensionKey[RegistryExtension] class RegistryExtesion(system: ExtendedActorSystem) extends RegistryKey { val registry = system.actorOf(Props[Registry], "registry") }
質問は:どの方法が優れているとアッカExtesionsがすべてで、このために使用することができていますか?
私はあなたが 'context.actorSelection(registryName)を意味だと思います! (registryId)を識別する '。 'actorFor'は2.2で廃止されましたが、別の解決策です。 – sourcedelica
ええ、あなたは絶対に正しいです。メモリリーク。 :) – Seigert