0

我正在使用 Alpakka 将单个文件上传到 SFTP 服务器,但是一旦文件上传并且我得到了成功响应,Sink 保持打开状态,我该如何排空它?

我从这个开始:

val sink = Sftp.toPath(path, settings, false)
val source = Source.single(ByteString(data))
​
source
  .viaMat(KillSwitches.single)(Keep.right)
  .toMat(sink)(Keep.both).run()
  .map(_.wasSuccessful)

但这最终永远不会离开地图步骤。我试图添加一个killswitch,但这似乎没有效果(无论是关闭还是中止):

val sink = Sftp.toPath(path, settings, false)
val source = Source.single(ByteString(data))
​
val (killswitch, result) = source
  .viaMat(KillSwitches.single)(Keep.right)
  .toMat(sink)(Keep.both).run()

result.map {
  killswitch.shutdown()
  _.wasSuccessful
}

我在做一些根本错误的事情吗?我只想要一个结果。

编辑发送到的设置toPath

SftpSettings(InetAddress.getByName(host))
    .withCredentials(FtpCredentials.create(amexUsername, amexPassword))
    .withStrictHostKeyChecking(false)
4

2 回答 2

2

通过要求你把Await.result(result, Duration.Inf)我想检查 A. Gregoris 所表达的理论。因此它要么

  • 您的应用在完成之前退出Future
  • (如果您的应用程序没有退出)您执行此操作的函数会丢弃result

如果您的应用程序没有退出,您可以尝试使用result.onComplete来做必要的工作。

于 2018-10-26T12:22:04.710 回答
1

我看不到您的整个代码,但在我看来,在您发布的代码片段中,该result值是一个 Future,在您的程序执行结束之前没有完成,那是因为其中的代码map也没有被执行。

于 2018-10-26T11:02:31.377 回答