2011-07-13 24 views
6

Geçerli başvurum akka 1.1 dayanmaktadır. Belirli bir proje için analiz görevlerini yürütmekle sorumlu birden çok ProjectAnalysisActors vardır. Analiz, böyle bir aktör genel bir başlangıç ​​mesajı aldığında başlatılır. Bir adımı bitirdikten sonra, uzun bir tanımlandığı gibi bir sonraki adıma sahip bir mesaj gönderir.Gelecekte sarıldıklarında engelleme aktör mesajlarını kullanmak tamam mı?


sealed trait AnalysisEvent { 
    def run(project: Project): Future[Any] 
    def nextStep: AnalysisEvent = null 
} 

case class StartAnalysis() extends AnalysisEvent { 
    override def run ... 
    override def nextStep: AnalysisEvent = new FirstStep 
} 

case class FirstStep() extends AnalysisEvent { 
    override def run ... 
    override def nextStep: AnalysisEvent = new SecondStep 
} 

case class SecondStep() extends AnalysisEvent { 
    ... 
} 

class ProjectAnalysisActor(project: Project) extends Actor { 

    def receive = { 
     case event: AnalysisEvent => 
      val future = event.run(project) 
      future.onComplete { f => 
       self ! event.nextStep 
      } 
    } 

} 

nasıl her analiz aşaması için çalışma yöntemleri için benim kod uygulamak için bazı zorluklar şu şekilde yürütülmesi kod temelde görünüyor. Şu anda her bir çalışma metodu içinde yeni bir gelecek yaratıyorum. Bu geleceğin içinde tüm takip mesajlarını farklı alt sistemlere gönderirim. Bazıları engellemeyen yangın-ve-unut mesajlardır, ama bazıları bir sonraki analiz adımı başlamadan önce saklanması gereken bir sonuç verir. Bu engelleme mesajlar kaçınılmalıdır yana doğru yol olup olmadığını, merak ediyorum


def run(project: Project): Future[Any] = { 
    Future { 
     progressActor ! typicalFireAndForget(project.name) 
     val calcResult = (calcActor1 !! doCalcMessage(project)).getOrElse(...) 

     val p: Project = ... // created updated project using calcResult 

     val result = (storage !! updateProjectInformation(p)).getOrElse(...) 
     result 
    } 
} 

şöyle

anda tipik bir çalışma yöntemi görünüyor. Bu kullanım durumunda bunları kullanmak mantıklı mıdır yoksa hala bundan kaçınmalı mıyım? Eğer öyleyse, uygun bir çözüm ne olurdu?

cevap

7

Görünüşe göre, ProjectAnalysisActor'un tek amacı gelecekteki çağrıları zincirlemektir. İkincisi, çalışma yöntemleri hesaplamalara devam etmek için sonuçların beklenmesi gibi görünüyor.

Yani burada açıklandığı gibi, Gelecek Kompozisyon uygulamak için kodunuzu üstlenmeden deneyebilirsiniz düşünüyorum: http://akka.io/docs/akka/1.1/scala/futures.html

def run(project: Project): Future[Any] = { 
    progressActor ! typicalFireAndForget(project.name) 
    for( 
     calcResult <- calcActor1 !!! doCalcMessage(project); 
     p = ... // created updated project using calcResult 
     result <- storage !!! updateProjectInformation(p) 
) yield (
    result 
) 
} 
+0

Sağol, bu umut verici görünüyor. Hemen deneyeceğim. Haklısınız, asıl amaç gelecekteki çağrıları zincirlemektir. Bunun yanı sıra, aktörler bazı proje analizi yönetim görevleriyle uğraşırlar. – Steffen

+0

Bu kodun çoğunu yeniden güncelledim. Mükemmel çalışıyor! – Steffen

İlgili konular