Actor の返信待ちでタイムアウトを指定

返信待ちでタイムアウトみたいなキーワードで飛んできた人がいたようなので、即席でためしてみました。

import scala.actors.TIMEOUT
import scala.actors.Actor._

object WaitResponseWithTimeout extends Application {
  val foo = actor {
    loop {
      receiveWithin(1000) {
	case TIMEOUT => print("-")
	case 'exit => exit
	case _ =>
      }
    }
  }

  foo.!?(5000, 'bar) match {
    case Some(value) => println("response value is "+value)
    case None => println("timeout")
  }

  foo ! 'exit
}

Actor へのメッセージ送信で返信を待つ場合 !? をつかうのですが、単純に foo !? 'bar のようにメッセージ送信した場合は Actor が返信してくれるまでブロックします。このままですと、何らかの理由で Actor が無反応(送信されたメッセージに対応していないなど)の場合に、そのままブロックしっぱなしになってしまいます。
返信待ちのタイムアウトを指定するには !? のオーバーロードされたメソッド !? (msec : Long, msg : Any) : Option[Any] を使用します。このメソッドではタイムアウトまでのミリ秒を引数として指摘できます。また、返信が得られた場合は Some を、タイムアウトした場合は None を返します。


実行結果は↓みたいな感じです。


c:\actor-sample> scala WaitResponseWithTimeout
[]----[]timeout

c:\actor-sample>