2017-06-13 73 views
2

我試圖用kotlin使用新的Spring WebFlux框架。我找不到在哪裏我錯了,此代碼(爲myService):解碼ByteArray與春天5 WebFlux框架

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個字節,我知道有沒有被字節數組服務發送的所有字節。如果我使用舊式休息模板一切正常

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) 
} 

返回從字節數組服務

這裏發出的所有274124個字節是我的消費者

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

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

所以,在你試圖從流量消耗數據的一些其他功能,您可以只讀7893字節是? –

+1

你可以嘗試使用Spring的'DataBuffer'類型嗎?從中提取字節數組很容易,並且可以利用它的有趣屬性(如零拷貝和緩衝池)。 –

+0

@Orest是的,你是正確的 –

回答

0

如果我明白你的問題正確的,你只需要提供助推器,這應該工作。我在自己的環境中測試了它,並且讀取所有字節時沒有問題。

要獲得字節:

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())