关闭Akka流以进行资源清理

关闭Akka流以进行资源清理,akka,apache-kafka,akka-stream,Akka,Apache Kafka,Akka Stream,使用Akka Streams时,是否有任何方法可以关闭/关闭不再需要用于资源清理的流 编辑:当源由无限流组成时,它可能永远不会完成,我希望在完成源之前停止它 用法示例: Source.from(publisher) .map((p) -> p) .to(Sink.ignore()) .run(materializer) 是否有关闭流的方法?您可以在独立的Actormatarializer上运行流,并在一段时间后调用Actormatarializer上的

使用Akka Streams时,是否有任何方法可以关闭/关闭不再需要用于资源清理的流

编辑:当源由无限流组成时,它可能永远不会完成,我希望在完成源之前停止它

用法示例:

Source.from(publisher)
      .map((p) -> p)
      .to(Sink.ignore())
      .run(materializer)

是否有关闭流的方法?

您可以在独立的
Actormatarializer
上运行
流,并在一段时间后调用Actormatarializer上的shutdown:

val actorSystem = ActorSystem()

val temporaryStream = {

  val localMat = ActorMaterializer()(actorSystem)

  import actorSystem.dispatcher
  actorSystem.scheduler.scheduleOnce(10 minutes) { localMat.shutdown() }

  Source.from(publisher)
        .map((p) -> p)
        .to(Sink.ignore())
        .run()(localMat)
}

类似地,您可以返回Actormatarializer而不是物化流,并基于时间以外的某些外部条件关闭Actormatarializer。

当上游源不再具有任何数据来满足下游需求时,流应自然停止。因此,当发布者向下游发出完成信号时,这个物化流实例应该停止。或者,如果你有一个长时间运行的流程,你可以考虑使用单独的物件,然后在材质上调用<代码>关闭()/代码>,因为源是一个发布者,它可以是一个无限流(在我的例子中它是卡夫卡的流),它永远不会完成。您能否从下游
流访问
订阅
,以便取消订阅?您的
Publisher
的impl类是什么?我只有
Publisher
界面。我使用的是来自的
反应式卡夫卡
,遇到的困难是尝试使用卡夫卡事件流,然后我想以某种方式取消订阅该流。反应式卡夫卡的最新版本(0.8.1)提供了使用
cancel()方法关闭源发布者的支持
并解决此特定库的此问题。不过,我仍然有兴趣找到一种方法,如何在所有akka流中通用地实现这一点。我发现为每一个流创建一个新的actor系统效率很低。在我的场景中,我使用akka streams订阅ApacheKafka主题,这需要多个流,并且需要大量资源(每个主题都有一个线程池)如果我使用您的建议,我使用的是
Materializer
接口,而不是
actormatarializer
,并且没有在接口上找到关机方法。谢谢