0

非常に大きなファイルをストレージ サーバーにアップロードする可変数のアクターをルートとして持つラウンド ロビン ルーター アクターをホストするアクター システムがあります (各アクターは 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 が負の数を返す可能性があります :-(

乾杯 !

4

2 に答える 2

2

このリンクごと: http://doc.akka.io/docs/akka/2.2.3/general/message-delivery-guarantees.html

メッセージの順序は、送信側と受信側のペアごとに保証できます。したがって、心配する必要はありません。

于 2014-01-07T02:37:58.997 に答える
0

アクター間のメッセージングは​​キューを介して行われます。つまり、順序が維持されます。

于 2014-01-07T04:45:50.633 に答える