java - 如何处理多个 Akka Actor?

标签 java scala akka actor

我的实际用例是 MyActor 收到一条消息以开始其工作。该作业需要下载多个网页,因此要求MyActor下载。每次文章下载完成时,MyActor 都会做出响应。

对于我的代码有更好的设计模式吗?允许多个参与者更新计数变量似乎是不好的,因为我只关心每个参与者特定的计数。

主要 Actor :

val count = 0

def receive = {
    case CountUpdate => count += 1
    case Job => {   

        List(1, 2, 3).map{case num => 
            (new myActor ? ToDownload)

            val tries = 0
            while (tries < 10){
               print("Count is: " + count)
               tries += 1
               // sleep 10 seconds
            }

            count = 0
        }           
    }
}

我的 Actor :

def receive = {
    case ToDownload => sender ! CountUpdate
}

编辑:

如果我按照建议使用 future,这不会导致竞争条件吗?

 var downloads: List[Int] = List()

 urls.map{ case url => Future{ download(url) }.onComplete{
    case Success(value) => downloads = downloads :+ value
    case Failure(value) => println("Failure")
    }
 }

最佳答案

您还可以创建一个Future来下载资源。一旦 future 完成,您可以向主要参与者发送更新消息,主要参与者可以对此使用react。 FutureexecutionContext 执行。

class MainActor extends Actor {
  var count = 0

  override def receive: Receive = {
    case CountUpdate =>
      count += 1
      println("New count " + count)
    case Job =>
      val batchIDs = List(1, 2, 3)

      implicit val executionContext = ExecutionContext.fromExecutor(new ForkJoinPool())

      batchIDs.map {
        batchID =>
          Future {
            // do some work
          }.onSuccess{
            case _ => self ! CountUpdate
          }
      }
  }
}

关于java - 如何处理多个 Akka Actor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32613322/

相关文章:

模式匹配中的Scala隐式提取值?

java - 查找匹配谓词并使用 iterable.tryFind 从 java 列表中返回元素

java - 亚马逊ec2查询制作

scala - 在编译时添加两个相同大小的列表

scala - 合并 scalaz-stream 输入进程在 stdin 上似乎为 "wait"

java - 无法解析对值 :$akka. 的替换 stream-blocking io dispatcher

servlet 方法上的 java ee 7 @Transactional

java - JAX-WS - 如何创建类型为 xs :any from server side code? 的元素

Scala 在案例类中使用 Wea​​kReference

java - Akka future 指导