Sandymcp
10/06/2021, 9:01 AMfun testDataGenerator(sse: Sse, start: Long = 0, delay: Long = 0, dataSource: (sequence: Int) -> SseMessage) {
<http://logger.info|logger.info> { "Request from ${sse.connectRequest.uri}" }
val closed = AtomicBoolean(false)
sse.onClose { <http://logger.info|logger.info> { "Response body closed by client"; closed.set(true) } }
Thread.sleep(start)
for (i in 1..Int.MAX_VALUE) {
if (closed.get())
break
try {
val m = dataSource(i)
if (m.event == null) {
sse.send(Data(data = m.data.joinToString(" ")))
} else {
sse.send(Event(event = m.event!!, data = m.data.joinToString(" "), id = m.id))
}
logger.debug { "sent ${Clock.System.now().toEpochMilliseconds()}" }
Thread.sleep(delay)
} catch (_: EOFException) {
<http://logger.info|logger.info> { "Response body closed by client" }
break
} catch (e: Throwable) {
logger.error(e) { "Unexpected error writing to response body" }
break
}
}
}
dave
10/07/2021, 8:05 AMimport org.http4k.routing.bind
import org.http4k.routing.sse
import org.http4k.server.PolyHandler
import org.http4k.server.Undertow
import org.http4k.server.asServer
import org.http4k.sse.Sse
import org.http4k.sse.SseMessage
import kotlin.concurrent.thread
fun main() {
PolyHandler(sse = sse(
"/" bind { sse: Sse ->
thread {
for (i in 1..Int.MAX_VALUE) {
sse.send(SseMessage.Data("hello -> $i"))
}
}
}
)).asServer(Undertow(9000)).start()
}
How are you feeding events to the SSE? Looks like the setup function of the bind need to complete before any messages are sent (because of the blocking handler in undertow presumably)