2012-08-30 19 views
5

'da olay akışına göre farklı öncelikli iletileri kullanma Olay akışına farklı türlerde iletiler yayınlamam gerekir ve iletilerinin farklı önceliklere sahip olması gerekir, örneğin, A tipi 10 ileti gönderildiyse, ve B tipi bir mesajın hepsinden sonra yayınlanır ve B'nin önceliğinden önceliği A - mesajının önceliğinden yüksektir B sıradaki 10 mesaj A olsa bile bir sonraki aktör tarafından alınmalıdır.Akka :: ActorSystem

Ben öncelikli mesajlar here hakkında okumak ve bu posta kutusunun benim basit uygulama oluşturdunuz:

class PrioritizedMailbox(settings: Settings, cfg: Config) extends UnboundedPriorityMailbox(

    PriorityGenerator { 
     case ServerPermanentlyDead => println("Priority:0"); 0 
     case ServerDead => println("Priority:1"); 1 
     case _ => println("Default priority"); 10 
    } 

) 

sonra dosyasına koyarak

akka { 

    actor { 

     prio-dispatcher { 
      type = "Dispatcher" 
      mailbox-type = "mailbox.PrioritizedMailbox" 
     } 

    } 

} 

bunu yapılandırılmış ve benim aktör haline kablolu:

private val myActor = actors.actorOf(
    Props[MyEventHandler[T]]. 
    withRouter(RoundRobinRouter(HIVE)). 
    withDispatcher("akka.actor.prio-dispatcher"). 
    withCreator(
    new Creator[Actor] { 
     def create() = new MyEventHandler(storage) 
    }), name = "eventHandler") 

Ben ActorSystem.eventStream.publish kullanıyorum İleti göndermek için ve benim benim abone abone (iletileri işlenir, ancak FIFO siparişinde günlükleri görebilirsiniz).

Ancak, yeterli değil gibi görünüyor, çünkü günlüklerde/konsolda "Varsayılan öncelik" gibi mesajlarını hiç görmedim. Burada bir şey mi eksik? açıklanan yaklaşımı, olay akışlarıyla mı çalışır, yoksa doğrudan doğrudan aktörler ile aktöre mesaj gönderir mi? Ve eventStream ile öncelikli mesajlar nasıl alabilirim?

cevap

10

Sorununuz, oyuncularınızın inanılmaz hızlı olmaları ve mesajların sıraya girmeden önce işlenmeleridir, bu nedenle posta kutusu tarafından herhangi bir önceliklendirme yapılamaz.

trait Foo 
    case object X extends Foo 
    case object Y extends Foo 
    case object Z extends Foo 

    class PrioritizedMailbox(settings: ActorSystem.Settings, cfg: Config) 
extends UnboundedPriorityMailbox( 
    PriorityGenerator { 
     case X ⇒ 0 
     case Y ⇒ 1 
     case Z ⇒ 2 
     case _ ⇒ 10 
    }) 

val s = ActorSystem("prio", com.typesafe.config.ConfigFactory.parseString( 
     """ prio-dispatcher { 
     type = "Dispatcher" 
      mailbox-type = "%s" 
     }""".format(classOf[PrioritizedMailbox].getName))) 
     val latch = new java.util.concurrent.CountDownLatch(1) 
     val a = s.actorOf(Props(new akka.actor.Actor { 
     latch.await // Just wait here so that the messages are queued up 
inside the mailbox 
     def receive = { 
      case any ⇒ /*println("Processing: " + any);*/ sender ! any 
     } 
     }).withDispatcher("prio-dispatcher")) 
     implicit val sender = testActor 
     a ! "pig" 
     a ! Y 
     a ! Z 
     a ! Y 
     a ! X 
     a ! Z 
     a ! X 
     a ! "dog" 

     latch.countDown() 

     Seq(X, X, Y, Y, Z, Z, "pig", "dog") foreach { x => expectMsg(x) } 
     s.shutdown() 

Bu test arasındaki renk

ile geçer: Aşağıdaki örnek kanıtlıyor