Browse Source

Merge pull request #369 from oleksiys/master

The Grizzly driver for Json and plain-text tests
michaelhixson 12 years ago
parent
commit
db769191f0

+ 31 - 0
grizzly-bm/README.md

@@ -0,0 +1,31 @@
+# Grizzly Benchmarking Test
+
+This is the Grizzly portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
+
+### Plain text serialization test
+* [Plain text test resource](src/main/java/org/glassfish/grizzly/bm/PlainTextHttpHandler.java)
+
+### JSON serialization test
+* [JSON test resource](src/main/java/org/glassfish/grizzly/bm/JsonHttpHandler.java)
+
+### Database tests
+* N/A
+
+### Fortunes test
+* N/A
+
+## Versions
+
+* [Java OpenJDK 1.7.0_09](http://openjdk.java.net/)
+* [Grizzly 2.3.3](http://grizzly.java.net/)
+* [Jackson 2.2.2](http://wiki.fasterxml.com/JacksonHome)
+
+## Test URLs
+
+### Plain text test
+
+    http://localhost:8080/plaintext
+
+### JSON serialization test
+
+    http://localhost:8080/json

+ 0 - 0
grizzly-bm/__init__.py


+ 12 - 0
grizzly-bm/benchmark_config

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

+ 85 - 0
grizzly-bm/pom.xml

@@ -0,0 +1,85 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.glassfish.grizzly.bm</groupId>
+    <artifactId>grizzly-bm</artifactId>
+    <version>0.1</version>
+    <packaging>jar</packaging>
+
+    <name>grizzly-bm</name>
+    <url>http://maven.apache.org</url>
+
+    <build>
+        <defaultGoal>install</defaultGoal>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+            </resource>
+        </resources>
+        <testResources>
+            <testResource>
+                <directory>src/test/resources</directory>
+            </testResource>
+        </testResources>
+        <plugins>
+            <plugin>
+                <inherited>true</inherited>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>2.3.2</version>
+                <configuration>
+                    <source>1.7</source>
+                    <target>1.7</target>
+                    <optimize>true</optimize>
+                    <debug>false</debug>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <mainClass>org.glassfish.grizzly.bm.Server</mainClass>
+                        </manifest>
+                    </archive>
+                    <descriptorRefs>
+                        <descriptorRef>jar-with-dependencies</descriptorRef>
+                    </descriptorRefs>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>make-assembly</id> <!-- this is used for inheritance merges -->
+                        <phase>package</phase> <!-- bind to the packaging phase -->
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+    
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.glassfish.grizzly</groupId>
+            <artifactId>grizzly-http-server</artifactId>
+            <version>2.3.4-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>2.2.2</version>
+        </dependency>
+    </dependencies>
+    <repositories>
+        <repository>
+            <id>grizzly-snapshots</id>
+            <url>https://maven.java.net/content/repositories/snapshots/</url>
+        </repository>
+    </repositories>
+</project>

+ 20 - 0
grizzly-bm/setup.py

@@ -0,0 +1,20 @@
+import subprocess
+import sys
+import setup_util
+import os
+
+def start(args):
+  try:
+    subprocess.check_call("mvn clean compile assembly:single", shell=True, cwd="grizzly-bm")
+    subprocess.Popen("java -jar grizzly-bm-0.1-jar-with-dependencies.jar".rsplit(" "), cwd="grizzly-bm/target")
+    return 0
+  except subprocess.CalledProcessError:
+    return 1
+def stop():
+  p = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE)
+  out, err = p.communicate()
+  for line in out.splitlines():
+    if 'grizzly-bm' in line:
+      pid = int(line.split(None, 2)[1])
+      os.kill(pid, 9)
+  return 0

+ 48 - 0
grizzly-bm/src/main/java/org/glassfish/grizzly/bm/JsonHttpHandler.java

@@ -0,0 +1,48 @@
+package org.glassfish.grizzly.bm;
+
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonGenerator;
+import java.io.IOException;
+import java.util.concurrent.ExecutorService;
+import org.glassfish.grizzly.http.server.HttpHandler;
+import org.glassfish.grizzly.http.server.Request;
+import org.glassfish.grizzly.http.server.Response;
+import org.glassfish.grizzly.http.util.Header;
+
+/**
+ * Json usecase
+ */
+public class JsonHttpHandler extends HttpHandler {
+
+    private final JsonFactory factory = new JsonFactory();
+
+    @Override
+    public void service(final Request request, final Response response)
+            throws Exception {
+        response.setContentType("application/json");
+        response.setHeader(Header.Server, Server.SERVER_VERSION);
+
+        JsonGenerator generator = null;
+
+        try {
+            generator = factory.createGenerator(response.getOutputStream());
+            generator.writeStartObject();
+            generator.writeStringField("message", "Hello, world");
+            generator.writeEndObject();
+        } catch (IOException e) {
+            throw new IllegalStateException(e);
+        } finally {
+            if (generator != null) {
+                try {
+                    generator.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+    }
+
+    @Override
+    protected ExecutorService getThreadPool(Request request) {
+        return null;
+    }
+}

+ 27 - 0
grizzly-bm/src/main/java/org/glassfish/grizzly/bm/PlainTextHttpHandler.java

@@ -0,0 +1,27 @@
+package org.glassfish.grizzly.bm;
+
+import java.util.concurrent.ExecutorService;
+import org.glassfish.grizzly.http.server.HttpHandler;
+import org.glassfish.grizzly.http.server.Request;
+import org.glassfish.grizzly.http.server.Response;
+import org.glassfish.grizzly.http.util.Header;
+
+/**
+ * Plain text usecase
+ */
+public class PlainTextHttpHandler extends HttpHandler {
+
+    @Override
+    public void service(final Request request, final Response response)
+            throws Exception {
+        response.setContentType("text/plain");
+        response.setCharacterEncoding("UTF-8");
+        response.setHeader(Header.Server, Server.SERVER_VERSION);
+        response.getWriter().write("Hello, World!");
+    }
+
+    @Override
+    protected ExecutorService getThreadPool(Request request) {
+        return null;
+    }
+}

+ 34 - 0
grizzly-bm/src/main/java/org/glassfish/grizzly/bm/RootHttpHandler.java

@@ -0,0 +1,34 @@
+package org.glassfish.grizzly.bm;
+
+import java.util.concurrent.ExecutorService;
+import org.glassfish.grizzly.http.server.HttpHandler;
+import org.glassfish.grizzly.http.server.Request;
+import org.glassfish.grizzly.http.server.Response;
+import org.glassfish.grizzly.http.util.DataChunk;
+
+/**
+ * Root {@link HttpHandler} to be used to avoid mapping overhead
+ */
+public class RootHttpHandler extends HttpHandler {
+    private final HttpHandler plainTextHandler = new PlainTextHttpHandler();
+    private final HttpHandler jsonHandler = new JsonHttpHandler();
+    
+    @Override
+    public void service(final Request request, final Response response)
+            throws Exception {
+        // don't decode and avoid creating a string
+        final DataChunk requestURIBC = request.getRequest()
+                .getRequestURIRef().getRequestURIBC();
+        
+        if (requestURIBC.equals("/json")) {
+            jsonHandler.service(request, response);
+        } else {
+            plainTextHandler.service(request, response);
+        }
+    }
+    
+    @Override
+    protected ExecutorService getThreadPool(Request request) {
+        return null;
+    }
+}

+ 48 - 0
grizzly-bm/src/main/java/org/glassfish/grizzly/bm/Server.java

@@ -0,0 +1,48 @@
+package org.glassfish.grizzly.bm;
+
+import java.io.IOException;
+import org.glassfish.grizzly.Grizzly;
+import org.glassfish.grizzly.http.server.HttpServer;
+import org.glassfish.grizzly.http.server.NetworkListener;
+import org.glassfish.grizzly.nio.transport.TCPNIOTransport;
+
+/**
+ * HttpServer
+ */
+public class Server {
+    public static final String SERVER_VERSION = "Grizzly/" + Grizzly.getDotedVersion();
+    
+    public static void main(String[] args) throws IOException {
+        final int port = args.length > 0
+                ? Integer.parseInt(args[0]) : 8080;
+        
+        final HttpServer httpServer = new HttpServer();
+        final NetworkListener networkListener = new NetworkListener(
+                "http-listener", "0.0.0.0", port);
+        final TCPNIOTransport transport = networkListener.getTransport();
+        
+        // force to not initialize worker thread pool
+        transport.setWorkerThreadPoolConfig(null);
+        
+        networkListener.getKeepAlive().setIdleTimeoutInSeconds(-1);
+        networkListener.getKeepAlive().setMaxRequestsCount(-1);
+        
+        httpServer.addListener(networkListener);
+        
+        httpServer.getServerConfiguration().addHttpHandler(
+                new RootHttpHandler(), "/");
+//        httpServer.getServerConfiguration().addHttpHandler(
+//                new PlainTextHttpHandler(), "/plaintext");
+//        httpServer.getServerConfiguration().addHttpHandler(
+//                new JsonHttpHandler(), "/json");
+        
+        try {
+            httpServer.start();
+            
+            System.err.print("Server started. Press ENTER to stop.\n");
+            System.in.read();
+        } finally {
+            httpServer.stop();
+        }
+    }
+}