2016-02-11 17 views
5

Nếu tôi tạo một diễn viên khai thác gỗ như vậyActorRef có được cập nhật khi Diễn viên liên quan được khởi động lại bởi người giám sát không?

val logger: ActorRef = 
    actorSystem.actorOf(Props(new Logger())) 

và khởi động lại logger do một ngoại lệ, logger tôi ngừng viết vào đĩa.

Tôi đã gửi tin nhắn logger ! msg

Tôi thích hợp trong giả định rằng ActorRef không cập nhật khi người giám sát khởi động lại diễn viên đăng nhập của tôi?

Trả lời

8

ActorRef phải được Akka cập nhật đúng để trỏ đến phiên bản mới của diễn viên. Các docs nêu rõ rằng:

Một trỏ tham chiếu đến một diễn viên chấm dứt không so sánh tương đương với một trỏ tham chiếu đến khác (tái tạo) diễn viên với cùng một con đường. Lưu ý rằng việc khởi động lại một diễn viên gây ra bởi lỗi vẫn có nghĩa là nó là hóa thân diễn viên giống nhau, tức là khởi động lại không hiển thị cho người tiêu dùng của ActorRef.

Cũng here:

Khi actorOf() được gọi nó gán một hóa thân của nam diễn viên được mô tả bởi các Props truyền cho con đường đã chọn. Một hóa thân diễn viên được xác định bởi đường dẫn và UID. Khởi động lại chỉ hoán đổi Actor được xác định bởi Đạo cụ nhưng hóa thân và do đó UID vẫn giữ nguyên.

Vòng đời của một hóa thân kết thúc khi diễn viên dừng lại. Tại điểm đó các sự kiện vòng đời thích hợp được gọi và xem diễn viên được thông báo về việc chấm dứt. Sau khi hóa thân là dừng lại, đường dẫn có thể được tái sử dụng lại bằng cách tạo một diễn viên với actorOf(). Trong trường hợp này, tên của hóa thân mới sẽ là giống như tên trước đó nhưng UID sẽ khác nhau. ...

ActorRef luôn đại diện cho một hóa thân (đường dẫn và UID) không phải là chỉ là một đường dẫn nhất định. Do đó nếu một diễn viên bị dừng lại và một diễn viên mới có cùng tên được tạo ra, một ActorRef của hóa thân cũ sẽ không trỏ đến một diễn viên mới.

Đó là một trong những lợi thế chính khi sử dụng ActorRef s, nếu không sẽ khó khăn hơn nhiều khi làm việc với diễn viên.

Bạn cần kiểm tra chiến lược giám sát của mình và đảm bảo rằng tác nhân thực sự được khởi động lại. Mặc định chiến lược là:

final val defaultStrategy: SupervisorStrategy = { 
    def defaultDecider: Decider = { 
    case _: ActorInitializationException ⇒ Stop 
    case _: ActorKilledException   ⇒ Stop 
    case _: Exception     ⇒ Restart 
    } 
    OneForOneStrategy()(defaultDecider) 
} 

Vì vậy, nếu bạn nhận được một Exception diễn viên của bạn sẽ được khởi động lại và ActorRef nên có giá trị, nhưng nếu bạn nhận được các loại Throwable sau đó nó sẽ được dừng lại và ActorRef sẽ trở thành không hợp lệ.

+1

Cảm ơn. Điều đó giải thích nó thực sự tốt. Tôi chỉ muốn thêm rằng khi một diễn viên được khởi động lại, nó không kết thúc xử lý thông báo gây ra khởi động lại. Trong trường hợp của tôi, diễn viên không bao giờ gửi tin nhắn đến chính nó để kích hoạt công việc tiếp theo. – kliew

+0

Cảm ơn bạn đã theo dõi @kliew. Tôi đã tò mò về lý do nó không hoạt động như mong đợi trong trường hợp của bạn. –

+0

Nếu bạn đang ở trong Hệ thống diễn viên, bạn có thể chết xem ActorRef. Nhưng nếu bạn muốn duy trì ActorRef từ bên ngoài, bạn sẽ cập nhật thông tin này như thế nào? –

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