Spring WebFlux Webclient 作为 Mono 接收应用程序/八位字节流文件

2024-03-19

我正在 Kotlin 中制作一个小型 Spring WebFlux 应用程序的原型。该应用程序需要从远程 REST 端点获取 tar 存档并将其存储在本地磁盘上。听起来很简单。

我首先创建了一个集成测试,该测试启动 Spring 服务器和另一个 WebFlux 服务器,并使用一个为 tar 存档提供服务的模拟 REST 端点。

测试应该是这样的:

1)应用程序:获取mock-server/archive

2) 模拟服务器:响应状态为 200,正文中的 tar 存档作为类型附件

3)app:阻塞直到收到所有字节,然后解压并使用文件

我遇到的问题是,当我尝试将字节收集到ByteArray在应用程序上,它会永远阻止。

My mock-server/archive路由到以下函数:

fun serveArchive(request: ServerRequest): Mono<ServerResponse> {
    val tarFile = FileSystemResource(ARCHIVE_PATH)
    assert(tarFile.exists() && tarFile.isFile && tarFile.contentLength() != 0L)
    return ServerResponse
            .ok()
            .contentType(MediaType.APPLICATION_OCTET_STREAM)
            .contentLength(tarFile.contentLength())
            .header("Content-Disposition", "attachment; filename=\"$ARCHIVE_FNAME\"")
            .body(fromResource(tarFile))
}

然后我的应用程序使用以下内容调用它:

private fun retrieveArchive {
    client.get().uri(ARCHIVE_URL).accept(MediaType.APPLICATION_OCTET_STREAM)
            .exchange()
            .flatMap { response ->
                storeArchive(response.bodyToMono())
            }.subscribe()
}

private fun storeArchive(archive: Mono<ByteArrayResource>): Mono<Void> {
    val archiveContentBytes = archive.block() // <- this blocks forever
    val archiveContents = TarArchiveInputStream(archiveContentBytes.inputStream)
    // read archive
}

我见过如何最好地从 Spring WebClient 的 ClientResponse 获取字节数组? https://stackoverflow.com/questions/44821187/how-to-best-get-a-byte-array-from-a-clientresponse-from-spring-webclient这就是为什么我尝试使用ByteArrayResource.

当我经历一切时,我看到serveArchive似乎正在工作(断言语句表示我传递的文件存在并且其中有一些字节)。在retrieveArchive我得到了 200 并且可以在.headers(内容类型、内容长度看起来都不错)。当我静下​​心来storeArchive并尝试使用以下命令从 Mono 检索字节block,它只是永远阻塞。

我完全不知道如何调试这样的东西。


您只需从flatMap所以它从Mono<T> to T:

client.get().uri(ARCHIVE_URL).accept(MediaType.APPLICATION_OCTET_STREAM)
            .exchange()
            .flatMap { response ->
                response.bodyToMono(ByteArrayResource::class.java)
            }
            .map { archiveContentBytes ->
                archiveContentBytes.inputStream
            }
            .doOnSuccess { inputStream ->
                //here is you code to do anything with the inputStream
                val archiveContents = TarArchiveInputStream(inputStream)
            }
            .subscribe()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring WebFlux Webclient 作为 Mono 接收应用程序/八位字节流文件 的相关文章

