使用Spring5WebFlux框架解码ByteArray
我正在尝试将新的SpringWebFlux框架与kotlin一起使用。我找不到这段代码的错误之处(myService):使用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
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())