Browse Source

Merge pull request #1956 from fiadliel/http4s_update

http4s: Fix DB connections, bump versions, use circe JSON library
Mike Smith 9 years ago
parent
commit
c1d04f80c6

+ 10 - 13
frameworks/Scala/http4s/build.sbt

@@ -10,27 +10,24 @@ TwirlKeys.templateImports += "http4s.techempower.benchmark._"
 
 
 com.github.retronym.SbtOneJar.oneJarSettings
 com.github.retronym.SbtOneJar.oneJarSettings
 
 
-val http4sVersion = "0.10.1"
-val doobieVersion = "0.2.3-RC2"
-val scalazVersion = "7.1.3"
+val http4sVersion = "0.11.3"
+val circeVersion = "0.3.0"
+val doobieVersion = "0.2.3"
 
 
 libraryDependencies ++= Seq(
 libraryDependencies ++= Seq(
 	"org.http4s" %% "http4s-blaze-server" % http4sVersion,
 	"org.http4s" %% "http4s-blaze-server" % http4sVersion,
 	"org.http4s" %% "http4s-dsl" % http4sVersion,
 	"org.http4s" %% "http4s-dsl" % http4sVersion,
-	"org.http4s" %% "http4s-argonaut" % http4sVersion,
+	"org.http4s" %% "http4s-circe" % http4sVersion,
 	"org.http4s" %% "http4s-twirl" % http4sVersion,
 	"org.http4s" %% "http4s-twirl" % http4sVersion,
+	"io.circe" %% "circe-core" % circeVersion,
+	"io.circe" %% "circe-generic" % circeVersion,
+	"io.circe" %% "circe-parser" % circeVersion,
 	"org.tpolecat" %% "doobie-core" % doobieVersion,
 	"org.tpolecat" %% "doobie-core" % doobieVersion,
-	"org.tpolecat" %% "doobie-contrib-hikari" % doobieVersion,
+	"org.tpolecat" %% "doobie-contrib-hikari" % doobieVersion exclude("com.zaxxer", "HikariCP-java6"),
 	"com.zaxxer" %  "HikariCP" % "2.4.1",
 	"com.zaxxer" %  "HikariCP" % "2.4.1",
-	"org.scalaz" %% "scalaz-core" % scalazVersion,
-	"org.scalaz" %% "scalaz-concurrent" % scalazVersion,
-	"com.github.alexarchambault" %% "argonaut-shapeless_6.1" % "0.3.1",
-	"org.postgresql" % "postgresql" % "9.4.1208"
+	"org.postgresql" % "postgresql" % "9.4.1208",
+	"ch.qos.logback" % "logback-classic" % "1.1.6"
 )
 )
 
 
 mainClass in oneJar := Some("http4s.techempower.benchmark.WebServer")
 mainClass in oneJar := Some("http4s.techempower.benchmark.WebServer")
 
 
-resolvers ++= Seq(
-  "Scalaz Bintray Repo" at "http://dl.bintray.com/scalaz/releases",
-  "tpolecat" at "http://dl.bintray.com/tpolecat/maven"
-)

+ 1 - 1
frameworks/Scala/http4s/project/plugins.sbt

@@ -1,3 +1,3 @@
 addSbtPlugin("org.scala-sbt.plugins" % "sbt-onejar" % "0.8")
 addSbtPlugin("org.scala-sbt.plugins" % "sbt-onejar" % "0.8")
 
 
-addSbtPlugin("com.typesafe.sbt" % "sbt-twirl" % "1.0.4")
+addSbtPlugin("com.typesafe.sbt" % "sbt-twirl" % "1.1.1")

+ 1 - 1
frameworks/Scala/http4s/setup.sh

@@ -4,4 +4,4 @@ fw_depends java sbt
 
 
 sbt 'oneJar' -batch
 sbt 'oneJar' -batch
 
 
-java -jar target/scala-2.11/http4s*one-jar.jar &
+java -jar target/scala-2.11/http4s*one-jar.jar "${DBHOST}" &

+ 14 - 0
frameworks/Scala/http4s/src/main/resources/logback.xml

@@ -0,0 +1,14 @@
+<configuration>
+
+  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+    <!-- encoders are assigned the type
+         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
+    <encoder>
+      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+    </encoder>
+  </appender>
+
+  <root level="error">
+    <appender-ref ref="STDOUT" />
+  </root>
+</configuration>

+ 30 - 14
frameworks/Scala/http4s/src/main/scala/WebServer.scala

@@ -1,18 +1,20 @@
 package http4s.techempower.benchmark
 package http4s.techempower.benchmark
 
 
 import org.http4s._
 import org.http4s._
-import org.http4s.server._
+import org.http4s.circe._
 import org.http4s.dsl._
 import org.http4s.dsl._
-import org.http4s.argonaut._
+import org.http4s.server._
 import org.http4s.server.blaze.BlazeBuilder
 import org.http4s.server.blaze.BlazeBuilder
 import org.http4s.twirl._
 import org.http4s.twirl._
 import headers._
 import headers._
 
 
