/src/main/scala/com/github/vmencik/akkanative/Main.scala

https://github.com/vmencik/akka-graal-native · Scala · 69 lines · 57 code · 12 blank · 0 comment · 0 complexity · 15cc362ab991e4027c2212458a98249a MD5 · raw file

  1. package com.github.vmencik.akkanative
  2. import java.util.logging.LogManager
  3. import akka.actor.ActorSystem
  4. import akka.http.scaladsl.Http
  5. import akka.http.scaladsl.model.{HttpRequest, StatusCodes}
  6. import akka.http.scaladsl.server.Directives._
  7. import akka.stream.{ActorMaterializer, Materializer}
  8. import com.typesafe.config.ConfigFactory
  9. import com.typesafe.scalalogging.LazyLogging
  10. import scala.concurrent.{ExecutionContext, Future}
  11. import scala.util.Success
  12. object Main extends LazyLogging {
  13. def main(args: Array[String]): Unit = {
  14. configureLogging()
  15. val config = ConfigFactory.load()
  16. implicit val system: ActorSystem = ActorSystem("graal", config)
  17. implicit val materializer: Materializer = ActorMaterializer()
  18. implicit val ec: ExecutionContext = system.dispatcher
  19. val route =
  20. path("graal-hp-size") {
  21. get {
  22. onSuccess(graalHomepageSize) { size =>
  23. complete(size.toString)
  24. }
  25. }
  26. }
  27. Http()
  28. .bindAndHandle(route,
  29. config.getString("http.service.bind-to"),
  30. config.getInt("http.service.port"))
  31. .andThen {
  32. case Success(binding) => logger.info(s"Listening at ${binding.localAddress}")
  33. }
  34. }
  35. private def graalHomepageSize(implicit ec: ExecutionContext,
  36. system: ActorSystem,
  37. mat: Materializer): Future[Int] =
  38. Http().singleRequest(HttpRequest(uri = "https://www.graalvm.org")).flatMap { resp =>
  39. resp.status match {
  40. case StatusCodes.OK =>
  41. resp.entity.dataBytes.runFold(0) { (cnt, chunk) =>
  42. cnt + chunk.size
  43. }
  44. case other =>
  45. resp.discardEntityBytes()
  46. throw new IllegalStateException(s"Unexpected status code $other")
  47. }
  48. }
  49. private def configureLogging(): Unit = {
  50. val is = getClass.getResourceAsStream("/app.logging.properties")
  51. try {
  52. LogManager.getLogManager.reset()
  53. LogManager.getLogManager.readConfiguration(is)
  54. }
  55. finally is.close()
  56. }
  57. }