2014-01-06 49 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

消息参与者之间发生虽然队列即为了保持