Akka Streams:初始化和处理接收器资源的最佳实践

时间:2018-05-04 12:21:07

标签: akka-stream

我有一个场景,我想将图表的结果写入CSV。 这包括文件的创建,文件编写器的初始化(I'm using this library),最后,在流完成后,我想再次处理/关闭编写器。

理想情况下,我想将此逻辑封装在接收器中,但我想知道添加初始化和处理逻辑的最佳实践/挂钩。

2 个答案:

答案 0 :(得分:2)

要使用Akka Streams将CSV内容写入文件,请使用Alpakka's CSV connectorFileIO实用程序。这是一个简单的例子:

val destinationPath: Path = ???

Source.single(ByteString("""header1,header2,header3
                           |1,2,3
                           |4,5,6""".stripMargin))
  .via(CsvParsing.lineScanner())
  .runWith(FileIO.toPath(destinationPath))

请注意,FileIO.toPath可选择OpenOption次设置。例如,您可以规定目标文件的创建(如果它尚不存在):

// ...
.runWith(
  FileIO.toPath(destinationPath, Set(StandardOpenOption.WRITE, StandardOpenOption.CREATE)))

至于清理与文件相关的底层资源,如果你使用FileIO,Akka Streams将在流完成时采用它。

答案 1 :(得分:2)

给定任何类型的资源,而不仅仅是文件,消耗数据元素以及needs to be closed

type Data = ???

trait DataConsumer extends Function1[Data, Unit] with AutoCloseable

可以创建一个Sink,使用Flow def createDataConsumerSink(dataConsumer: DataConsumer) : Sink[Data,_] = Flow[Data].watchTermination()( (_, f) => f foreach (_ => dataConsumer.close())) .to(Sink.foreach[Data](dataConsumer.apply)) <div *ngFor="item of listofitems"> <span [ngClass]="{'turnedon': 'localvariable == 'SELECTOR_{{item.name}}'}">item.name</span> </div> 方法完成后关闭消费者,该方法可以预先添加:

'SELECTOR_{{item.name}}