2014-01-06 96 views
0

我有一個演員系統,承載一個循環路由器的角色,具有作爲路由可變數量的演員上傳非常大的文件到存儲服務器(每個演員上傳一個文件)。上傳操作每個文件大約需要10分鐘。演員系統是本地的/不是分佈式的。Scala/AKKA - 有多少演員在「工作」?

如何知道在任何給定時間上傳了多少個文件?

我的解決方案,現在是有一個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 
    } 

    } 

每當上傳工人演員開始它發出了一個「UploadStartOp」這個UploadOpsMonitorActor和上傳當它完成(或失敗)的上傳,它感受UploadEndOp消息。應用程序的其他組件可以發送QueryOp消息,以獲取正在上傳的總數...

有沒有更好的解決方案呢?這樣做的弱點是不能保證消息按順序到達 - 理論上的UploadEndOp消息可以在UploadStartOp消息,這可能導致該UploadOpsMonitorActor返回:-(

乾杯負數之前到達

回答

0

消息參與者之間發生雖然隊列即爲了保持