Акка Раковина никогда не закрывается

Я загружаю один файл на SFTP-сервер с помощью Alpakka, но после того, как файл загружен и я получил ответ об успешном завершении, приемник остается открытым, как его слить?

Я начал с этого:

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)

Но это заканчивается тем, что вы никогда не покидаете шаг карты. Я попытался добавить переключатель уничтожения, но, похоже, это не дало никакого эффекта (ни с выключением, ни с прерыванием):

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)

person spydon    schedule 26.10.2018    source источник
comment
Какие настройки вы использовали?   -  person Andrii Stefaniv    schedule 26.10.2018
comment
@AndriiStefaniv отредактировал мой вопрос, добавив настройки.   -  person spydon    schedule 26.10.2018
comment
Попробуйте поставить Await.result(result, Duration.Inf) в конце, чтобы заблокировать, пока поток не завершится. Вам не нужен KillSwitch.   -  person expert    schedule 26.10.2018
comment
Я не понимаю, как это поможет сделать его синхронным, но я попытался, и это работает. @expert, почему поток никогда не заканчивается без Away?   -  person spydon    schedule 26.10.2018
comment
Не могу больше редактировать комментарий: Подождите*   -  person spydon    schedule 26.10.2018
comment
Ааа я такой тупой. Вывод, который я ожидал после карты, очевидно, пришел раньше и исказил выходные данные отладки библиотек sftp. Что заставило меня думать, что карта не была сделана, так это то, что ActorSystem не была завершена, поэтому программа не завершилась. Спасибо всем за вашу помощь!   -  person spydon    schedule 26.10.2018


Ответы (2)


Попросив вас поставить Await.result(result, Duration.Inf) в конце, я хотел проверить теорию, высказанную А. Грегорисом. Таким образом, либо

  • ваше приложение закрывается до завершения Future или
  • (если ваше приложение не выходит) функция, в которой вы это делаете, отбрасывает result

Если ваше приложение не закрывается, вы можете попробовать использовать result.onComplete для выполнения необходимой работы.

person expert    schedule 26.10.2018
comment
Стоит также упомянуть, что путаница возникла из-за того, что я забыл завершить работу ActorSystem. - person spydon; 26.10.2018
comment
Ах да, тогда вы можете вызвать system.terminate в обработчике onComplete и предотвратить преждевременное завершение приложения, ожидая Await.result(system.whenTerminated, Duration.Inf) - person expert; 26.10.2018

Я не вижу весь ваш код, но мне кажется, что в опубликованном вами фрагменте значение result представляет собой будущее, которое не завершается до конца выполнения вашей программы, и это потому, что код в map тоже не выполняется.

person A. Gregoris    schedule 26.10.2018
comment
Это действительно Будущее, это Будущее[IOResult]. И код в map выполняется. - person spydon; 26.10.2018
comment
Я вижу, что ваш пользователь здесь новый, дружеский совет - используйте функцию комментариев, а не функцию ответа, прежде чем вы узнаете ответ, иначе вы, вероятно, получите отрицательные голоса. :) - person spydon; 26.10.2018