【问题标题】:Decode ByteArray with spring 5 WebFlux framework使用 spring 5 WebFlux 框架解码 ByteArray
【发布时间】:2017-06-13 06:51:36
【问题描述】:

我正在尝试将新的 Spring WebFlux 框架与 kotlin 一起使用。而且我找不到这段代码有什么问题(myService):

fun foo(): Flux<ByteArray> {
    val client = WebClient.create("http://byte-array-service")
    return client
            .get()
            .uri("/info")
            .accept(MediaType.APPLICATION_OCTET_STREAM)
            .exchange()
            .flatMapMany {
                r -> r.bodyToFlux(ByteArray::class.java)
            }
}

此方法返回 7893 字节的 Flux,我知道 byte-array-service 发送的不是所有字节。如果我使用老式的休息模板一切都可以

fun foo(): Flux<ByteArray> {
    val rt = RestTemplate()
    rt.messageConverters.add(
            ByteArrayHttpMessageConverter())
    val headers = HttpHeaders()
    headers.accept = listOf(MediaType.APPLICATION_OCTET_STREAM)

    val entity = HttpEntity<String>(headers)
    val r = rt.exchange("http://byte-array-service/info", HttpMethod.GET,entity, ByteArray::class.java)
    return Flux.just(r.body)
}

它返回从 byte-array-service 发送的所有 274124 个字节

这是我的消费者

fun doReadFromByteArrayService(req: ServerRequest): Mono<ServerResponse> {

    return Mono.from(myService
            .foo()
            .flatMap {
                accepted().body(fromObject(it.size))
            })
}

【问题讨论】:

  • 因此,在您尝试使用 Flux 数据的其他函数中,您只能读取 7893 个字节,是吗?
  • 您可以尝试改用 Spring 的 DataBuffer 类型吗?从中提取字节数组很容易,您可以利用其中的有趣属性(如零拷贝和缓冲池)。
  • @Orest 是的,你是对的
  • @BrianClozel 结果是一样的 =( 只有 7893 字节可用
  • @PavelVarchenko 你能否也发布消费者功能?

标签: spring kotlin project-reactor spring-webflux


【解决方案1】:

如果我正确理解了您的问题,并且您只需要向前传递流量,那么这应该可行。我在自己的环境中对其进行了测试,读取所有字节没有问题。

获取字节:

fun foo(): Flux<ByteArray> =
    WebClient.create("http://byte-array-service")
        .get()
        .uri("/info")
        .accept(MediaType.APPLICATION_OCTET_STREAM)
        .retrieve()
        .bodyToFlux(ByteArray::class.java)

返回字节和响应:

fun doReadFromByteArrayService(req: ServerRequest): Mono<ServerResponse> =
        ServerResponse.ok().body(foo())  

【讨论】:

    猜你喜欢
    • 2020-11-30
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2021-10-11
    • 2018-04-09
    • 2018-08-09
    • 1970-01-01
    相关资源
    最近更新 更多