Giả sử tôi có một số diễn viên lớp dịch vụ diễn viên khác thường được sử dụng. Ví dụ, một dịch vụ đăng ký lưu trữ và lấy đối tượng miền:Akka - Diễn viên dịch vụ thông thường: Xác định hoặc gia hạn
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
}
}
Tôi không muốn để vượt qua một cách rõ ràng thể hiện của registry như vào tất cả các diễn viên có thể sử dụng nó. Thay vì nó, tôi muốn họ có thể bằng cách nào đó 'xác định' nó.
Đối với điều này tôi có thể nghĩ ra hai giải pháp:
Identify
thông điệp: mỗi diễn viên sử dụng registry biết tên diễn viên đăng ký từ một số cấu hình và có khả năng gửi tin nhắn xác định với nó. SauAgentIdentity
thông điệp được nhận lại chúng ta là tốt để đi: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 }
tôi không thích cách này bởi vì ngay sau khi sử dụng diễn viên khởi động có một giai đoạn khi chúng ta không biết nếu có một đăng ký trong hệ thống et tất cả và do đó không biết chúng ta sẽ có thể hoạt động hay không.
Tiện ích mở rộng Akka: Tôi có thể tạo tiện ích mở rộng:
a. tạo thể hiện của tác nhân Đăng ký trong Hệ thống diễn viên được bật khi khởi tạo;
b. trả về tác nhân này cho người dùng cần nó thông qua một số phương pháp trong phần mở rộng.
object RegistryKey extends ExtensionKey[RegistryExtension] class RegistryExtesion(system: ExtendedActorSystem) extends RegistryKey { val registry = system.actorOf(Props[Registry], "registry") }
Câu hỏi đặt ra là: phương pháp nào là tốt hơn và được Akka Extesions thể được sử dụng cho điều này ở tất cả?
Tôi nghĩ bạn có nghĩa là 'context.actorSelection (registryName)! Xác định (registryId) '. 'actorFor' là một giải pháp khác mặc dù nó không được chấp nhận trong 2.2. – sourcedelica
Vâng, bạn hoàn toàn chính xác. Rò rỉ bộ nhớ. :) – Seigert