Browse Source

updated to latest version of jawn (#5309)

Anders 5 years ago
parent
commit
69effff115

+ 3 - 3
frameworks/Java/jawn/benchmark_config.json

@@ -16,13 +16,13 @@
       "language": "Java",
       "language": "Java",
       "flavor": "None",
       "flavor": "None",
       "orm": "Raw",
       "orm": "Raw",
-      "platform": "Servlet",
-      "webserver": "Undertow",
+      "platform": "Undertow",
+      "webserver": "None",
       "os": "Linux",
       "os": "Linux",
       "database_os": "Linux",
       "database_os": "Linux",
       "display_name": "jawn",
       "display_name": "jawn",
       "notes": "",
       "notes": "",
-      "versus": "servlet"
+      "versus": "undertow"
     }
     }
   }]
   }]
 }
 }

+ 7 - 30
frameworks/Java/jawn/build.gradle

@@ -10,46 +10,23 @@ mainClassName = 'app.BenchmarkMain'
 
 
 repositories {
 repositories {
     mavenCentral()
     mavenCentral()
-
-    //snapshot repository - not actually needed to run this example
-    maven {
-        url 'http://oss.sonatype.org/content/repositories/snapshots'
-    }
 }
 }
 
 
 dependencies {
 dependencies {
     // Framework
     // Framework
-    def framework_version = '0.9.14'
-    compile "net.javapla.jawn:jawn:${framework_version}"
+    def framework_version = '1.0.0'
+    implementation "net.javapla.jawn:jawn:${framework_version}"
+    implementation "net.javapla.jawn:jawn-database-hikari:${framework_version}"
+    
 
 
 
 
     // Database
     // Database
-    compile 'org.postgresql:postgresql:42.2.5'
-
-    //Logging
-    runtime group: 'ch.qos.logback', name: 'logback-classic', version: '1.3.0-alpha4' exclude group: 'org.slf4j'
+    compile 'org.postgresql:postgresql:42.2.8'
 }
 }
 
 
 /* ****************** */
 /* ****************** */
 /*    Application     */
 /*    Application     */
 /* ****************** */
 /* ****************** */
-run {
-    if(project.hasProperty('args')){
-        args project.args.split(',')
-    }
-    jvmArgs = ['-XX:+UseParallelGC','-XX:+AggressiveOpts']//['-XX:+UseNUMA','-XX:+UseParallelGC','-XX:+AggressiveOpts']
-}
-applicationDistribution.from("webapp") {
-    into "webapp"
-}
-
-/* ****************** */
-/*    Eclipse         */
-/* ****************** */
-eclipse {
-    classpath {
-        // we need the output dir to be the same as the one gradle uses when running Jetty
-        // or else the dynamic loading does not apply
-        defaultOutputDir = file('build/classes/main')
-    }
+application {
+    applicationDefaultJvmArgs = ['-server', '-XX:+UseParallelGC','-XX:+UseNUMA', '-XX:+UseStringDeduplication','-Xms4g', '-Xmx4g']
 }
 }

+ 7 - 3
frameworks/Java/jawn/jawn.dockerfile

@@ -1,7 +1,11 @@
 FROM gradle:5.4.1-jdk11 as gradle
 FROM gradle:5.4.1-jdk11 as gradle
-USER root
 WORKDIR /jawn
 WORKDIR /jawn
 COPY build.gradle build.gradle
 COPY build.gradle build.gradle
 COPY src src
 COPY src src
-COPY webapp webapp
-CMD ["gradle", "--no-daemon", "--refresh-dependencies", "run", "-Pargs=8080,production"]
+RUN gradle install --refresh-dependencies --no-daemon
+
+FROM openjdk:11.0.5-jre-stretch
+WORKDIR /jawn
+COPY --from=gradle /jawn/build/install/jawn .
+ENTRYPOINT ["bin/jawn"]
+CMD ["8080","production"]

+ 42 - 43
frameworks/Java/jawn/src/main/java/app/BenchmarkMain.java

@@ -1,72 +1,71 @@
 package app;
 package app;
 
 
-import com.google.inject.AbstractModule;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.util.Collections;
+import java.util.List;
 
 
-import app.controllers.DbController;
 import app.db.DbManager;
 import app.db.DbManager;
+import app.helpers.Helper;
+import app.models.Fortune;
 import app.models.Message;
 import app.models.Message;
 import net.javapla.jawn.core.Jawn;
 import net.javapla.jawn.core.Jawn;
 import net.javapla.jawn.core.Results;
 import net.javapla.jawn.core.Results;
