繁体   English   中英

Azure Java SDK v12不会异步下载文件

[英]Azure Java SDK v12 is not downloading a file asynchronously

我正在编写使用Java 12 Azure存储SDK从Azure Blob存储下载图像的快速概念验证。 当我将其转换为同步时,以下代码可以正常工作。 但是,尽管代码底部有subscribe(),但我只看到订阅消息。 成功和错误处理程序不会触发。 我将不胜感激任何建议或想法。

感谢您的时间和帮助。

private fun azureReactorDownload() {

    var startTime = 0L
    var accountName = "abcd"
    var key = "09sd0908sd08f0s&&6^%"
    var endpoint = "https://${accountName}.blob.core.windows.net/$accountName
    var containerName = "mycontainer"
    var blobName = "animage.jpg"

    // Get the Blob Service client, so we can use it to access blobs, containers, etc.
    BlobServiceClientBuilder()
        // Container URL
        .endpoint(endpoint)
        .credential(
            SharedKeyCredential(
                accountName,
                key
            )
        )
        .buildAsyncClient()

        // Get the container client so we can work with our container and its blobs.
        .getContainerAsyncClient(containerName)

        // Get the block blob client so we can access individual blobs and include the path
        // within the container as part of the filename.
        .getBlockBlobAsyncClient(blobName)

        // Initiate the download of the desired blob.
        .download()
        .map { response ->
            // Drill down to the ByteBuffer.
            response.value()
        }
        .doOnSubscribe {
            println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Subscription arrived.")
            startTime = System.currentTimeMillis()
        }
        .doOnSuccess { data ->
            data.map { byteBuffer ->
                println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> READY TO WRITE TO THE FILE")
                byteBuffer.writeToFile("/tmp/azrxblobdownload.jpg")
                val elapsedTime = System.currentTimeMillis() - startTime
                println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Finished downloading blob in $elapsedTime ms.")
            }
        }
        .doOnError {
            println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Failed to download blob: ${it.localizedMessage}")
        }

        .subscribe()
}

fun ByteBuffer.writeToFile(path: String) {
    val fc = FileOutputStream(path).channel
    fc.write(this)
    fc.close()
}

我看到有人在4个月前问同样的问题,但没有得到答案:

Azure Blob存储Java SDK:为什么异步不起作用?

我猜想JDK的这一部分现在无法正常工作。 我不建议使用Azure的Java版本。

您应该能够以另一种方式完成此操作,可能是以下答案之一: 在Java中并行或异步下载多个文件

我已经与Microsoft合作,并在以下链接中提供了有据可查的解决方案: https : //github.com/Azure/azure-sdk-for-java/issues/5071 和我一起工作的人提供了很好的背景信息,所以它不仅仅是一些工作代码。

我已经与Microsoft针对Azure Java SDK v12中的downloadToFile()方法打开了一个类似的查询,该查询在保存到文件时会引发异常。

这是该发布中的工作代码:

private fun azureReactorDownloadMS() {

    var startTime = 0L

    val chunkCounter = AtomicInteger(0)

    // Get the Blob Service client, so we can use it to access blobs, containers, etc.
    val aa = BlobServiceClientBuilder()
        // Container URL
        .endpoint(kEndpoint)
        .credential(
            SharedKeyCredential(
                kAccountName,
                kAccountKey
            )
        )
        .buildAsyncClient()

        // Get the container client so we can work with our container and its blobs.
        .getContainerAsyncClient(kContainerName)

        // Get the block blob client so we can access individual blobs and include the path
        // within the container as part of the filename.
        .getBlockBlobAsyncClient(kBlobName)
        .download()
        // Response<Flux<ByteBuffer>> to Flux<ByteBuffer>
        .flatMapMany { response ->
            response.value()
        }
        .doOnSubscribe {
            println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Subscription arrived.")
            startTime = System.currentTimeMillis()
        }
        .doOnNext { byteBuffer ->
            println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> CHUNK ${chunkCounter.incrementAndGet()} FROM BLOB ARRIVED...")
        }
        .doOnComplete {
            val elapsedTime = System.currentTimeMillis() - startTime
            println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Finished downloading ${chunkCounter.incrementAndGet()} chunks of data for the blob in $elapsedTime ms.")
        }
        .doOnError {
            println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Failed to download blob: ${it.localizedMessage}")
        }

        .blockLast()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM