非常に大きなファイルをストレージ サーバーにアップロードする可変数のアクターをルートとして持つラウンド ロビン ルーター アクターをホストするアクター システムがあります (各アクターは 1 つのファイルをアップロードします)。アップロード操作には、1 ファイルあたり約 10 分かかります。アクター システムはローカルであり、分散されていません。
特定の時点でアップロード中のファイル数を知るにはどうすればよいですか?
私の今の解決策は UploadOpsActor を持つことです:
case object UploadEndOp
case object UploadStartOp
case object QueryOp
object UploadOpsMonitorActor {
def apply(): Props = Props(new UploadOpsMonitorActor())
}
class UploadOpsMonitorActor extends Actor {
var numUploadsInProgress: Int = 0
// number of uploads in progress , initially equal to zero
def receive = {
case UploadStartOp => {
numUploadsInProgress = numUploadsInProgress + 1
}
case UploadEndOp => {
numUploadsInProgress = numUploadsInProgress - 1
}
case QueryOp => {
sender ! numUploadsInProgress
}
}
アップロード ワーカー アクターがアップロードを開始するたびに、この UploadOpsMonitorActor に「UploadStartOp」を送信し、アップロードを終了 (または失敗) すると UploadEndOp メッセージを送信します。アプリケーションの他のコンポーネントは、QueryOp メッセージを送信して、進行中のアップロードの総数を取得できます...
これより良い解決策はありますか?これの弱点は、メッセージが順番に到着することが保証されていないことです - 理論的には UploadEndOp メッセージが UploadStartOp メッセージの前に到着する可能性があり、これによりこの UploadOpsMonitorActor が負の数を返す可能性があります :-(
乾杯 !