SDK хранилища больших двоичных объектов Azure: почему не работает асинхронный режим? - PullRequest
0 голосов
/ 10 апреля 2019

Я все еще использую Azure Storage Java SDK 10, и в нем используется реактивное программирование.Я написал следующий метод для асинхронной загрузки большого двоичного объекта в поток байтов как можно быстрее.Когда я использую синхронную версию (ниже), она работает правильно.Когда я закомментирую blockingAwait () и раскомментирую подписку, write и doOnComplete никогда не выполняются ... По сути, выполнение просто выпадает из нижней части метода обратно к вызывающей стороне.Я уверен, что допустил ошибку асинхронной обработки, и надеюсь, что кто-то может направить меня в правильном направлении.Кстати, я был удивлен, обнаружив, что очень мало примеров загрузки в поток, а не в файл ... Надеюсь, эта публикация поможет другим.

Спасибо за ваше время и интерес кмоя проблема ...

override fun downloadBlob(url: String, downloadStream: OutputStream) {

    BlockBlobURL(URL(url), pipeline)
            .download(null, null, false, null)
            .flatMapCompletable { response ->
                FlowableUtil.collectBytesInBuffer(response.body(null))
                        .map {
                            Channels.newChannel(downloadStream).write(it)
                        }.toCompletable()
            }.doOnComplete {
                println("The blob was downloaded...")
            }.blockingAwait()
            //.subscribe()
}

Вот код, вызывающий вышеуказанный метод:

fun getAerialImageBlobStream(aerialImageUrl: String): MapOutputStream {

    val aerialImageStream = MapOutputStream()
    blobStorage.downloadBlob(aerialImageUrl, aerialImageStream)
    return aerialImageStream
}
...