-import _root_.argonaut._, Argonaut._, Shapeless._
-
 import doobie.contrib.hikari.hikaritransactor._
 import doobie.contrib.hikari.hikaritransactor._
 import doobie.imports._
 import doobie.imports._
 
 
+import io.circe._
+import io.circe.generic.auto._
+import io.circe.syntax._
+
 import scalaz._
 import scalaz._
 import scalaz.concurrent.{Task, TaskApp}
 import scalaz.concurrent.{Task, TaskApp}
 import scalaz.std.list._
 import scalaz.std.list._
@@ -29,7 +31,6 @@ object Middleware {
     Service.lift { req: Request =>
     Service.lift { req: Request =>
       service.map { resp =>
       service.map { resp =>
         resp.putHeaders(
         resp.putHeaders(
-          headers.Date(DateTime.now),
           Header("Server", req.serverAddr)
           Header("Server", req.serverAddr)
         )
         )
       }.apply(req)
       }.apply(req)
@@ -54,8 +55,24 @@ object Queries extends OptionalValidatingQueryParamDecoderMatcher[Int]("queries"
 }
 }
 
 
 object WebServer extends TaskApp {
 object WebServer extends TaskApp {
-  def xaTask(host: String) =
-    HikariTransactor[Task]("org.postgresql.Driver", s"jdbc:postgresql://$host/hello_world", "benchmarkdbuser", "benchmarkdbpass")
+  implicit def jsonEncoder[A](implicit encoder: Encoder[A]) = jsonEncoderOf[A](encoder)
+
+  def xaTask(host: String) = {
+    val driver = "org.postgresql.Driver"
+    val url = s"jdbc:postgresql://$host/hello_world"
+    val user = "benchmarkdbuser"
+    val pass = "benchmarkdbpass"
+    val maxPoolSize = 256
+    val minIdle = 256
+
+    for {
+      xa <- HikariTransactor[Task](driver, url, user, pass)
+      _  <- xa.configure(ds => Task.delay {
+         ds.setMaximumPoolSize(maxPoolSize)
+         ds.setMinimumIdle(minIdle)
+      })
+    } yield xa
+  }
 
 
   // Provide a random number between 1 and 10000 (inclusive)
   // Provide a random number between 1 and 10000 (inclusive)
   val randomWorldId: Task[Int] = Task.delay(ThreadLocalRandom.current.nextInt(1, 10001))
   val randomWorldId: Task[Int] = Task.delay(ThreadLocalRandom.current.nextInt(1, 10001))
@@ -112,14 +129,14 @@ object WebServer extends TaskApp {
   // HTTP service definition
   // HTTP service definition
   def service(xa: Transactor[Task]) = HttpService {
   def service(xa: Transactor[Task]) = HttpService {
     case GET -> Root / "json" =>
     case GET -> Root / "json" =>
-      Ok(Json("message" -> jString("Hello, World!")))
+      Ok(Json.obj("message" -> Json.string("Hello, World!")))
 
 
     case GET -> Root / "db" =>
     case GET -> Root / "db" =>
-      Ok(selectRandomWorld(xa).map(_.asJson))
+      Ok(selectRandomWorld(xa))
 
 
     case GET -> Root / "queries" :? Queries(rawQueries) =>
     case GET -> Root / "queries" :? Queries(rawQueries) =>
       val numQueries = Queries.clampQueries(rawQueries)
       val numQueries = Queries.clampQueries(rawQueries)
-      Ok(getWorlds(xa, numQueries).map(_.asJson))
+      Ok(getWorlds(xa, numQueries))
 
 
     case GET -> Root / "fortunes" =>
     case GET -> Root / "fortunes" =>
       val page = for {
       val page = for {
@@ -138,7 +155,7 @@ object WebServer extends TaskApp {
         _ <- updateWorlds(xa, newWorlds)
         _ <- updateWorlds(xa, newWorlds)
       } yield newWorlds
       } yield newWorlds
 
 
-      Ok(updated.map(_.asJson))
+      Ok(updated)
 
 
     case GET -> Root / "plaintext" =>
     case GET -> Root / "plaintext" =>
       Ok("Hello, World!")
       Ok("Hello, World!")
@@ -156,10 +173,9 @@ object WebServer extends TaskApp {
   }
   }
 
 
   // Entry point when starting service
   // Entry point when starting service
-  override val runc: Task[Unit] = {
+  override def runl(args: List[String]): Task[Unit] = {
     for {
     for {
-      dbHost <- Task.delay(System.getProperty("DBHOST", "localhost"))
-      xa <- xaTask(dbHost)
+      xa <- xaTask(args.head)
       server <- startServer(Middleware.addHeaders(service(xa)))
       server <- startServer(Middleware.addHeaders(service(xa)))
     } yield ()
     } yield ()
   }
   }