私は二ティックは、この第二の中に受信したすべてのメッセージをフラッシュするために、自己に送信されます。いくつかのマイナーな変更信頼性の高い定期アクタの実装方法
trait PeriodicActor[T] extends DecoratingActor with ActorLogging {
import context.dispatcher
var messages = new ListBuffer[T]
abstract override def preStart() = {
schedule()
super.preStart()
}
protected def schedule() {
context.system.scheduler.scheduleOnce(1 seconds, self, Tick)
}
receiver {
case Tick => {
flush()
schedule()
}
}
def flush() = {
handleMessages(this.messages)
.recover {
case NonFatal(e) => log.error(e, "error in actor")
}
this.messages.clear()
}
/**
* implement to handle buffered messages.
*/
def handleMessages(messages: ListBuffer[T]): Future[Any]
def buffer(msg: T) = {
messages.append(msg)
}
}
毎週1とアッカ・パターンから取らPeriodicActorを使用しています
私の問題は、scheduleOnceが十分に信頼できないということです。 Tickメッセージが受信されなかった可能性があります。つまり、Tickingメカニズムが機能しなくなります。
は、だから私は、これは停止しないことを確認する方法を考えた:バッファ法上の文は、それは例えばことを確認するかどうはたぶん追加リストは、特定のサイズに取得する場合、それをそれを洗い流すためにTickを送るでしょう。ここで問題となるのは、ティック・メッセージが1つ失われていると、しばらくの間、リストがフラッシュされない可能性があるということです。
5分ごとにTickメッセージの別のスケジューリングを追加して、メカニズムが正常に機能することを確認することをお勧めします。
context.system.scheduler.schedule(5分、longInterval、自己、ティック)
あなたはどう思いますか?より良い方法がありますか?
配送が保証されていないため、メッセージが届かない可能性があることに同意します。メッセージが送信されない可能性があります私はスケジューラの信頼性に関する文書を見つけることができません。 – mattinbits
@mattinbitsあなたは正しいです、私の質問を更新しました。ありがとう。 – Tomer