İ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?
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. –