@@ -20,6 +20,9 @@ import io.r2dbc.spi.ConnectionFactories
20
20
import io.r2dbc.spi.ConnectionFactory
21
21
import io.r2dbc.spi.ConnectionFactoryOptions
22
22
import kotlinx.coroutines.*
23
+ import kotlinx.coroutines.flow.*
24
+ import kotlinx.coroutines.reactive.asFlow
25
+ import kotlinx.coroutines.reactive.awaitFirst
23
26
import kotlinx.coroutines.reactive.awaitFirstOrNull
24
27
import kotlinx.html.*
25
28
import kotlinx.serialization.encodeToString
@@ -62,24 +65,21 @@ fun Application.main() {
62
65
call.respondText(Json .encodeToString(result), ContentType .Application .Json )
63
66
}
64
67
65
- suspend fun selectWorlds (queries : Int , random : Random ): List <World > = coroutineScope {
66
- val result = ArrayList <Deferred <World ?>>(queries)
67
-
68
+ fun selectWorlds (queries : Int , random : Random ): Flow <World > = flow {
68
69
repeat(queries) {
69
- val deferred = async {
70
- getWorld(dbConnFactory, random).awaitFirstOrNull()
71
- }
72
- result.add(deferred)
70
+ emit(getWorld(dbConnFactory, random).awaitFirst())
73
71
}
74
-
75
- result.awaitAll().filterNotNull()
76
72
}
77
73
78
74
get(" /queries" ) {
79
75
val queries = call.queries()
80
76
val random = Random .Default
81
77
82
- val result = selectWorlds(queries, random)
78
+ val result = buildList {
79
+ selectWorlds(queries, random).collect {
80
+ add(it)
81
+ }
82
+ }
83
83
84
84
call.respondText(Json .encodeToString(result), ContentType .Application .Json )
85
85
}
@@ -127,9 +127,14 @@ fun Application.main() {
127
127
val result = coroutineScope {
128
128
val worlds = selectWorlds(queries, random)
129
129
130
- worlds.forEach { it.randomNumber = random.nextInt(DB_ROWS ) + 1 }
130
+ val worldsUpdated = buildList {
131
+ worlds.collect {
132
+ it.randomNumber = random.nextInt(DB_ROWS ) + 1
133
+ add(it)
134
+ }
135
+ }
131
136
132
- val updateRequests = worlds .map { world ->
137
+ val updateRequests = worldsUpdated .map { world ->
133
138
Mono .usingWhen(dbConnFactory.create(), { connection ->
134
139
Mono .from(
135
140
connection.createStatement(UPDATE_QUERY ).bind(0 , world.randomNumber).bind(1 , world.id)
@@ -138,8 +143,8 @@ fun Application.main() {
138
143
}, Connection ::close)
139
144
}
140
145
141
- Flux .merge(updateRequests).collectList().awaitFirstOrNull ()
142
- worlds
146
+ Flux .merge(updateRequests).collectList().awaitFirst ()
147
+ worldsUpdated
143
148
}
144
149
145
150
call.respondText(Json .encodeToString(result), ContentType .Application .Json )
0 commit comments