orirab
orirab

Reputation: 3343

Send multiple Fluxes with different types in one response

If I have code like so:

data class Response(
  val a: String,
  val b: List<String>,
  val c: Int,
)

fun buildResponse(): Response {
  val a: Mono<String> = getA()
  val b: Flux<String> = getB()
  val c: Mono<Int> = getC()

  return Response(
    a = a.blockOptional().orElseThrow(),
    b = b.collectList().blockOptional().orElseThrow(),
    c = c.blockOptional().orElseThrow(),
  )
}

Is there a way to reactively return a Mono<Response> instead of blocking and returning the actual Response?

Upvotes: 2

Views: 304

Answers (1)

Michael Berry
Michael Berry

Reputation: 72294

Sure - have a look at the Mono.zip operator, which will allow you to combine several publishers into a single Mono. The basic Mono.zip variants just return a tuple, but you can also specify your own class (Response in this case) as so:

return Mono.zip(
        Function { eles: Array<Any> ->
            Response(eles[0] as String,
                    eles[1] as List<String>,
                    eles[2] as Int)
        },
        a, b.collectList(), c)

Upvotes: 2

Related Questions