2012-10-05 5 views

答えて

3

あなたがのために任意のメッセージを待ちたい場合は、[はい、あなたは、単にreceivetimeoutのを設定します。http://doc.akka.io/docs/akka/current/scala/actors.html#receive-timeout

(ドキュメントがありますここでやや誤解を招くこともありますが、すべてのメッセージの後にreceiveTimeoutを設定することもできます)

16

Akka Actor "ask" and "Await" with TimeoutExceptionをご覧ください。しかし、その間アクターは他のメッセージを処理することができないので、俳優の内部をブロックすることは非常に悪い考えです。さらに、1つのAkka処理スレッドをブロックします。

より良いアプローチは、メッセージ送信(火災とを忘れる)とAkka schedulerを使用して、いくつかのタイムアウトイベントをスケジュールすることです。応答が到着したら、そのイベントをキャンセルするか、または何らかのフラグを設定して、実際に応答があった場合にトリガーしないようにします。

+2

+1 rソリューション。 – paradigmatic

4

恐ろしいかもしれませんが、Finite State Machine (FSM)の特性をチェックしてください。

import akka._ 
import actor._ 
import util._ 
import duration._ 
import Impatient._ 

object Impatient { 
    sealed trait State 
    case object WaitingForMessage extends State 
    case object MessageReceived extends State 
    case object TimeoutExpired extends State 

    sealed trait Data 
    case object Unitialized extends Data 

    // In 
    case object Message 
} 

class Impatient(receiver: ActorRef) extends Actor with FSM[State, Data] { 
    startWith(WaitingForMessage, Unitialized) 

    when(WaitingForMessage, stateTimeout = 3 seconds) { 
    case Event(StateTimeout, data) => goto(TimeoutExpired) using data // data is usually modified here 
    case Event(Message, data) => goto(MessageReceived) using data // data is usually modified here 
    } 

    onTransition { 
    case WaitingForMessage -> MessageReceived => stateData match { 
     case data => log.info("Received message: " + data) 
    } 
    case WaitingForMessage -> TimeoutExpired => receiver ! TimeoutExpired 
    } 

    when(MessageReceived) { 
    case _ => stay 
    } 

    when(TimeoutExpired) { 
    case _ => stay 
    } 

    initialize 
} 

ここではアクションである:

object Main extends App { 
    import akka._ 
    import actor._ 
    import Impatient._ 

    val system = ActorSystem("System") 

    val receiver = system.actorOf(Props(new Actor with ActorLogging { 
    def receive = { 
     case TimeoutExpired => log.warning("Timeout expired") 
    } 
    })) 

    val impatient = system.actorOf(Props(new Impatient(receiver)), name = "Impatient") 
    impatient ! Message 

    val impatient2 = system.actorOf(Props(new Impatient(receiver)), name = "Impatient2") 
    Thread.sleep(4000) 
    impatient2 ! Message 

    system.shutdown() 
} 
関連する問題