/groovy/akka/akka-http/websocket_sample/sample.groovy

https://github.com/fits/try_samples · Groovy · 69 lines · 58 code · 11 blank · 0 comment · 3 complexity · 84f3e0d7674f5fe1ff2dc21882d778c0 MD5 · raw file

  1. @Grab('com.typesafe.akka:akka-http_2.12:10.0.10')
  2. import akka.japi.JavaPartialFunction
  3. import akka.actor.*
  4. import akka.http.javadsl.*
  5. import akka.http.javadsl.server.AllDirectives
  6. import akka.http.javadsl.model.ws.*
  7. import akka.stream.ActorMaterializer
  8. import akka.stream.javadsl.Flow
  9. class Util {
  10. static def websocketFlow(String name) {
  11. Flow.create().collect(new JavaPartialFunction<Message, Message>() {
  12. Message apply(Message msg, boolean isCheck) {
  13. println "*** receive ${msg}, ${isCheck}"
  14. if (isCheck) return null
  15. if (msg.isStrict()) {
  16. TextMessage.create("${name}: ${msg.strictText}")
  17. }
  18. else {
  19. throw noMatch()
  20. }
  21. }
  22. })
  23. }
  24. }
  25. class SampleRoute extends AllDirectives {
  26. def createRoute() {
  27. route(
  28. get {
  29. pathSingleSlash {
  30. getFromResource('index.html')
  31. }
  32. },
  33. get {
  34. path('sample') {
  35. parameter('name') { name ->
  36. handleWebSocketMessages(Util.websocketFlow(name))
  37. }
  38. }
  39. }
  40. )
  41. }
  42. }
  43. def system = ActorSystem.create("sample")
  44. def mat = ActorMaterializer.create(system)
  45. def http = Http.get(system)
  46. def routeFlow = new SampleRoute().createRoute().flow(system, mat)
  47. def binding = http.bindAndHandle(
  48. routeFlow,
  49. ConnectHttp.toHost('localhost', 8080),
  50. mat
  51. )
  52. println 'start ...'
  53. System.in.read()
  54. binding.thenCompose {
  55. it.unbind()
  56. }.thenAccept {
  57. system.terminate()
  58. }