-import net.javapla.jawn.core.server.ServerConfig.PERFORMANCE_MODE;
+import net.javapla.jawn.core.server.ServerConfig.Performance;
 import net.javapla.jawn.core.util.Modes;
 import net.javapla.jawn.core.util.Modes;
 
 
 public class BenchmarkMain extends Jawn {
 public class BenchmarkMain extends Jawn {
     private static final String message = "Hello, World!";
     private static final String message = "Hello, World!";
-    private static final byte[] bytemessage = message.getBytes();
+    private static final byte[] bytemessage = message.getBytes(StandardCharsets.UTF_8);
+    private static final ByteBuffer buffermessage = ByteBuffer.wrap(bytemessage);
     
     
-
-    String host = "tfb-database:5432";
-    String dbUrl = "jdbc:postgresql://"+host+"/hello_world";
+    private static DbManager db;
     
     
     // implicit constructor
     // implicit constructor
     {
     {
-        env(Modes.PROD);
+        mode(Modes.DEV);
         server()
         server()
             .port(8080)
             .port(8080)
-            .webappPath("webapp")
-            .serverPerformance(PERFORMANCE_MODE.HIGHEST);
+            .performance(Performance.HIGHEST);
+        
+        
+        onStartup(() -> db = require(DbManager.class)); // save a reference to the database when everything has started
         
         
         
         
-        get("/queries",DbController.class, DbController::getQueries);
-        get("/updates",DbController.class, DbController::getUpdates);
         
         
-        get("/json", Results.json(new Message(message)).addHeader("Server", "jawn"));
-        get("/plaintext", Results.text(bytemessage).addHeader("Server", "jawn"));
+        // Messages
+        
+        get("/json", () -> Results.json(new Message(message)));
+        get("/plaintext", () -> Results.text(buffermessage.duplicate()));
+        
+
+        // Fortunes
         
         
-        use(new AbstractModule() {
-            @Override
-            protected void configure() {
-                bind(DbManager.class);
-            }
+        get("/fortunes", () -> {
+            List<Fortune> fortunes = db.fetchAllFortunes();
+            fortunes.add(new Fortune(0, "Additional fortune added at request time."));
+            Collections.sort(fortunes, (f1, f2) -> f1.message.compareTo(f2.message));
+            
+            return Results.view().put("fortunes", fortunes); // implicitly reads /webapp/views/index.html.st
         });
         });
         
         
-        database(Modes.PROD)
-            .jdbc()
-            .driver("org.postgresql.Driver")
-            .url(dbUrl)
-            .user("benchmarkdbuser")
-            .password("benchmarkdbpass")
-            .maxPoolSize(32)
-            .letFrameworkHandleConnectionPool(true);
         
         
-        database(Modes.TEST)
-            .jdbc()
-            .driver("org.postgresql.Driver")
-            .url("jdbc:postgresql://172.16.0.16/hello_world")
-            .user("benchmarkdbuser")
-            .password("benchmarkdbpass")
-            .letFrameworkHandleConnectionPool(true);
-    
-        database(Modes.DEV)
-            .jdbc()
-            .driver("org.postgresql.Driver")
-            .url("jdbc:postgresql://172.16.0.16:5432/hello_world")
-            .user("benchmarkdbuser")
-            .password("benchmarkdbpass")
-            .letFrameworkHandleConnectionPool(true);
+        // Worlds
+        
+        get("/db", () -> Results.json(db.getWorld(Helper.getRandomNumber())) );
+        
+        get("/queries", ctx -> {
+            int q = ctx.req().queryParam("queries").intValue(1);
+            return Results.json( db.getWorlds( q > 500 ? 500 : q < 1 ? 1 : q ));
+        });
+        
+        get("/updates", ctx -> {
+            int q = ctx.req().queryParam("queries").intValue(1);
+            return Results.json(db.getAndUpdateWorlds( q > 500 ? 500 : q < 1 ? 1 : q ));
+        });
     }
     }
 
 
     public static void main(String[] args) throws Exception {
     public static void main(String[] args) throws Exception {
-        run(BenchmarkMain::new, args);
+        run(BenchmarkMain.class, args);
     }
     }
 }
 }

+ 0 - 42
frameworks/Java/jawn/src/main/java/app/controllers/DbController.java

