【问题标题】:Streaming data from an actor to Play Result将数据从演员流式传输到播放结果
【发布时间】:2015-09-28 12:51:45
【问题描述】:

我有数据以块的形式到达演员,并希望在 Play Result 中将这些块作为流返回。由于从Ok.stream 获得回复的唯一方法看起来是理想的候选人,因此如下所示:

Action.async { request =>
  (source ? GetStream()).map {
     case enumerator => Ok.stream(enumerator)
  }
}

我会从我的actor返回Enumerator[Array[Byte]],然后在actor内部随着消息到达actor不断将块推送到枚举器中。然而:从一个演员那里返回一个可变的枚举器似乎是某种违反。

有没有更合适的方法来实现这一点?我认为akka-streamakka.io 将是可能解决问题空间的抽象,但我看不出它们将如何应用。

【问题讨论】:

    标签: scala playframework-2.0 akka akka-stream akka-io


    【解决方案1】:

    在提出更好的解决方案之前,我已经确定的解决方案是使用 ActorDSL 在我的非参与者调用者的上下文中捕获枚举器:

    case GET(p"/stream/$streamId") => Action.async { request =>
        val (enumerator, channel) = Concurrent.broadcast[Array[Byte]]
    
        actor(new Act {
    
          storage ! Get(streamId)
          become {
            case DataStart(id, parts, bytes) =>
              sender() ! DataAck(id)
              become {
                case DataPart(_, i, b) =>
                  channel.push(b.toArray)
                case DataEnd(_) =>
                  channel.eofAndEnd()
              }
          }
        })
    
        Ok.stream(enumerator).as("text/plain")
      }
    

    反对从一个actor返回和枚举器的论点是它是可变的和不可序列化的。但是您需要一个参与者来接收一系列消息以提供给枚举器。通过 DSL 创建actor,它被显式嵌入到调用上下文中,因此不存在枚举器越过序列化边界泄漏的风险。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2015-04-19
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      相关资源
      最近更新 更多