当前位置: 首页 > 知识库问答 >
问题:

如何从另一个尚未准备好的演员那里要求数据?

鲁斯伯
2023-03-14
class A extends Actor {
  var data = Option.empty[Int]
  val requestors = mutable.Set[ActorRef]

  def receive = {
    case data: Int => 
      this.data = Some(data)
      requestors.foreach {_ ! data}
    case Request => 
      if (data.isEmpty) {
        requestors.add(sender)
        //What should I send back to sender here?
      } else {
        sender ! data.get
      }
  }
}
(actorA ? Request()).map {
  //if the data is not ready here, how can I wait for data?
}
dataActor ! 100

问题是,当请求者请求时,数据可能还没有准备好,所以请求的未来可能会失败。我需要给发送者发送一些东西来保证有数据,但显然Akka似乎没有promiseAkaik。

这里如何落实?

共有1个答案

孙福
2023-03-14

几种可能性。

首先,您可以返回实际的选项(data.get无论如何都是“代码气味”,最好避免):

 case Request() => data

然后在客户端继续尝试:

 def result: Future[Int] = (actor ? Request()).map { 
    case Some(n) => n
    case None => after(1 second, system.scheduler)(result)
 }
val ready = Promise[Int]()

case data: Int => 
   this.data = data
   ready.complete(data)
case Request() => 
   data.fold(ready.future)(Future.successful)
 val result: Future[Int] = (actor ? Request()).flatMap {
    case f: Future[Int] => f
 }
 类似资料:
  • 我正试图用BouncyCastle CMS签署一份PDF文件。签名有效,但Adobe Reader告诉我它还没有准备好LTV。 据我所知,CRL嵌入在CMS SignedData中。证书也被嵌入其中。还嵌入了时间戳。 签名是一个分离的签名,放在“预留空间”。 为什么签名还没有准备好?我是不是做错了什么? 签名测试-PDF:http://www.filedropper.com/outputx 代码:

  • 我有以下准备的一个准备好的声明失败了... 我在我的第一份准备好的声明中几乎有同样的准备,而且它进行得很好。我不确定是否我有两个准备好的声明,如果这是造成一个问题,或情况可能是什么? 现在我有个错误... 更新-可能的内部连接,像这样?

  • [信息][05/05/2017 13:12:25.650][Akka-Spring-demo-Akka.actor.default-dispatcher-5][Akka://Akka-spring-demo/deadletters]从演员[Akka://Akka-spring-demo/deadletters]到演员[Akka://Akka-spring-demo/deadletters]的消息[

  • 我希望有几个参与者(它们表示基于Akka IO部分的TCP连接)。这些参与者应更新通用模型(内存中)。此模型保存在管理此模型的其他参与者中。 我的问题是,我如何设置这个结构?有没有办法告诉akka某个演员只有一个实例? 另一种选择是:我已经有了一个actor,它接受新的TCP/IP连接并将它们传递给新的actor。现在我可以在连接接收器中创建这个“模型管理器角色”,并将这个角色传递给新创建的每个连