【问题标题】:Identifying the origin of byte arrays in a reactive chain in Project Reactor在 Project Reactor 中识别反应链中字节数组的来源
【发布时间】:2018-10-28 21:20:53
【问题描述】:

我正在从 3 张灰度图像构建彩色图像。我使用 rsocket 为每个色带发出 3 个单独的(并行)请求,它返回一个 Mono<byte[]>。我需要将所有 3 字节数组收集为一个列表,以便我可以正确构建图像。但是,我对如何在下一个反应操作中识别字节数组属于哪个波段感到困惑。

这里是一些示例代码:

 return Flux.just(redRequest, blueRequest, greenRequest)
                .parallel()
                .flatMap(client::getBytes) // calls the remote service to get the bytes for the given color band
                .sequential()
                .collectList()
                .map(response -> {
                   byte[] redBytes = response.get(0); //???
                }

我创建了一个包装类来保存原始请求、字节数组和带标识符,这样我就可以在每个操作中传递所有对象,但是因为我的 rsocket 客户端的响应是 Mono,我只能实现(可能错误的术语)通过在 map 或 flatMap 中调用字节数组,此时我无法访问我的包装类,并且我不确定字节数组属于哪个波段。

我可以通过简单地不在并行请求中调用客户端来解决此问题吗?我是否可以保证项目将按照我在Flux.just() 中定义的顺序通过链传播。

基本上上一张图,我只是很想知道哪个字节数组属于哪个色带。

【问题讨论】:

    标签: java spring reactive-programming project-reactor reactor


    【解决方案1】:

    用颜色字段包装对象中的每个请求,并更改发送这些请求的管道中的 flatMap 部分:

    Flux.just(
      new Request(redRequest, RED),
      new Request(blueRequest, BLUE),
      new Request(greenRequest, GREEN)
    )
    .parallel()
    .flatMap(request -> 
      client.getBytes(request)
        .map(response -> new Response(response.get(0), request.color))
    )
    .sequential()
    .collectList()
    .map(response -> {
      byte[] redBytes = response.bytes;
      Color color = response.color;
      // 
    })
    

    【讨论】:

    • 非常简单优雅的解决方案。事实上,我已经创建了一个包装器类作为我的解决方案的一部分,但是只需在来自客户端方法的响应上调用映射操作来访问字节并将它们设置在包装器上正是我所需要的。谢谢!
    猜你喜欢
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    相关资源
    最近更新 更多