Browse Source

启用虚拟线程

zhengjw22 1 năm trước cách đây
mục cha
commit
41012e2094

+ 28 - 20
frameworks/Java/smart-socket/src/main/java/org/smartboot/http/MultipleQueriesHandler.java

@@ -11,6 +11,7 @@ import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ThreadLocalRandom;
 
 /**
@@ -25,28 +26,35 @@ public class MultipleQueriesHandler extends HttpServerHandler {
     }
 
     @Override
-    public void handle(HttpRequest httpRequest, HttpResponse response) throws IOException {
-        int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500);
-        World[] worlds = new World[queries];
-        try (Connection connection = dataSource.getConnection();
-             PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) {
-
-            for (int i = 0; i < queries; i++) {
-                preparedStatement.setInt(1, getRandomNumber());
-                ResultSet resultSet = preparedStatement.executeQuery();
-                resultSet.next();
-                World world = new World();
-                world.setId(resultSet.getInt(1));
-                world.setRandomNumber(resultSet.getInt(2));
-                worlds[i] = world;
-                preparedStatement.clearParameters();
+    public void handle(HttpRequest httpRequest, HttpResponse response, CompletableFuture<Object> completableFuture) throws IOException {
+        Thread.startVirtualThread(() -> {
+            try {
+                int queries = Math.min(Math.max(NumberUtils.toInt(httpRequest.getParameter("queries"), 1), 1), 500);
+                World[] worlds = new World[queries];
+                try (Connection connection = dataSource.getConnection();
+                     PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) {
+
+                    for (int i = 0; i < queries; i++) {
+                        preparedStatement.setInt(1, getRandomNumber());
+                        ResultSet resultSet = preparedStatement.executeQuery();
+                        resultSet.next();
+                        World world = new World();
+                        world.setId(resultSet.getInt(1));
+                        world.setRandomNumber(resultSet.getInt(2));
+                        worlds[i] = world;
+                        preparedStatement.clearParameters();
+                    }
+
+                } catch (SQLException throwables) {
+                    throwables.printStackTrace();
+                }
+                response.setContentType("application/json");
+                JsonUtil.writeJsonBytes(response, worlds);
+            } finally {
+                completableFuture.complete(null);
             }
+        });
 
-        } catch (SQLException throwables) {
-            throwables.printStackTrace();
-        }
-        response.setContentType("application/json");
-        JsonUtil.writeJsonBytes(response, worlds);
     }
 
     protected int getRandomNumber() {

+ 21 - 14
frameworks/Java/smart-socket/src/main/java/org/smartboot/http/SingleQueryHandler.java

@@ -10,6 +10,7 @@ import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ThreadLocalRandom;
 
 /**
@@ -24,20 +25,26 @@ public class SingleQueryHandler extends HttpServerHandler {
     }
 
     @Override
-    public void handle(HttpRequest httpRequest, HttpResponse response) throws IOException {
-        World world = new World();
-        try (Connection connection = dataSource.getConnection();
-             PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) {
-            preparedStatement.setInt(1, getRandomNumber());
-            ResultSet resultSet = preparedStatement.executeQuery();
-            resultSet.next();
-            world.setId(resultSet.getInt(1));
-            world.setRandomNumber(resultSet.getInt(2));
-        } catch (SQLException throwables) {
-            throwables.printStackTrace();
-        }
-        response.setContentType("application/json");
-        JsonUtil.writeJsonBytes(response, world);
+    public void handle(HttpRequest httpRequest, HttpResponse response, CompletableFuture<Object> completableFuture) throws IOException {
+        Thread.startVirtualThread(() -> {
+            try {
+                World world = new World();
+                try (Connection connection = dataSource.getConnection(); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM World WHERE id=?");) {
+                    preparedStatement.setInt(1, getRandomNumber());
+                    ResultSet resultSet = preparedStatement.executeQuery();
+                    resultSet.next();
+                    world.setId(resultSet.getInt(1));
+                    world.setRandomNumber(resultSet.getInt(2));
+                } catch (SQLException throwables) {
+                    throwables.printStackTrace();
+                }
+                response.setContentType("application/json");
+                JsonUtil.writeJsonBytes(response, world);
+            } finally {
+                completableFuture.complete(null);
+            }
+        });
+
     }
 
     protected int getRandomNumber() {

+ 3 - 0
frameworks/Java/smart-socket/src/main/java/org/smartboot/servlet/Bootstrap.java

@@ -18,6 +18,9 @@ public class Bootstrap {
         ContainerRuntime containerRuntime = new ContainerRuntime();
         // plaintext
         ServletContextRuntime applicationRuntime = new ServletContextRuntime(null, Thread.currentThread().getContextClassLoader(), "/");
+        applicationRuntime.setVendorProvider(response -> {
+
+        });
         ServletInfo plainTextServletInfo = new ServletInfo();
         plainTextServletInfo.setServletName("plaintext");
         plainTextServletInfo.setServletClass(HelloWorldServlet.class.getName());