Search code examples
scalaakkaakka-streamalpakka

Akka Sink never closes


I am uploading a single file to an SFTP server using Alpakka but once the file is uploaded and I have gotten the success response the Sink stays open, how do I drain it?

I started off with this:

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)

But that ends up never leaving the map step. I tried to add a killswitch, but that seems to have had no effect (neither with shutdown or abort):

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
}

Am I doing something fundamentally wrong? I just want one result.

EDIT The settings sent in to toPath:

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

Solution

  • By asking you to put Await.result(result, Duration.Inf) at the end I wanted to check the theory expressed by A. Gregoris. Thus it's either

    • your app exits before Future completes or
    • (if you app does't exit) function in which you do this discards result

    If your app doesn't exit you can try using result.onComplete to do necessary work.