@@ -1,42 +0,0 @@
-package app.controllers;
-
-import com.google.inject.Inject;
-
-import app.db.DbManager;
-import app.helpers.Helper;
-import net.javapla.jawn.core.Controller;
-import net.javapla.jawn.core.Param;
-
-public class DbController extends Controller {
-
-    @Inject
-    private DbManager db;
-    
-    // /db
-    public void index() {
-        respond().json(db.getWorld(Helper.getRandomNumber())).addHeader("Server", "jawn");
-    }
-    
-    // /queries?queries=
-    public void getQueries() {
-        int param = parseQueryParam();
-
-        respond().json(db.getWorlds(param)).addHeader("Server", "jawn");
-    }
-    
-    // /updates?queries=
-    public void getUpdates() {
-        int param = parseQueryParam();
-
-        respond().json(db.getAndUpdateWorlds(param)).addHeader("Server", "jawn");
-    }
-    
-    private int parseQueryParam() {
-        Param queries = param("queries");
-        Integer param = queries.asInt(1);
-        if (param > 500) param = 500;
-        else if (param < 1) param = 1;
-        
-        return param;
-    }
-}

+ 0 - 24
frameworks/Java/jawn/src/main/java/app/controllers/FortunesController.java

@@ -1,24 +0,0 @@
-package app.controllers;
-
-import java.util.Collections;
-import java.util.List;
-
-import net.javapla.jawn.core.Controller;
-import app.db.DbManager;
-import app.models.Fortune;
-
-import com.google.inject.Inject;
-
-public class FortunesController extends Controller {
-
-    @Inject
-    private DbManager db;
-    
-    public void index() {
-        List<Fortune> fortunes = db.fetchAllFortunes();
-        fortunes.add(new Fortune(0, "Additional fortune added at request time."));
-        Collections.sort(fortunes, (f1, f2) -> f1.message.compareTo(f2.message));
-        header("Server", "jawn");
-        view("fortunes", fortunes);
-    }
-}

+ 4 - 12
frameworks/Java/jawn/src/main/java/app/db/DbManager.java

@@ -1,6 +1,5 @@
 package app.db;
 package app.db;
 
 
-import java.beans.PropertyVetoException;
 import java.sql.Connection;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.ResultSet;
@@ -10,15 +9,13 @@ import java.util.List;
 
 
 import javax.sql.DataSource;
 import javax.sql.DataSource;
 
 
-import net.javapla.jawn.core.database.DatabaseConnection;
-import net.javapla.jawn.core.exceptions.InitException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
 import app.helpers.Helper;
 import app.helpers.Helper;
 import app.models.Fortune;
 import app.models.Fortune;
 import app.models.World;
 import app.models.World;
 
 
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
 @Singleton
 @Singleton
 public class DbManager {
 public class DbManager {
     
     
@@ -29,9 +26,7 @@ public class DbManager {
     private DataSource source;
     private DataSource source;
 
 
     @Inject
     @Inject
-    public DbManager(DatabaseConnection spec) throws ClassNotFoundException, SQLException, PropertyVetoException {
-        if (spec == null) throw new InitException("DatabaseConnection is null");
-        
+    public DbManager(DataSource spec) {
         source = spec;
         source = spec;
     }
     }
     
     
@@ -112,9 +107,6 @@ public class DbManager {
         try (Connection connection = source.getConnection()) {
         try (Connection connection = source.getConnection()) {
             PreparedStatement fetch = connection.prepareStatement(SELECT_FORTUNE, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
             PreparedStatement fetch = connection.prepareStatement(SELECT_FORTUNE, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
             ResultSet set = fetch.executeQuery();
             ResultSet set = fetch.executeQuery();
-//            ResultSet set = connection
-//                    .createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)
-//                    .executeQuery("SELECT id, message FROM Fortune");
             while (set.next()) {
             while (set.next()) {
                 list.add(new Fortune(set.getInt(1), escape(set.getString(2))));
                 list.add(new Fortune(set.getInt(1), escape(set.getString(2))));
             }
             }

+ 7 - 0
frameworks/Java/jawn/src/main/resources/jawn.properties

@@ -0,0 +1,7 @@
+database.url = jdbc:postgresql://tfb-database:5432/hello_world                      
+database.driver = org.postgresql.Driver
+database.user = benchmarkdbuser
+database.password = benchmarkdbpass
+
+dev.database.url = jdbc:postgresql://localhost:5432/hello_world
+

+ 0 - 4
frameworks/Java/jawn/src/main/resources/logback.xml

@@ -6,10 +6,6 @@
         </encoder>
         </encoder>
     </appender>
     </appender>
 
 
-    <logger name="com.mchange.v2.c3p0.impl.NewProxyPreparedStatement" level="WARN" additivity="false">
-        <appender-ref ref="STDOUT" />
-    </logger>
-    
     <!-- Disables all logging -->
     <!-- Disables all logging -->
     <root level="off">
     <root level="off">
         <appender-ref ref="STDOUT" />
         <appender-ref ref="STDOUT" />

+ 0 - 0
frameworks/Java/jawn/webapp/views/index.html.st → frameworks/Java/jawn/src/main/resources/webapp/views/index.html.st