【问题标题】:Quarkus RestEasy reactive InputStream response using wrong writerQuarkus RestEasy 反应式 InputStream 响应使用错误的编写器
【发布时间】:2022-02-07 16:27:43
【问题描述】:

我尝试基于 Quarkus REST Score Console 优化音频文件的反应式端点流输入。我用 Reactive RestResponse 替换了通用 Response。它将分数提高到 100,但它现在使用的是 ServerStringMessageBodyHandler 而不是 ServerInputStreamMessageBodyHandler。有没有办法告诉 Quarkus 使用什么 MessageBodyHandler ?现在它在 inputStream 对象上调用 .toString() 方法。我试图直接返回ByteArray,但问题是一样的。知道这里出了什么问题吗?

@GET
@Path("/{lectureId}/stream")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
fun getLectureStreamById(
    @RestHeader("Range") rangeParam: String?,
    @RestPath lectureId: LectureId
): Uni<RestResponse<InputStream>> {
    return lectureAudioService.getAudioFile(lectureId).map { lectureStream ->
            downloadResponse(ByteArrayInputStream(lectureStream.data), filename = "$lectureId.mp3").build()
    }
}

fun downloadResponse(
    data: InputStream,
    filename: String,
): ResponseBuilder<InputStream> {
    return ResponseBuilder.ok(data)
        .header("Content-Disposition", "attachment;filename=$filename")
}

【问题讨论】:

    标签: response inputstream resteasy quarkus reactive


    【解决方案1】:

    根据github issue 中的回答,它应该在即将发布的版本中得到修复,但原始方法也不好,因为它阻塞了事件循环。更好的方法是:

    @Path("/{filename}/async-file")
    @GET
    @Produces(MediaType.APPLICATION_OCTET_STREAM)
    fun getAsyncFile(filename: String): Uni<RestResponse<AsyncFile>> {
        return Uni.createFrom().emitter { emitter: UniEmitter<in RestResponse<AsyncFile>> ->
            vertx.fileSystem().open(
                "$filename.mp3", OpenOptions()
            ) { result: AsyncResult<AsyncFile> ->
                if (result.succeeded()) emitter.complete(
                    ResponseBuilder.ok(result.result()).header("Content-Disposition", "attachment;filename=$filename.mp3").build()
                ) else emitter.fail(result.cause())
            }
        }
    }
    

    感谢@geoand

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 2023-02-13
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 2021-09-02
      相关资源
      最近更新 更多