2014-07-25 11 views
5

Trong khi thực thi mã trong một diễn viên, tôi cần kiểm tra xem diễn viên có còn hoạt động hay không. Điều này có nên được khuyến khích hoặc có cách nào tốt hơn không?Kiểm tra xem diễn viên Scala/Akka có bị chấm dứt

if (self != akka.actor.DeadLetter) { 
    // do something 
} 

Cảm ơn!

CHỈNH SỬA ---

Cảm ơn tất cả các yếu tố đầu vào của bạn. Điều gì xảy ra là như sau. Tôi đang sử dụng Play. Khi diễn viên của tôi bắt đầu, khi có yêu cầu đến, thời gian chờ được lên lịch.

Promise.timeout({ 
    Logger.info(s"$self, timeout expired") 
    // do something 
}, timeoutValue) 

Đôi khi diễn viên bị dừng vì các lý do khác trước khi hết thời gian chờ (ví dụ, khách hàng ngắt kết nối). Trong trường hợp đó, những gì tôi nhìn thấy sau đó trong các bản ghi là

Actor[akka://application/deadLetters], timeout expired. 

Để hiểu biết của tôi, điều này có nghĩa rằng các diễn viên mặc định deadLetters được thực thi mã đó. Vì vậy, câu hỏi của tôi thực sự là: cách tốt nhất để kiểm tra xem mã Promise được thực hiện sau khi diễn viên được chấm dứt, và ngăn chặn nó đi xa hơn nếu đó là trường hợp?

Trả lời

0

Nếu diễn viên của bạn chết, không có mã nào trong diễn viên sẽ chạy.

Bạn có thể kiểm tra xem diễn viên cụ thể có sẵn không, với actorSelection và sau đó gửi thư đến bất kỳ thứ gì được trả về (nếu không có gì, sẽ không có tin nhắn nào được gửi).

ActorContext.actorSelection(<your-actor-name>) ! someMessage 
+0

Cảm ơn câu trả lời của bạn.Bạn có thể xem xét các chỉnh sửa câu hỏi của tôi không? – ticofab

+0

Hi Fabio :) Bạn có thể thử làm điều gì đó với postStop cho diễn viên đó, như tác giả khác đã đề xuất (đây là phương pháp nên được gọi khi diễn viên chấm dứt). Ví dụ, gửi một tin nhắn cho một diễn viên (xem) khác, mà sẽ thay đổi bối cảnh? Hoặc sử dụng một số đồng bộ hóa bên ngoài khác. – Ashalynd

0

Tôi nghĩ bạn có thể xem diễn viên của mình và nếu bạn nhận được thông báo Terminated bạn chắc chắn rằng diễn viên của bạn không hoạt động.

ActorContext.watch(self) 
+0

Cách tôi có thể sử dụng thông tin này sau đó sẽ đặt trạng thái trong diễn viên và kiểm tra trạng thái đó trong câu lệnh if của tôi. Câu lệnh if sẽ được thực thi tại một thời điểm nào đó (trong thời gian chờ Play Promise). Tôi muốn sử dụng một cách sạch hơn nếu có. – ticofab

+0

Trong khi đồng hồ là cách ưa thích để được thông báo khi một diễn viên đã dừng nó không giúp phát hiện sự kiện dừng lại từ bên trong diễn viên. –

+0

Bạn có thể giải thích chính xác 'ActorContext' là gì không? Cảm ơn –

2

Bạn nên làm quen với các vòng đời diễn viên: http://doc.akka.io/docs/akka/2.3.4/scala/actors.html#Actor_Lifecycle

Từ bên trong một diễn viên, bạn có thể thực hiện gọi lại postStop() sẽ được gọi ngay lập tức trước khi diễn viên của bạn sẽ được dừng lại. Nếu bạn muốn theo dõi vòng đời của diễn viên từ một diễn viên khác, bạn nên sử dụng DeathWatch: http://doc.akka.io/docs/akka/2.3.4/scala/actors.html#Lifecycle_Monitoring_aka_DeathWatch

+0

Cảm ơn câu trả lời của bạn.Mã thực sự được thực thi trong diễn viên DeadLetter. Tôi đã chỉnh sửa câu hỏi để cung cấp thêm ngữ cảnh. – ticofab

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