2010-11-17 64 views
1

我想讓演員工作,但它只能部分工作。斯卡拉演員不按預期工作

MyActor每秒工作並通過循環調用自身來運行Job。

這部分工作正常。

我也想從我的應用程序的其他部分隨機調用MyActor。

這不行。

MyActor遞增其mailboxSize,但隨後繼續循環,並且從不獲取從外部發送的任何消息。

case class DoJob(fast:Boolean) 

object MyActor extends Actor { 

    def act = { 
    loop { 
     MyActor ! DoJob(false) 
     receive { 
     case DoJob(fast) => { 
      Job.perform(fast) 
     } 
     } 
     Thread.sleep(1000) 
    } 
    } 
} 

以下呼籲方面不起作用DoJob(真),但僅僅增加MyActor的郵箱大小:

MyActor ! DoJob(true) 

出了什麼問題嗎?

+1

你確實對它調用了'.start',對吧? – wheaties 2010-11-17 16:24:43

+0

是的,我做過,否則循環會起作用? – trajectory 2010-11-17 16:51:42

回答

3

每次撥打receive只會收到一封郵件。由於您在致電接收之前向您自己發送一條消息,因此您永遠不會減少該環路中的郵箱大小。

您應該製作一個單獨的線程來發送心跳,或使用​​和TIMEOUT的情況。

+0

感謝您的迴應!比方說,我做了一個單獨的線程,Actor是否會在Job.perform(fast)方法從某處再次調用它之前看到任何併發問題? – trajectory 2010-11-17 17:12:33

+0

@getagrip我很肯定,通過「獨立線索」,本意爲「獨立演員」。 – 2010-11-17 20:01:47