Skip to content

Commit 41d2c07

Browse files
committed
FluxWorkers.java
1 parent aa2fe8c commit 41d2c07

3 files changed

Lines changed: 112 additions & 2 deletions

File tree

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.mengcraft.simpleorm;
2+
3+
import com.google.common.base.Preconditions;
4+
import com.google.common.collect.Lists;
5+
import com.google.common.util.concurrent.ThreadFactoryBuilder;
6+
import org.bukkit.Bukkit;
7+
8+
import java.io.Closeable;
9+
import java.util.List;
10+
import java.util.concurrent.Executor;
11+
import java.util.concurrent.ExecutorService;
12+
import java.util.concurrent.Executors;
13+
import java.util.concurrent.ThreadFactory;
14+
import java.util.concurrent.TimeUnit;
15+
16+
public class FluxWorkers implements Executor, Closeable {
17+
18+
private final ServerWorker serverWorker = new ServerWorker();
19+
private final int size;
20+
private final List<ExecutorService> workers;
21+
private int cursor;
22+
23+
public FluxWorkers(int size) {
24+
this.size = size;
25+
workers = Lists.newArrayListWithCapacity(size);
26+
ThreadFactory factory = new ThreadFactoryBuilder()
27+
.setNameFormat("SimpleORM/FancyWorkers/%s")
28+
.build();
29+
for (int i = 0; i < size; i++) {
30+
workers.add(Executors.newSingleThreadExecutor(factory));
31+
}
32+
}
33+
34+
public Executor ofServer() {
35+
return serverWorker;
36+
}
37+
38+
public Executor of() {
39+
return this;
40+
}
41+
42+
public Executor of(String ns) {
43+
cursor++;
44+
return workers.get(ns.hashCode() % size);
45+
}
46+
47+
@Override
48+
public void execute(Runnable command) {
49+
workers.get(cursor++ % size).execute(command);
50+
}
51+
52+
@Override
53+
public void close() {
54+
for (ExecutorService service : workers) {
55+
service.shutdown();
56+
}
57+
}
58+
59+
public void awaitClose(long mills) throws InterruptedException {
60+
for (ExecutorService service : workers) {
61+
Preconditions.checkState(service.awaitTermination(mills, TimeUnit.MILLISECONDS));
62+
}
63+
}
64+
65+
public static class ServerWorker implements Executor {
66+
67+
@Override
68+
public void execute(Runnable command) {
69+
if (Bukkit.isPrimaryThread()) {
70+
command.run();
71+
} else {
72+
Bukkit.getScheduler().runTask(ORM.plugin, command);
73+
}
74+
}
75+
}
76+
}

src/main/java/com/mengcraft/simpleorm/ORM.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.mengcraft.simpleorm.provider.IRedisProvider;
1111
import com.mengcraft.simpleorm.redis.RedisProviders;
1212
import com.zaxxer.hikari.HikariDataSource;
13+
import lombok.Getter;
1314
import lombok.NonNull;
1415
import lombok.SneakyThrows;
1516
import lombok.val;
@@ -25,7 +26,9 @@
2526
import java.util.HashMap;
2627
import java.util.Map;
2728
import java.util.Objects;
29+
import java.util.concurrent.CompletableFuture;
2830
import java.util.function.Supplier;
31+
import java.util.logging.Level;
2932

3033
import static com.mengcraft.simpleorm.lib.Tuple.tuple;
3134

@@ -38,9 +41,11 @@ public class ORM extends JavaPlugin {
3841
private static RedisWrapper globalRedisWrapper;
3942
private static MongoWrapper globalMongoWrapper;
4043
private static DataSource sharedDs;
41-
private static ORM plugin;
44+
static ORM plugin;
4245
private static IDataSourceProvider dataSourceProvider = new DataSourceProvider();
4346
private static IRedisProvider redisProvider;
47+
@Getter
48+
private static FluxWorkers workers;
4449

4550
@Override
4651
public void onLoad() {
@@ -78,6 +83,7 @@ private static void loadExtLibrary(JavaPlugin plugin) {
7883
@SneakyThrows
7984
public void onEnable() {
8085
new MetricsLite(this);
86+
workers = new FluxWorkers(getConfig().getInt("cpus", 8));
8187
if (nil(globalRedisWrapper)) {
8288
if (redisProvider == null) {
8389
FileConfiguration config = getConfig();
@@ -97,6 +103,16 @@ public void onEnable() {
97103
getLogger().info("Welcome!");
98104
}
99105

106+
@Override
107+
public void onDisable() {
108+
workers.close();
109+
try {
110+
workers.awaitClose(Integer.MAX_VALUE);
111+
} catch (InterruptedException e) {
112+
getLogger().log(Level.WARNING, "Error occurred while await workers closed", e);
113+
}
114+
}
115+
100116
public static boolean nil(Object any) {
101117
return any == null;
102118
}
@@ -251,4 +267,20 @@ public static void setRedisProvider(IRedisProvider redisProvider) {
251267
Preconditions.checkState(!isFullyEnabled(), "Cannot be set after ORM enabled");
252268
ORM.redisProvider = redisProvider;
253269
}
270+
271+
public static CompletableFuture<Void> enqueue(Runnable runnable) {
272+
return CompletableFuture.runAsync(runnable, workers.of());
273+
}
274+
275+
public static CompletableFuture<Void> enqueue(String ns, Runnable runnable) {
276+
return CompletableFuture.runAsync(runnable, workers.of(ns));
277+
}
278+
279+
public static <T> CompletableFuture<T> enqueue(Supplier<T> supplier) {
280+
return CompletableFuture.supplyAsync(supplier, workers.of());
281+
}
282+
283+
public static <T> CompletableFuture<T> enqueue(String ns, Supplier<T> supplier) {
284+
return CompletableFuture.supplyAsync(supplier, workers.of(ns));
285+
}
254286
}

src/main/resources/config.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@ redis:
1010
password: null
1111

1212
mongo:
13-
url: mongodb://localhost
13+
url: mongodb://localhost
14+
15+
cpus: 8

0 commit comments

Comments
 (0)