随机推荐

  • 在批处理和 VBS 混合中使用变量

    This thread https stackoverflow com questions 9074476 is it possible to embed and execute vbscript within a batch file w
  • Boost.Asio安装问题

    我已经使用 bjam install 安装了 boost 库 但是当我编译程序时 include boost asio hpp int main return 0 出现此类错误 tmp ccVR3eeF o In function stat
  • 虚拟化页表的工作原理

    阅读有关虚拟化页表概念的内容 其中部分页表放入虚拟内存中 维基百科 https en wikipedia org wiki Page table Virtualized page table以及 Patterson 和 Hennessy 页
  • ExecutorService,如何等待所有任务完成

    等待所有任务的最简单方法是什么ExecutorService完成 我的任务主要是计算 所以我只想运行大量作业 每个核心一个 现在我的设置如下所示 ExecutorService es Executors newFixedThreadPool
  • 如何将 NSDate 对象设置为午夜?

    我有一个NSDate对象 我想将其设置为任意时间 例如午夜 以便我可以使用timeIntervalSince1970一致检索数据的功能 无需担心时间when对象已创建 我尝试过使用NSCalendar并使用一些 Objective C 方法
  • 同构弦

    给定两个字符串 s 和 t 确定它们是否同构 如果 s 中的字符可以替换得到 t 则两个字符串是同构的 所有出现的字符都必须替换为另一个字符 同时保留字符的顺序 任何两个字符都不能映射到同一个字符 但一个字符可以映射到其自身 例如 给定 e
  • 如何在magento中调用另一个动作?

    是否可以在magento中调用另一个动作 例如 让我们考虑两种操作方法 添加动作 更新操作 调用 addAction 时是否可以实际调用 updateAction 谢谢 巴兰 您可以进行转发 例如 public function addAc
  • Objective-C 中的自动解析库 - [自动 XML/JSON 到对象转换]

    Objective C 中是否有一个我可以在 iPhone 中使用的库 在其中我可以提前告诉库这些标签应该在 xml 文件中出现 然后该库会自动为我解析它并给我一个 NSDictionary 数组作为回报或类似的东西 简而言之 我正在寻找一
  • 为什么本机 python 列表上的 for 循环比 numpy 数组上的 for 循环更快

    我正在阅读介绍 numpy 的章节高性能Python并在我自己的计算机上使用了代码 我无意中用 for 循环运行了 numpy 版本 发现与本机 python 循环相比 结果出奇地慢 代码的简化版本如下 其中我定义了一个值为 0 的二维数组
  • 如何使用 Chrome 扩展程序阻止某些网站?

    我正在为一个项目制作一个简单的 chrome 扩展 我正在制作一个扩展程序来阻止某些 URL 社交媒体等 以使学习更加高效 我不太擅长JS 但我想学习 我有一些想法 也许它可以阻止网站 或者只是在 div 中绘制一些内容来阻止其内容 另外
  • 如何设置PDF页眉的高度?

    有谁知道如何设置生成的pdf中标题的高度
  • x64应用程序访问mdb数据库

    我有一个应用程序需要在x64平台下构建 我需要访问 mdb文件 我所说的访问是指插入 删除或更新数据库 我在使用 Jet OLE db 和 ODBC 驱动程序时遇到问题 对于 OLE db 它显示 Jet Oledb 未注册 驱动程序和应用
  • Haskell 的全功能 CSV 解析器?

    任何人都可以推荐一种解析 CSV 文件的方法 其中包含以下选项 设置单元格 字段分隔符 设置记录结尾 行终止符 为字段设置引号字符 支持 UTF 8 字符串 能够将内存中的 CSV 结构写回文件 我确实尝试过 Text CSV 但它非常简单
  • D3 力向图添加新节点导致 x & y 为 NaN

    当我单击一个节点时 我希望向其中添加一个新节点 它们都应该有标签 我正在尝试构建同义词库可视化 我对 D3 还很陌生 所以如果您需要更详细地解释一些事情 我深表歉意 到目前为止 这是我的代码 var width 960 var height
  • 如何防止在 C# 中手动输入组合框

    我有一个 C 表单 它使用ComboBox 如何防止用户手动输入文本ComboBox in C this comboBoxType Font new System Drawing Font Arial 15 75F this comboBo
  • 未调用 UIManagedDocument saveToURL finishHandler - 错误消息:“不允许读者访问该 URL。”

    我有一个旧的应用程序使用UIManagedDocument与核心数据交互 然而 在 iOS 11 2 可能还有更早的 iOS 11 版本 上saveToURL forSaveOperation completionHandler 方法似乎已
  • 将文件扩展名与程序关联

    我知道怎么做 而且我去过http www codeproject com KB vb VBFileAssociation aspx http www codeproject com KB vb VBFileAssociation aspx前
  • 在python中将pdf转换为docx格式

    请问如何将pdf转换为docx 我尝试使用 pdfminer 转换为 html 来提取文本 但看起来仍然不够好 pdf2docx 安装pdf2docx包点击here https github com dothinking pdf2docx
  • Dialogflow动态实体问题

    我正在尝试使用 Dialogflow api ai 创建一个 Actions on Google 应用程序 我需要获取火车状态 所以我的实体将是火车号码或火车名称 火车的名字有很多 所以我无法手动添加实体值 如何将实体值动态添加到控制台 您
  • Spring WebFlux Webclient 作为 Mono 接收应用程序/八位字节流文件

    我正在 Kotlin 中制作一个小型 Spring WebFlux 应用程序的原型 该应用程序需要从远程 REST 端点获取 tar 存档并将其存储在本地磁盘上 听起来很简单 我首先创建了一个集成测试 该测试启动 Spring 服务器和另一