2012-02-22 4 views
5

Akka-2インスタンスは無限ループのままで、処理するデータがないか10分ごとにチェックする必要があります。Akka-2インスタンスは、メールボックスをオーバーフローさせずにn TimeUnitsごとにメッセージを送信します。

ループを設計して、インスタンスが自分自身を呼び出し、何らかの作業をしてから一定時間スリープするようにするにはどうすればよいですか?

また、メールボックスサイズをもうクエリできないことがわかりました。作業タスク(この場合はディスパッチ機能)がアクティブである限り、どのようにメッセージが無視されることを確認しますか?

case class Dispatch() 

// Automatical start? The start function has been removed since Akka 2 ? 
val dispatcher = system.actorOf(Props[MailDispatcher]) 

class MailDispatcher extends Actor { 

    private val interval = Config.getLong("mail.check.interval") 
    context.setReceiveTimeout(Duration(interval, TimeUnit.SECONDS)) 

    def receive = { 
    case ReceiveTimeout => { 
     self ! Dispatch   
    } 
    case Dispatch => dispatch() 
    case e: Exception => Logger.error("unexpected Error: " + e) 
    } 

    def dispatch() {  
     // trigger mail-dispatch  
    } 
} 
+0

あなたのコメントの質問を検討してください:はい、Akka 2は、開始メソッドが削除され、作成のアクターを開始します。 http://akka.io/docs/akka/2.0-RC1/scala/actors.html#creating-actors-with-default-constructor – Frank

答えて

3

私は次のことをお勧めしたい:

使用:あなたはReceiveTimeoutというメッセージを取得するときhttp://akka.io/docs/akka/2.0-RC2/scala/actors.html#initial-receive-timeout

その後、あなたは仕事のためにポーリングし、そして自分自身のメールボックスに作品を送っています。

+0

ヒントについては、上記のコードを編集しましたが、 Thread.sleepの呼び出しはまったく必要ですか?タイムアウトはどのように計算されますか?ディスパッチファンクションブロックのタイムアウト計算を呼び出していますか?スレッドが1年間スリープすると、メールボックスがオーバーフローするか、スレッドがスリープしていない間にのみ計算されたタイムアウト値になりますか?それが眠っていない場合、睡眠への呼び出しは不要です、と思います。 – recalcitrant

+3

あなたの俳優に決してThread.sleep(..)をしないでください。何らかの理由で。ただしないでください。 –

+0

もう一度、ありがとう。ジョブが常にタイムアウトよりも時間を消費すると、メールボックスは最終的にいっぱいになります。それを避ける方法に関する文書はありますか? – recalcitrant

関連する問題