2015-01-17 6 views
6

İki uçta dağıtılmış hesaplamaları yapmak için akka küme kullanıyorum. İlk önce phaseA, daha sonra phaseB. Fazları işlemek için akka'nın FSM'sini kullanıyorum.Akka'daki iletileri ertelemenin doğru yolu

Sabit bir eşitleme yoktur, böylece düğümlerden biri phaseB'a ulaşabilir, diğerleri hala phaseA.

sorun phaseB içinde bir (onlar phaseA yılında henüz) phaseB-related mesajları gevşek onları neyin sebep diğerlerine phaseB-related mesajlar gönderir vardır.

case any => self ! any 

Ama IMO bu bunu yapmak için uygun bir yol değildir: For

şimdi bilinmeyen mesajları erteleme basit hile kullanın. Akka scheduler'ı kullanarak any'u da programlayabilirim, ama ben de bundan hoşlanmıyorum.

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 
} 

Böyle bir durumda iletileri ertelemek doğru yolu nedir: İşte

kod basitleştirilmiştir?

+0

A aşamasındaki aktörün mesajları kuyruğa sokmasını sağlayın ve sonra B evresine girdiğinde kendilerine gönderin. Aktörlere, insanlarmış gibi düşünün. Birisi size henüz işlemek için hazır olmayan bir kağıt parçasında bir mesaj verirse ne yapardınız? Bununla başa çıkana kadar masanın üstüne yığının. –

cevap

12

Daha sonra işlenmek üzere iletileri saklayabilirsiniz. akka.actor.Stash'u oyunculara ve stash() mesajına daha sonra iletmek için phaseB mesajınızı verin.

FSM'niz phaseA numaralı telefondayken ve bir phaseB10 mesajını aldığında, stash() numaralı telefonu arayın. Bu aktör daha sonra phaseB durumuna geçtiğinde, unstashAll() numaralı telefonu arayın ve tüm saklanan iletiler yeniden iletilecektir.