Răsfoiți Sursa

Updating jawn framework (#2961)

* Update build.gradle

* updated framework, now using postgresql
Anders 8 ani în urmă
părinte
comite
31e3ede6d3

+ 18 - 18
frameworks/Java/jawn/build.gradle

@@ -6,11 +6,11 @@ apply plugin: 'application'
 sourceCompatibility = JavaVersion.VERSION_1_8
 targetCompatibility = JavaVersion.VERSION_1_8
 
-mainClassName = 'app.UndertowMain'
+mainClassName = 'app.BenchmarkMain'
 
 repositories {
     mavenCentral()
-    
+
     //snapshot repository - not actually needed to run this example
     maven {
         url 'http://oss.sonatype.org/content/repositories/snapshots'
@@ -18,16 +18,16 @@ repositories {
 }
 
 dependencies {
-	// Framework
-    def framework_version = '0.9.0'
-	compile "net.javapla.jawn:jawn-server-undertow:${framework_version}"
-
-	
-	// Database
-	compile 'mysql:mysql-connector-java:5.1.38'
-	
-	//Logging 
-	runtime group: 'ch.qos.logback', name: 'logback-classic', version: '1.1.3' exclude group: 'org.slf4j'
+    // Framework
+    def framework_version = '0.9.6'
+    compile "net.javapla.jawn:jawn:${framework_version}"
+
+
+    // Database
+    compile 'org.postgresql:postgresql:42.1.4'
+
+    //Logging
+    runtime group: 'ch.qos.logback', name: 'logback-classic', version: '1.1.3' exclude group: 'org.slf4j'
 }
 
 /* ****************** */
@@ -37,7 +37,7 @@ run {
     if(project.hasProperty('args')){
         args project.args.split(',')
     }
-    jvmArgs = ['-server','-XX:+UseNUMA','-XX:+UseParallelGC','-XX:+AggressiveOpts']//['-XX:+UseNUMA','-XX:+UseParallelGC','-XX:+AggressiveOpts']
+    jvmArgs = ['-XX:+UseParallelGC','-XX:+AggressiveOpts']//['-XX:+UseNUMA','-XX:+UseParallelGC','-XX:+AggressiveOpts']
 }
 applicationDistribution.from("webapp") {
     into "webapp"
@@ -47,9 +47,9 @@ applicationDistribution.from("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')
-	}
+    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')
+    }
 }

+ 2 - 2
frameworks/Java/jawn/setup.sh

@@ -1,7 +1,7 @@
 #!/bin/bash
 
-fw_depends mysql java
+fw_depends postgresql java
 
 ./gradlew clean
 
-./gradlew --refresh-dependencies run -Pargs=production
+./gradlew --no-daemon --refresh-dependencies run -Pargs=8080,production

+ 1 - 5
frameworks/Java/jawn/source_code

@@ -2,10 +2,6 @@
 ./jawn/src/main/
 ./jawn/src/main/java/
 ./jawn/src/main/java/app
-./jawn/src/main/java/app/config
-./jawn/src/main/java/app/config/Bootstrap.java
-./jawn/src/main/java/app/config/Database.java
-./jawn/src/main/java/app/config/Routing.java
 ./jawn/src/main/java/app/controllers
 ./jawn/src/main/java/app/controllers/DbController.java
 ./jawn/src/main/java/app/controllers/FortunesController.java
@@ -16,6 +12,6 @@
 ./jawn/src/main/java/app/models/Fortune.java
 ./jawn/src/main/java/app/models/Message.java
 ./jawn/src/main/java/app/models/World.java
-./jawn/src/main/java/app/UndertowMain.java
+./jawn/src/main/java/app/BenchmarkMain.java
 ./jawn/src/main/resources/
 ./jawn/src/main/resources/logback.xml

+ 91 - 0
frameworks/Java/jawn/src/main/java/app/BenchmarkMain.java

@@ -0,0 +1,91 @@
+package app;
+
+import com.google.inject.AbstractModule;
+
+import app.controllers.DbController;
+import app.db.DbManager;
+import app.models.Message;
+import net.javapla.jawn.core.Jawn;
+import net.javapla.jawn.core.Results;
+import net.javapla.jawn.core.server.ServerConfig.PERFORMANCE_MODE;
+import net.javapla.jawn.core.util.Modes;
+
+public class BenchmarkMain extends Jawn {
+    private static final String message = "Hello, World!";
+    private static final byte[] bytemessage = message.getBytes();
+    
+    String jdbcParams = 
+        "jdbcCompliantTruncation=false" +
+        "&elideSetAutoCommits=true" +
+        "&useLocalSessionState=true" +
+        "&cachePrepStmts=true" +
+        "&cacheCallableStmts=true" +
+        "&alwaysSendSetIsolation=false" +
+        "&prepStmtCacheSize=4096" +
+        "&cacheServerConfiguration=true" +
+        "&prepStmtCacheSqlLimit=2048" +
+        "&zeroDateTimeBehavior=convertToNull" +
+        "&traceProtocol=false" +
+        "&useUnbufferedInput=false" +
+        "&useReadAheadInput=false" +
+        "&maintainTimeStats=false" +
+        "&useServerPrepStmts=true" +
+        "&cacheRSMetadata=true" +
+        "&useSSL=false";
+
+    String host = "TFB-database:5432";
+    String dbUrl = "jdbc:postgresql://"+host+"/hello_world";//"jdbc:mysql://"+host+"/hello_world?";
+    
+    // implicit constructor
+    {
+        env(Modes.PROD);
+        server()
+            .port(8080)
+            .webappPath("webapp")
+            .serverPerformance(PERFORMANCE_MODE.HIGHEST)
+            .contextPath("/");
+        
+        
+        get("/queries",DbController.class, "queries");
+        get("/updates",DbController.class, "updates");
+        
+        get("/json", (context) -> Results.json(new Message(message)));
+        get("/plaintext", (context) -> Results.text(bytemessage));
+        
+        use(new AbstractModule() {
+            @Override
+            protected void configure() {
+                bind(DbManager.class);
+            }
+        });
+        
+        database(Modes.PROD)
+            .jdbc()
+            .driver("org.postgresql.Driver")
+            .url(dbUrl)// + jdbcParams)
+            .user("benchmarkdbuser")
+            .password("benchmarkdbpass")
+            .maxPoolSize(32)
+            .letFrameworkHandleConnectionPool(true);
+        
+        database(Modes.TEST)
+            .jdbc()
+            .driver("com.mysql.cj.jdbc.Driver")
+            .url("jdbc:mysql://172.16.0.16/hello_world?" + jdbcParams)
+            .user("benchmarkdbuser")
+            .password("benchmarkdbpass")
+            .letFrameworkHandleConnectionPool(true);
+    
+        database(Modes.DEV)
+            .jdbc()
+            .driver("com.mysql.cj.jdbc.Driver")
+            .url("jdbc:mysql://172.16.0.16/hello_world?" + jdbcParams)
+            .user("benchmarkdbuser")
+            .password("benchmarkdbpass")
+            .letFrameworkHandleConnectionPool(true);
+    }
+
+    public static void main(String[] args) throws Exception {
+        run(BenchmarkMain::new, args);
+    }
+}

+ 0 - 27
frameworks/Java/jawn/src/main/java/app/UndertowMain.java

@@ -1,27 +0,0 @@
-package app;
-
-import net.javapla.jawn.server.UndertowServer;
-import net.javapla.jawn.server.api.ServerConfig;
-import net.javapla.jawn.server.api.ServerConfig.PERFORMANCE_MODE;
-
-public class UndertowMain {
-
-    public static void main(String[] args) throws Exception {
-        // Automatically set environment to production if nothing is specified
-        // Framework defaults to development
-        String environment = "production";
-        if (args.length > 0) environment = args[0];
-        System.setProperty("JAWN_ENV", environment);
-        
-        ServerConfig config = new ServerConfig();
-        
-        config.setContextPath("/")
-            .setPort(8080)
-            .setWebappPath("webapp")
-            .setServerPerformance(PERFORMANCE_MODE.HIGHEST)
-            ;
-        
-        UndertowServer server = new UndertowServer();
-        server.setupAndStartServer(config);
-    }
-}

+ 0 - 17
frameworks/Java/jawn/src/main/java/app/config/Bootstrap.java

@@ -1,17 +0,0 @@
-package app.config;
-
-import net.javapla.jawn.core.ApplicationConfig;
-import net.javapla.jawn.core.api.ApplicationBootstrap;
-import app.db.DbModule;
-
-public class Bootstrap implements ApplicationBootstrap {
-
-    @Override
-    public void bootstrap(ApplicationConfig config) {
-        config.registerModules(new DbModule());
-    }
-
-    @Override
-    public void destroy() {}
-
-}

+ 0 - 59
frameworks/Java/jawn/src/main/java/app/config/Database.java

@@ -1,59 +0,0 @@
-package app.config;
-
-import net.javapla.jawn.core.api.ApplicationDatabaseBootstrap;
-import net.javapla.jawn.core.database.DatabaseConnections;
-import net.javapla.jawn.core.util.Modes;
-
-public class Database implements ApplicationDatabaseBootstrap {
-    
-    @Override
-    public void dbConnections(DatabaseConnections connections) {
-        
-        String jdbcParams = "jdbcCompliantTruncation=false&elideSetAutoCommits=true" +
-                "&useLocalSessionState=true" +
-                "&cachePrepStmts=true" +
-                "&cacheCallableStmts=true" +
-                "&alwaysSendSetIsolation=false" +
-                "&prepStmtCacheSize=4096" +
-                "&cacheServerConfiguration=true" +
-                "&prepStmtCacheSqlLimit=2048" +
-                "&zeroDateTimeBehavior=convertToNull" +
-                "&traceProtocol=false" +
-                "&useUnbufferedInput=false" +
-                "&useReadAheadInput=false" +
-                "&maintainTimeStats=false" +
-                "&useServerPrepStmts=true" +
-                "&cacheRSMetadata=true";
-        
-        String host = "TFB-database:3306";
-        String dbUrl = "jdbc:mysql://"+host+"/hello_world?";
-        
-        connections
-            .environment(Modes.PROD)
-            .jdbc()
-            .driver("com.mysql.jdbc.Driver")
-            .url(dbUrl + jdbcParams)
-            .user("benchmarkdbuser")
-            .password("benchmarkdbpass")
-            .maxPoolSize(256)
-            .minPoolSize(256);
-        
-        connections
-            .environment(Modes.TEST)
-            .jdbc()
-            .driver("com.mysql.jdbc.Driver")
-            .url("jdbc:mysql://172.16.0.16/hello_world?" + jdbcParams)
-            .user("benchmarkdbuser")
-            .password("benchmarkdbpass")
-            ;
-        
-        connections
-            .environment(Modes.DEV)
-            .jdbc()
-            .driver("com.mysql.jdbc.Driver")
-            .url("jdbc:mysql://172.16.0.16/hello_world?" + jdbcParams)
-            .user("benchmarkdbuser")
-            .password("benchmarkdbpass");
-    }
-
-}

+ 0 - 24
frameworks/Java/jawn/src/main/java/app/config/Routing.java

@@ -1,24 +0,0 @@
-package app.config;
-
-import net.javapla.jawn.core.Responses;
-import net.javapla.jawn.core.api.ApplicationRoutes;
-import net.javapla.jawn.core.api.Routes;
-import app.controllers.DbController;
-import app.models.Message;
-
-
-public class Routing implements ApplicationRoutes {
-    
-    private static final String message = "Hello, World!";
-    private static final byte[] bytemessage = message.getBytes();
-    
-    @Override
-    public void router(Routes routes) {
-        routes.GET().route("/queries").to(DbController.class, "queries");
-        routes.GET().route("/updates").to(DbController.class, "updates");
-        
-        routes.GET().route("/json").with(Responses.json(new Message(message)));
-        routes.GET().route("/plaintext").with(Responses.text(bytemessage));
-    }
-
-}

+ 5 - 11
frameworks/Java/jawn/src/main/java/app/controllers/DbController.java

@@ -1,12 +1,11 @@
 package app.controllers;
 
-import net.javapla.jawn.core.Controller;
-import net.javapla.jawn.core.Param;
+import com.google.inject.Inject;
+
 import app.db.DbManager;
 import app.helpers.Helper;
-import app.models.World;
-
-import com.google.inject.Inject;
+import net.javapla.jawn.core.Controller;
+import net.javapla.jawn.core.Param;
 
 public class DbController extends Controller {
 
@@ -29,12 +28,7 @@ public class DbController extends Controller {
     public void getUpdates() {
         int param = parseQueryParam();
         
-        World[] worlds = db.getWorlds(param);
-        for (int i = 0; i < param; i++) {
-            worlds[i].randomNumber = Helper.getRandomNumber();
-        }
-        db.updateWorlds(worlds);
-        respond().json(worlds);
+        respond().json(db.getAndUpdateWorlds(param));
     }
     
     private int parseQueryParam() {

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

@@ -19,6 +19,5 @@ public class FortunesController extends Controller {
         fortunes.add(new Fortune(0, "Additional fortune added at request time."));
         Collections.sort(fortunes, (f1, f2) -> f1.message.compareTo(f2.message));
         view("fortunes", fortunes);
-        render().layout("../index");
     }
 }

+ 42 - 28
frameworks/Java/jawn/src/main/java/app/db/DbManager.java

@@ -33,9 +33,7 @@ public class DbManager {
     
     public World getWorld(int id) {
         try (Connection connection = source.getConnection()) {
-            PreparedStatement statement = connection.prepareStatement("SELECT id, randomNumber FROM World WHERE id = ?",
-                    ResultSet.TYPE_FORWARD_ONLY,
-                    ResultSet.CONCUR_READ_ONLY);
+            PreparedStatement statement = connection.prepareStatement("SELECT id, randomNumber FROM World WHERE id = ?");
             statement.setInt(1, id);
             ResultSet set = statement.executeQuery();
             
@@ -48,21 +46,21 @@ public class DbManager {
         return null;
     }
     
-    public final World[] getWorlds(int number) {
+    public final World[] getWorlds(final int number) {
         World[] worlds = new World[number];
         
         try (final Connection connection = source.getConnection()) {
             
             for (int i = 0; i < number; i++) {
-                try(PreparedStatement statement = connection.prepareStatement("SELECT id, randomNumber FROM World WHERE id = ?",
-                        ResultSet.TYPE_FORWARD_ONLY,
-                        ResultSet.CONCUR_READ_ONLY)) {
+                try (final PreparedStatement statement = connection.prepareStatement("SELECT id, randomNumber FROM World WHERE id = ?")) {
                 
-                    statement.setInt(1, Helper.getRandomNumber());
+                    final int id = Helper.getRandomNumber();
+                    
+                    statement.setInt(1, id);
                     ResultSet set = statement.executeQuery();
                     set.next();
                     
-                    worlds[i] = new World(set.getInt(1), set.getInt(2));
+                    worlds[i] = new World(id, set.getInt(2));
                 }
             }
             
@@ -71,31 +69,47 @@ public class DbManager {
         return worlds;
     }
     
-    public boolean updateWorlds(World[] worlds) {
-        try (Connection connection = source.getConnection()) {
-            PreparedStatement update = connection.prepareStatement("UPDATE World SET randomNumber = ? WHERE id= ?");
-            for (World world : worlds) {
-                update.setInt(1, world.randomNumber);
-                update.setInt(2, world.id);
-                update.addBatch();
+    public final World[] getAndUpdateWorlds(final int number) {
+        World[] worlds = new World[number];
+        
+        try (final Connection connection = source.getConnection()) {
+            
+            for (int i = 0; i < number; i++) {
+                try (
+                    final PreparedStatement statement = connection.prepareStatement("SELECT id, randomNumber FROM World WHERE id = ?");
+                    final PreparedStatement update = connection.prepareStatement("UPDATE World SET randomNumber = ? WHERE id= ?")) {
+                
+                    final int id = Helper.getRandomNumber(),
+                         newRand = Helper.getRandomNumber();
+                    
+                    // get world
+                    statement.setInt(1, id);
+                    ResultSet set = statement.executeQuery();
+                    set.next();
+                    worlds[i] = new World(id, set.getInt(2));
+                    
+                    // update world
+                    update.setInt(1, newRand);
+                    update.setInt(2, id);
+                    
+                    // return updated world
+                    worlds[i].randomNumber = newRand;
+                }
             }
-            update.executeBatch();
-            return true;
-        } catch (SQLException e) {
-            return false;
-        }
+            
+        } catch (SQLException e) {}
+        
+        return worlds;
     }
     
     public List<Fortune> fetchAllFortunes() {
         List<Fortune> list = new ArrayList<>();
         try (Connection connection = source.getConnection()) {
-//            PreparedStatement fetch = connection.prepareStatement("SELECT id, message FROM Fortune",
-//                    ResultSet.TYPE_FORWARD_ONLY,
-//                    ResultSet.CONCUR_READ_ONLY);
-//            ResultSet set = fetch.executeQuery();
-            ResultSet set = connection
-                    .createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)
-                    .executeQuery("SELECT id, message FROM Fortune");
+            PreparedStatement fetch = connection.prepareStatement("SELECT id, message FROM Fortune");
+            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()) {
                 list.add(new Fortune(set.getInt(1), escape(set.getString(2))));
             }

+ 0 - 12
frameworks/Java/jawn/src/main/java/app/db/DbModule.java

@@ -1,12 +0,0 @@
-package app.db;
-
-import com.google.inject.AbstractModule;
-
-public class DbModule extends AbstractModule {
-
-    @Override
-    protected void configure() {
-        bind(DbManager.class);
-    }
-
-}

+ 3 - 3
frameworks/Java/jawn/src/main/java/app/models/Fortune.java

@@ -2,10 +2,10 @@ package app.models;
 
 public class Fortune {
 
-    public int id;
-    public String message;
+    public final int id;
+    public final String message;
     
-    public Fortune(int i , String m) {
+    public Fortune(final int i , final String m) {
         id = i;
         message = m;
     }

+ 2 - 2
frameworks/Java/jawn/src/main/java/app/models/Message.java

@@ -2,8 +2,8 @@ package app.models;
 
 public class Message {
 
-    public String message;
-    public Message(String m) {
+    public final String message;
+    public Message(final String m) {
         message = m;
     }
 }

+ 2 - 2
frameworks/Java/jawn/src/main/java/app/models/World.java

@@ -2,10 +2,10 @@ package app.models;
 
 public class World {
 
-    public int id;
+    public final int id;
     public int randomNumber;
     
-    public World(int i , int r) {
+    public World(final int i , final int r) {
         id = i;
         randomNumber = r;
     }

+ 0 - 4
frameworks/Java/jawn/webapp/views/fortunes/index.st

@@ -1,4 +0,0 @@
-<table>
-	<tr><th>id</th><th>message</th></tr>
-	$fortunes:{ fortune | <tr><td>$fortune.id$</td><td>$fortune.message$</td></tr>}$
-</table>

+ 5 - 2
frameworks/Java/jawn/webapp/views/index.html.st

@@ -1,9 +1,12 @@
 <!DOCTYPE html>
 <html>
 <head>
-	<title>Fortunes</title>
+  <title>Fortunes</title>
 </head>
 <body>
-	$site.content$
+  <table>
+    <tr><th>id</th><th>message</th></tr>
+    $fortunes:{ fortune | <tr><td>$fortune.id$</td><td>$fortune.message$</td></tr>}$
+  </table>
 </body>
 </html>