Spring Boot Web Flux with JOOQ for interfacing with DB and Kotlin coroutines to make blocking JDBC calls run asynchronously. Now with rsockets.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

33 lines
1.4 KiB

  1. package com.example.demo.controller
  2. import io.vavr.collection.HashMap
  3. import io.vavr.collection.Map
  4. import kotlinx.coroutines.CompletableDeferred
  5. import kotlinx.coroutines.CoroutineScope
  6. import kotlinx.coroutines.ObsoleteCoroutinesApi
  7. import kotlinx.coroutines.channels.actor
  8. import org.springframework.messaging.rsocket.RSocketRequester
  9. // Message types for counterActor
  10. sealed class Message
  11. data class AddRequester(val requester: RSocketRequester, val clientId: String) : Message()
  12. data class RemoveRequester(val clientId: String) : Message()
  13. data class GetRequesters(val response: CompletableDeferred<Map<String, RSocketRequester>>) : Message()
  14. // This function launches a new rsocket actor
  15. @ObsoleteCoroutinesApi // Actor API is planned to be overhauled so this annotation is required for now
  16. fun CoroutineScope.rsocketActor() = actor<Message> {
  17. var requesterMap: Map<String, RSocketRequester> = HashMap.empty() // actor state
  18. for (msg in channel) { // iterate over incoming messages
  19. when (msg) {
  20. is AddRequester -> {
  21. println("Actor adding requester")
  22. requesterMap = requesterMap.put(msg.clientId, msg.requester)
  23. }
  24. is RemoveRequester -> {
  25. println("Actor removing requester")
  26. requesterMap = requesterMap.remove(msg.clientId)
  27. }
  28. is GetRequesters -> msg.response.complete(requesterMap)
  29. }
  30. }
  31. }