【问题标题】:How to send iterables between actors or from an actor to a Future?如何在演员之间或从演员向未来发送迭代?
【发布时间】:2014-05-04 03:56:45
【问题描述】:

来自程序主方法的future 向它的actor 发送一个msg 请求一个可迭代对象。然后actor创建另一个future,它向远程actor请求可迭代对象(比如一个ArrayBuffer)。从远程actor接收到ArrayBuffer后,actor如何在main方法中将其发送回第一个future?似乎创建sender 的本地别名并创建一个单独的案例类来表示可迭代并不会阻止遇到dead letters

这是一个示例代码:

case class SequenceObject(sqnce:Seq[someArrayBuffer])

//...

implicit val timeout = Timeout(10 seconds)
val fut1: Future[Any] = myActor ? iNeedAnArrayBufferObject 

fut1.onSuccess {
  case listOfItems: SequenceObject => {
    //do sth with listofItems.sqnce
  }

class myActor extends Actor {
  implicit val timeout = Timeout(1 seconds)

  def receive = {
  case a: iNeedAnArrayBufferObject => {
    val originalSender = sender
    val fut: Future[Any] = (remoteActor ? a) 
    fut.onSuccess {
      case list: SequenceObject => {
        originalSender ! SequenceObject(list.sqnce)
   }    
}

远程actor代码是:

class ServerActorClass extends Actor {
  def receive = {
    case a: iNeedAnArrayBufferObject => {
      val closer = sender()

      closer ! SequenceObject(ArrayBufferObject[information])
    }
  }

上述方法似乎不起作用。远程参与者和本地参与者可以通信并正确接收消息。但是,可迭代对象永远不会发送回 fut1。这是为什么?提前致谢。

【问题讨论】:

  • 你能发布完整的代码吗?
  • 如果你想向actor发送future,你需要使用pipe模式
  • 尝试在没有 Futures 的情况下编写它。以我的经验,混合 Futures 和 Actors 是一种代码味道。
  • @ViktorKlang 如何在不使用 Futures 的情况下将我需要的数据从 clientActor 取回给客户端对象?
  • @1xQ:什么是客户端对象?

标签: scala akka


【解决方案1】:

Ask: Send-And-Receive-Future 部分中检查 pipeTo pattern

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2014-07-10
    相关资源
    最近更新 更多