Browse Source

spray: added json benchmark

Johannes Rudolph 12 years ago
parent
commit
21608632ef

+ 6 - 0
spray/.gitignore

@@ -0,0 +1,6 @@
+/project/.*
+/project/target
+/target
+/.project
+/.classpath
+/.cache

+ 0 - 0
spray/__init__.py


+ 12 - 0
spray/benchmark_config

@@ -0,0 +1,12 @@
+{
+    "framework" : "spray",
+    "tests" : [{
+        "default" : {
+            "setup_file" : "setup",
+            "json_url" : "/json",
+            "port": 8080,
+            "sort": 110
+            }
+        }
+    ]
+}

+ 26 - 0
spray/build.sbt

@@ -0,0 +1,26 @@
+import spray.revolver.RevolverPlugin.Revolver
+
+name := "spray-benchmark"
+
+organization := "io.spray"
+
+scalaVersion := "2.10.1"
+
+version := "1.0"
+
+resolvers ++= Seq(
+  "spray repo" at "http://repo.spray.io/",
+  "spray nightly repo" at "http://nightlies.spray.io/"
+)
+
+libraryDependencies ++= Seq(
+  "io.spray" %% "spray-json" % "1.2.4",
+  "io.spray" % "spray-can" % "1.1-20130513",
+  "com.typesafe.akka" %%  "akka-actor" % "2.1.2",
+  "com.typesafe.akka" %%  "akka-slf4j" % "2.1.2",
+  "ch.qos.logback"% "logback-classic" % "1.0.12" % "runtime"
+)
+
+Revolver.settings
+
+sbtassembly.Plugin.assemblySettings

+ 1 - 0
spray/project/build.properties

@@ -0,0 +1 @@
+sbt.version=0.12.3

+ 5 - 0
spray/project/plugins.sbt

@@ -0,0 +1,5 @@
+resolvers += "spray repo" at "http://repo.spray.io"
+
+addSbtPlugin("io.spray" % "sbt-revolver" % "0.6.2")
+
+addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.8.8")

+ 1 - 0
spray/sbt

@@ -0,0 +1 @@
+java  -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=384M -Dsbt.global.base=project/.sbtboot -Dsbt.boot.directory=project/.boot -Dsbt.ivy.home=project/.ivy -jar `dirname $0`/sbt-launch.jar "$@"

BIN
spray/sbt-launch.jar


+ 24 - 0
spray/setup.py

@@ -0,0 +1,24 @@
+
+import subprocess
+import sys
+import time
+import os
+
+def start(args=None):
+    subprocess.check_call("./sbt assembly", shell=True, cwd="spray")
+    subprocess.Popen("java -jar target/scala-2.10/spray-benchmark-assembly-1.0.jar", cwd="spray", shell=True)
+    time.sleep(5)
+    return 0
+
+def stop():
+  p = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE)
+  out, err = p.communicate()
+  for line in out.splitlines():
+    if 'spray-benchmark' in line:
+      try:
+        pid = int(line.split(None, 2)[1])
+        os.kill(pid, 9)
+      except OSError:
+        pass
+  
+  return 0

+ 28 - 0
spray/src/main/resources/application.conf

@@ -0,0 +1,28 @@
+akka {
+  loglevel = INFO
+  event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
+
+  actor {
+    default-dispatcher {
+      fork-join-executor {
+          # Min number of threads to cap factor-based parallelism number to
+          parallelism-min = 1
+          parallelism-factor = 1
+      }
+    }
+  }
+}
+
+# check the reference.conf in spray-can/src/main/resources for all defined settings
+spray.can.server {
+  pipelining-limit = disabled
+  reaping-cycle = infinite
+  request-chunk-aggregation-limit = 0
+  stats-support = off
+  response-size-hint = 192
+}
+
+app {
+  interface = "0.0.0.0"
+  port = 8080
+}

+ 15 - 0
spray/src/main/resources/logback.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <target>System.out</target>
+        <encoder>
+            <pattern>%date{MM/dd HH:mm:ss.SSS} %-5level[%.15thread] %logger{1} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <root level="INFO">
+        <appender-ref ref="CONSOLE"/>
+    </root>
+
+</configuration>

+ 48 - 0
spray/src/main/scala/spray/examples/BenchmarkService.scala

@@ -0,0 +1,48 @@
+package spray.examples
+
+import akka.actor._
+import scala.concurrent.duration._
+import spray.can.Http
+import spray.json._
+import spray.http._
+import MediaTypes._
+import HttpMethods._
+import StatusCodes._
+
+class BenchmarkService extends Actor {
+  import context.dispatcher
+  import Uri._
+  import Uri.Path._
+
+  def fastPath: Http.FastPath = {
+    case HttpRequest(GET, Uri(_, _, Slash(Segment("json", Path.Empty)), _, _), _, _, _) =>
+      val json = JsObject("message" -> JsString("Hello, World!"))
+      HttpResponse(entity = HttpEntity(ContentType.`application/json`, json.compactPrint))
+  }
+
+  def receive = {
+    // when a new connection comes in we register ourselves as the connection handler
+    case _: Http.Connected => sender ! Http.Register(self, fastPath = fastPath)
+
+    case HttpRequest(GET, Path("/"), _, _, _) => sender ! HttpResponse(
+      entity = HttpEntity(MediaTypes.`text/html`,
+        <html>
+          <body>
+            <h1>Tiny <i>spray-can</i> benchmark server</h1>
+            <p>Defined resources:</p>
+            <ul>
+              <li><a href="/json">/json</a></li>
+              <li><a href="/stop">/stop</a></li>
+            </ul>
+          </body>
+        </html>.toString()
+      )
+    )
+
+    case HttpRequest(GET, Path("/stop"), _, _, _) =>
+      sender ! HttpResponse(entity = "Shutting down in 1 second ...")
+      context.system.scheduler.scheduleOnce(1.second) { context.system.shutdown() }
+
+    case _: HttpRequest => sender ! HttpResponse(NotFound, entity = "Unknown resource!")
+  }
+}

+ 17 - 0
spray/src/main/scala/spray/examples/Main.scala

@@ -0,0 +1,17 @@
+package spray.examples
+
+import akka.actor._
+import akka.io.IO
+import spray.can.Http
+
+object Main extends App {
+
+  implicit val system = ActorSystem()
+
+  // the handler actor replies to incoming HttpRequests
+  val handler = system.actorOf(Props[BenchmarkService], name = "handler")
+
+  val interface = system.settings.config.getString("app.interface")
+  val port = system.settings.config.getInt("app.port")
+  IO(Http) ! Http.Bind(handler, interface, port)
+}