2012-05-11 17 views
5

Nếu tôi tạo một diễn viên bằng cách sử dụng context(). ActorOf() trong Akka, tôi lấy lại ActorRef hợp lệ. Tuy nhiên, nếu tôi làm như vậy nhưng tạo ra một ActorRef sử dụng actorFor và đường dẫn tôi biết rằng diễn viên sẽ xuất hiện tại, tôi không đáng tin cậy có được một ActorRef hợp lệ trở lại. Làm thế nào tôi có thể nói rằng một diễn viên đã được đăng ký thành công?Ở Akka, làm cách nào để biết khi nào diễn viên sẵn sàng sử dụng sau khi đã được đăng ký với actorOf()?

Trong mô tả ở trên, tôi chỉ có thể sử dụng ActorRef được trả về từ actorOf(). Tuy nhiên, trong trường hợp thực tế của tôi, tôi tạo một diễn viên tự đăng ký một diễn viên con và tôi cần phải giải quyết vấn đề đó, vì vậy vấn đề nói chung là "làm thế nào tôi có thể đợi/đăng ký được thông báo về một diễn viên đã được đăng ký tại một đường dẫn đã biết? ".

Trả lời

1

Trước hết, không đảm bảo rằng ActorRef bạn lấy lại từ actorOf vẫn còn hoạt động, vì hàm tạo của nó có thể bị lỗi.

Thứ hai, nam diễn viênĐể tìm diễn viên nhưng nó đã chết ngay sau khi được tìm thấy và ngay trước khi bạn bắt đầu làm việc với nó. Thứ ba, thực hành tốt là tốt để cấu trúc ứng dụng của bạn để các phụ thuộc được truyền bá một cách hợp lý, để có điểm hẹn tự nhiên giữa các diễn viên của bạn.

Hy vọng bất kỳ điều nào ở trên đều hữu ích,

happy hAkking!

+1

Đồng ý về hai điểm đầu tiên, diễn viên có thể không bao giờ ở đó và có thể đã biến mất trước khi bạn có cơ hội sử dụng. Ngày đầu tiên, tôi đoán rằng những gì tôi thực sự tìm kiếm là làm thế nào để đúng cách bootstrap một hệ thống dựa trên diễn viên. Tôi có nên yêu cầu() một diễn viên đại diện cho một hệ thống phụ bằng cách sử dụng một thông báo Bắt đầu để đảm bảo rằng nó và các hệ thống con của nó lần lượt sẵn sàng chưa? – SoftMemes

+0

Tạo hệ thống của bạn làm biểu đồ của Diễn viên. Sau đó, bạn có thể sử dụng kết hợp DeathWatch và eventStream của hệ thống để xuất bản còn sống/chết. Nó sẽ là thú vị để có một LifeWatch là tốt. Nhưng rủi ro là nó sẽ rò rỉ bộ nhớ nếu các diễn viên không bao giờ trở nên sống động. –

+0

khi sử dụng akka.testkit, bạn gửi một tin nhắn đến diễn viên được tạo ngay lập tức .. bạn cần một cách để biết nó đã sẵn sàng .. – KitAndKat

7

Kể từ Akka 2.2.1 bạn có thể sử dụng ActorSelection.resolveOne để có được một ActorRef từ một lựa chọn diễn viên:

implicit val timeout = Timeout(5, TimeUnit.SECONDS) 
val selection = system.actorSelection("/user/myActor") 
val actor = Await.result(selection.resolveOne(), timeout.duration) 

Từ các tài liệu http://doc.akka.io/api/akka/2.2.1/index.html#akka.actor.ActorSelection

Giải quyết các khớp ActorRef lựa chọn này. Kết quả được trả về là một Tương lai được hoàn thành với ActorRef nếu có một diễn viên tồn tại. Nó được hoàn thành với thất bại ActorNotFound nếu không có diễn viên như vậy tồn tại hoặc việc xác định đã không hoàn thành trong thời gian chờ cung cấp .

Dưới mui xe, nó nói chuyện với diễn viên để xác minh sự tồn tại của nó và có được ActorRef.

Các vấn đề liên quan