2014-04-01 177 views
2

我在Scala中创建了以下Akka演员代码。代码工作正常,当一个workerActor创建。但是,当我尝试使用循环法逻辑创建一个工作者角色池时,代码默默失败。任何想法如何解决这个问题?我如何获得更多的打印调试信息?Akka演员 - 创建演员群

import scala.collection.immutable.Map 
import scala.collection.mutable.ArrayBuffer 

import akka.actor.actorRef2Scala 
import akka.actor.ActorSystem 
import akka.actor.Props 
import scala.concurrent.Await 
import scala.concurrent.duration._ 
import akka.pattern.ask 
import akka.util.Timeout 
import akka.actor._ 
import org.junit._ 
import org.junit.Assert._ 
import messaging.actors._ 
import akka.routing.RoundRobinRouter 
import akka.routing._ 

class MainEngineActorTest { 

    @Test 
    def testMainActor() = { 
    val _system = ActorSystem("MainEngineActor") 
    val master = _system.actorOf(Props[MainEngineActor], name = "EngineActor") 

    println ("Created Main Engine Actor") 


    implicit val timeout = Timeout(5 seconds) 

    val userID = new UserID ("test1") 

    println ("Sending messages") 

    for (i <- (1 to 10)) { 
     master ! "Hello" 
     master ! "World" 
    } 

    } 
} 

class MainEngineActor extends Actor with ActorLogging{ 

    // works if we create only a single workerActor 
    //val workerActors = context.actorOf(Props[WorkerActor], name = "WorkerActors") 

    // Doesn't work when we create a pool of worker actors - how do we fix this? 
    // why doesn't this work and why aren't any error messages printed? 
    val workerActors = context.actorOf(RoundRobinPool(5).props(Props[WorkerActor]), name = "WorkerActors") 

    def receive: Receive = {  
    case request => {  
     workerActors forward request 
    }  
    } 
} 

class WorkerActor extends Actor { 

    def receive: Receive = {    
    case request => { 
     println ("RequestReceived =" + request) 
    } 
    } 
} 
+0

“沉默地失败”是什么意思?你有输出吗? – Ryan

+0

我期待演员打印出:“RequestReceived = World RequestReceived = Hello”,但演员不打印任何东西。然而,如果我只是创建一个演员(而不是一群演员),一切正常。 – user3482479

+0

如果您发布您正在使用的akka​​版本,路由器初始化语法随Akka 2.3更改将会有所帮助 – pushy

回答

2

尝试创建池这样,而不是:

val workerActors = context.actorOf(Props[WorkerActor].withRouter(RoundRobinPool(5)), name = "WorkerActors") 

此外,运行此作为JUnit测试时,该程序前儿童演员有机会收到消息终止。我通过在发送HelloWorld消息到master的循环之后添加Thread.sleep(5000)来验证此情况。然后,我稍微调整了一下代码,以便使用akka-testkit中的Akka's TestActorRef,这将迫使所有人使用CallingThreadDispatcher在整个测试中获得同步执行,并且所有内容都按预期工作。我改变的两条线是:

implicit val _system = ActorSystem("MainEngineActor") 
val master = TestActorRef(new MainEngineActor())