2015-01-17 14 views
6

Tôi đang sử dụng cụm akka để thực hiện tính toán phân tán trong hai pahs. Đầu tiên phaseA rồi phaseB. Để xử lý các pha, tôi sử dụng FSM của akka.Cách đúng để trì hoãn tin nhắn trong Akka

Không có đồng bộ hóa cứng để một trong các nút có thể đạt đến phaseB trong khi các nút khác vẫn ở trong phaseA.

Vấn đề là, một trong phaseB gửi phaseB-related tin nhắn cho người khác (họ đang ở số phaseA chưa) điều gì khiến họ mất thông báo phaseB-related.

Để bây giờ tôi sử dụng thủ thuật đơn giản để hoãn thông điệp không rõ:

case any => self ! any 

Nhưng IMO đây không phải là cách thích hợp để làm điều đó. Tôi biết tôi cũng có thể lên lịch any bằng cách sử dụng lịch trình akka, nhưng tôi cũng không thích điều này.

đây được đơn giản hóa mã:

package whatever 

import akka.actor._ 

object Test extends App { 

    case object PhaseA 
    case object PhaseB 

    class Any extends Actor { 

    def phaseA: Receive = { 
     case PhaseA => { 
     context.become(phaseB) 
     println("in phaseB now") 
     } 
     case any => self ! any 
    } 

    def phaseB: Receive = { 
     case PhaseB => println("got phaseB message !") 
    } 

    def receive = phaseA 

    } 

    val system = ActorSystem("MySystem") 
    val any = system.actorOf(Props(new Any), name = "any") 
    any ! PhaseB 
    any ! PhaseA 
} 

cách chính xác để hoãn thông điệp trong một tình huống như vậy là gì?

+0

Yêu cầu diễn viên trong giai đoạn A đặt các thông điệp vào hàng đợi và sau đó gửi chúng cho chính nó khi nó đi vào giai đoạn B. Lý do về các diễn viên như thể họ là người. Bạn sẽ làm gì nếu ai đó đưa cho bạn một tin nhắn trên một mảnh giấy mà bạn chưa sẵn sàng xử lý? Đặt trên đống trên bàn của bạn cho đến khi bạn đã sẵn sàng để đối phó với nó. –

Trả lời

12

Bạn có thể stash tin nhắn để xử lý sau. Trộn akka.actor.Stash vào các diễn viên của bạn và stash() tin nhắn phaseB của bạn để sử dụng sau.

Khi FSM của bạn ở trạng thái phaseA và nhận được thông báo phaseB, hãy gọi stash(). Khi diễn viên đó chuyển sang trạng thái phaseB, hãy gọi unstashAll() và tất cả thư bị lưu trữ sẽ được gửi lại.

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