Akka Streams:正在运行的流程

时间:2017-06-15 14:31:19

标签: stream akka

如何在流程中制作流程?假设我有一个进程通过stdin获取输入并通过stdout发送输出。我希望有一个Flow流过它。因此Flow最初会启动流程,控制其输入和输出流,然后充当Map,通过将输入馈送到流程来将输入映射到输出?并最终在流结束时终止进程。在这种情况下,背压控制如何工作?

1 个答案:

答案 0 :(得分:0)

这是一个非常基本的Flow that is "coupled",因此它会因输入或输出(接收器/源)的中断而终止。为简单起见,我假设没有标准输入的情况,但您可以对此进行调整,以添加一个不被忽略的Sinkpipes input into the process

// capture stdout from the "ls" command
val runCmd: Source[Message, NotUsed] = {
    Source.fromIterator[Message](() => Process("ls").lineStream.toIterator.map(line => TextMessage.Strict(line)))
  }

// create flow for emitting stdout source to client
val messageStdout: Flow[Any, Message, NotUsed] = Flow
    .fromSinkAndSourceCoupled(Sink.ignore, runCmd)

对于背压,我的代码示例上方的通知是阻止map操作(一次只有一个line)。随着处理速度的增加,您可以开发一个异步解决方案,并且具有遵守mapasync定义的背压的最大并行度。