|
@@ -7,6 +7,8 @@ package org.redkalex.benchmark;
|
|
|
|
|
|
|
|
import java.util.*;
|
|
import java.util.*;
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
|
|
+import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
|
+import java.util.function.Function;
|
|
|
import javax.annotation.Resource;
|
|
import javax.annotation.Resource;
|
|
|
import org.redkale.net.http.*;
|
|
import org.redkale.net.http.*;
|
|
|
import org.redkale.service.AbstractService;
|
|
import org.redkale.service.AbstractService;
|
|
@@ -27,10 +29,6 @@ public class Service extends AbstractService {
|
|
|
@Resource
|
|
@Resource
|
|
|
private DataSource source;
|
|
private DataSource source;
|
|
|
|
|
|
|
|
- @Override
|
|
|
|
|
- public void init(AnyValue conf) {
|
|
|
|
|
- //source.queryList(CachedWorld.class);
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
@RestMapping(name = "json")
|
|
@RestMapping(name = "json")
|
|
|
public Message getHelloMessage() {
|
|
public Message getHelloMessage() {
|
|
@@ -42,25 +40,8 @@ public class Service extends AbstractService {
|
|
|
return helloBytes;
|
|
return helloBytes;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- @RestMapping(name = "db")
|
|
|
|
|
- public CompletableFuture<World> findWorld() {
|
|
|
|
|
- return source.findAsync(World.class, randomId());
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- @RestMapping(name = "queries")
|
|
|
|
|
- public CompletableFuture<World[]> queryWorld(@RestParam(name = "queries") int count) {
|
|
|
|
|
- final int size = Math.min(500, Math.max(1, count));
|
|
|
|
|
- final World[] worlds = new World[size];
|
|
|
|
|
- final CompletableFuture[] futures = new CompletableFuture[size];
|
|
|
|
|
- for (int i = 0; i < size; i++) {
|
|
|
|
|
- final int index = i;
|
|
|
|
|
- futures[index] = source.findAsync(World.class, randomId()).thenApply(r -> worlds[index] = r);
|
|
|
|
|
- }
|
|
|
|
|
- return CompletableFuture.allOf(futures).thenApply(v -> worlds);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
@RestMapping(name = "cached-worlds")
|
|
@RestMapping(name = "cached-worlds")
|
|
|
- public CachedWorld[] cachedWorlds(@RestParam(name = "count") int count) {
|
|
|
|
|
|
|
+ public CachedWorld[] cachedWorlds(int count) {
|
|
|
final int size = Math.min(500, Math.max(1, count));
|
|
final int size = Math.min(500, Math.max(1, count));
|
|
|
final CachedWorld[] worlds = new CachedWorld[size];
|
|
final CachedWorld[] worlds = new CachedWorld[size];
|
|
|
for (int i = 0; i < size; i++) {
|
|
for (int i = 0; i < size; i++) {
|
|
@@ -69,19 +50,44 @@ public class Service extends AbstractService {
|
|
|
return worlds;
|
|
return worlds;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ @RestMapping(name = "db")
|
|
|
|
|
+ public CompletableFuture<World> findWorldAsync() {
|
|
|
|
|
+ return source.findAsync(World.class, randomId());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @RestMapping(name = "queries")
|
|
|
|
|
+ public CompletableFuture<World[]> queryWorldAsync(int queries) {
|
|
|
|
|
+ final int size = Math.min(500, Math.max(1, queries));
|
|
|
|
|
+ final World[] worlds = new World[size];
|
|
|
|
|
+ final AtomicInteger index = new AtomicInteger();
|
|
|
|
|
+ final Function<?, CompletableFuture> func = f -> source.findAsync(World.class, randomId())
|
|
|
|
|
+ .thenAccept((World v) -> worlds[index.getAndIncrement()] = v);
|
|
|
|
|
+ CompletableFuture future = func.apply(null);
|
|
|
|
|
+ for (int i = 1; i < size; i++) {
|
|
|
|
|
+ future = future.thenCompose(func);
|
|
|
|
|
+ }
|
|
|
|
|
+ return future.thenApply(v -> worlds);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
@RestMapping(name = "updates")
|
|
@RestMapping(name = "updates")
|
|
|
- public CompletableFuture<World[]> updateWorld(@RestParam(name = "queries") int count) {
|
|
|
|
|
- final int size = Math.min(500, Math.max(1, count));
|
|
|
|
|
|
|
+ public CompletableFuture<World[]> updateWorldAsync(int queries) {
|
|
|
|
|
+ final int size = Math.min(500, Math.max(1, queries));
|
|
|
final World[] worlds = new World[size];
|
|
final World[] worlds = new World[size];
|
|
|
- final CompletableFuture[] futures = new CompletableFuture[size];
|
|
|
|
|
- for (int i = 0; i < size; i++) {
|
|
|
|
|
- final int index = i;
|
|
|
|
|
- futures[index] = source.findAsync(World.class, randomId()).thenAccept((World r) -> {
|
|
|
|
|
- r.setRandomNumber(randomId());
|
|
|
|
|
- worlds[index] = r;
|
|
|
|
|
|
|
+ final AtomicInteger index = new AtomicInteger();
|
|
|
|
|
+ final Function<?, CompletableFuture> func = f -> source.findAsync(World.class, randomId())
|
|
|
|
|
+ .thenApply((World v) -> {
|
|
|
|
|
+ worlds[index.getAndIncrement()] = v;
|
|
|
|
|
+ v.setRandomNumber(randomId());
|
|
|
|
|
+ return v;
|
|
|
});
|
|
});
|
|
|
|
|
+ CompletableFuture future = func.apply(null);
|
|
|
|
|
+ for (int i = 1; i < size; i++) {
|
|
|
|
|
+ future = future.thenCompose(func);
|
|
|
}
|
|
}
|
|
|
- return CompletableFuture.allOf(futures).thenCompose(v -> source.updateAsync(worlds)).thenApply(v -> worlds);
|
|
|
|
|
|
|
+ return future.thenCompose(v -> {
|
|
|
|
|
+ Arrays.sort(worlds);
|
|
|
|
|
+ return source.updateAsync(worlds);
|
|
|
|
|
+ }).thenApply(v -> worlds);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@RestMapping(name = "fortunes")
|
|
@RestMapping(name = "fortunes")
|