Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Spring5WebFlux框架解码ByteArray_Spring_Kotlin_Project Reactor_Spring Webflux - Fatal编程技术网

使用Spring5WebFlux框架解码ByteArray

使用Spring5WebFlux框架解码ByteArray,spring,kotlin,project-reactor,spring-webflux,Spring,Kotlin,Project Reactor,Spring Webflux,我正在尝试将新的SpringWebFlux框架与kotlin一起使用。我找不到这段代码的错误之处(myService): fun foo():通量{ val client=WebClient.create(“http://byte-array-service") 返回客户端 .get() .uri(“/info”) .accept(MediaType.APPLICATION\u八位字节\u流) .exchange() flatMapMany先生{ r->r.bodyToFlux(ByteArra

我正在尝试将新的SpringWebFlux框架与kotlin一起使用。我找不到这段代码的错误之处(myService):

fun foo():通量{
val client=WebClient.create(“http://byte-array-service")
返回客户端
.get()
.uri(“/info”)
.accept(MediaType.APPLICATION\u八位字节\u流)
.exchange()
flatMapMany先生{
r->r.bodyToFlux(ByteArray::class.java)
}
}
这个方法返回7893字节的流量,我知道字节数组服务并不是发送所有字节。如果我使用老式的rest模板,一切都可以

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)
}
fun foo():通量{
val rt=RestTemplate()
rt.messageConverters.add(
ByteArrayHttpMessageConverter())
val headers=HttpHeaders()
headers.accept=listOf(MediaType.APPLICATION\u OCTET\u STREAM)
val实体=HttpEntity(标题)
val r=rt.exchange(“http://byte-array-service/info,HttpMethod.GET,entity,ByteArray::class.java)
返回通量。刚(右阀体)
}
它返回从字节数组服务发送的所有274124字节

这是我的消费者

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

    return Mono.from(myService
            .foo()
            .flatMap {
                accepted().body(fromObject(it.size))
            })
}
fun-doreadfromtearrayservice(请求:ServerRequest):Mono{
从(myService)返回Mono.from
.foo()
.平面图{
已接受().body(fromObject(it.size))
})
}

如果我正确理解了你的问题,你只需要向前传递流量,这应该是可行的。我在自己的环境中测试了它,读取所有字节都没有问题

要获取字节,请执行以下操作:

fun foo(): Flux<ByteArray> =
    WebClient.create("http://byte-array-service")
        .get()
        .uri("/info")
        .accept(MediaType.APPLICATION_OCTET_STREAM)
        .retrieve()
        .bodyToFlux(ByteArray::class.java)
fun foo():通量=
WebClient.create(“http://byte-array-service")
.get()
.uri(“/info”)
.accept(MediaType.APPLICATION\u八位字节\u流)
.retrieve()
.bodyToFlux(ByteArray::class.java)
返回带有响应的字节:

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

因此,在其他一些函数中,如果您试图使用该流量中的数据,则只能读取7893字节。是吗?您是否可以尝试改用Spring的
DataBuffer
类型?从中提取字节数组很容易,您可以利用其中有趣的属性(如零拷贝和缓冲池)。@Orest是的,您可以correct@BrianClozel结果是相同的=(只有7893个字节可用)available@PavelVarchenko你能不能也提供售后服务?
fun doReadFromByteArrayService(req: ServerRequest): Mono<ServerResponse> =
        ServerResponse.ok().body(foo())