Skip to content

Commit 2eaf5e3

Browse files
committed
monitor handled tasks
1 parent c791f21 commit 2eaf5e3

File tree

4 files changed

+40
-20
lines changed

4 files changed

+40
-20
lines changed

src/main/java/com/mengcraft/script/HandledTask.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.mengcraft.script;
22

3+
import com.mengcraft.script.util.Utils;
34
import lombok.AccessLevel;
45
import lombok.EqualsAndHashCode;
56
import lombok.RequiredArgsConstructor;
67

8+
import javax.script.Bindings;
79
import java.util.UUID;
810

911
/**
@@ -16,7 +18,7 @@ public class HandledTask implements Runnable {
1618
private final UUID uniqueId = UUID.randomUUID();
1719

1820
private final ScriptPlugin plugin;
19-
private final Runnable run;
21+
private final Bindings invokableObj;
2022
private final int period;
2123

2224
private Runnable complete;
@@ -32,9 +34,14 @@ public void setId(int id) {
3234

3335
@Override
3436
public void run() {
37+
long clock = System.currentTimeMillis();
3538
try {
36-
run.run();
39+
Utils.invoke(invokableObj);
3740
} finally {
41+
clock = System.currentTimeMillis() - clock;
42+
if (clock >= 5) {
43+
plugin.getLogger().warning(String.format("Tasks consume too much time. (%s millis)\n%s", clock, invokableObj.toString()));
44+
}
3845
if (period < 1) complete();
3946
}
4047
}

src/main/java/com/mengcraft/script/ScriptBootstrap.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.mengcraft.script.plugin.ScriptingLoader;
99
import com.mengcraft.script.util.BossBarWrapper;
1010
import com.mengcraft.script.util.Named;
11+
import com.mengcraft.script.util.Utils;
1112
import lombok.RequiredArgsConstructor;
1213
import lombok.SneakyThrows;
1314
import lombok.experimental.var;
@@ -85,6 +86,7 @@ public static ScriptEngine jsEngine() {
8586
public void onLoad() {
8687
plugin = this;
8788
jsEngine = new ScriptEngineManager(getClassLoader()).getEngineByName("nashorn");
89+
Utils.setup(jsEngine);
8890
}
8991

9092
@Override

src/main/java/com/mengcraft/script/ScriptPlugin.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -141,33 +141,33 @@ public boolean depend(List<String> depend, Runnable runnable) {
141141
return call.call();
142142
}
143143

144-
public HandledTask runTask(Runnable runnable) {
145-
return runTask(runnable, 0, -1, false);
144+
public HandledTask runTask(Bindings invokable) {
145+
return runTask(invokable, 0, -1, false);
146146
}
147147

148-
public HandledTask runTask(@NonNull Runnable runnable, int delay, int period, boolean b) {
148+
public HandledTask runTask(@NonNull Bindings invokable, int delay, int period, boolean b) {
149149
Preconditions.checkState(isHandled(), "unloaded");
150-
HandledTask task = new HandledTask(this, runnable, period);
150+
HandledTask task = new HandledTask(this, invokable, period);
151151
tasks.add(task);
152152
task.setId(b ? Bukkit.getScheduler().runTaskTimerAsynchronously(main, task, delay, period).getTaskId()
153153
: Bukkit.getScheduler().runTaskTimer(main, task, delay, period).getTaskId());
154154
return task;
155155
}
156156

157-
public HandledTask runTask(Runnable runnable, int delay, int period) {
158-
return runTask(runnable, delay, period, false);
157+
public HandledTask runTask(Bindings invokable, int delay, int period) {
158+
return runTask(invokable, delay, period, false);
159159
}
160160

161-
public HandledTask runTask(Runnable runnable, int delay, boolean b) {
162-
return runTask(runnable, delay, -1, b);
161+
public HandledTask runTask(Bindings invokable, int delay, boolean b) {
162+
return runTask(invokable, delay, -1, b);
163163
}
164164

165-
public HandledTask runTask(Runnable runnable, int delay) {
166-
return runTask(runnable, delay, -1, false);
165+
public HandledTask runTask(Bindings invokable, int delay) {
166+
return runTask(invokable, delay, -1, false);
167167
}
168168

169-
public HandledTask runTask(Runnable runnable, boolean b) {
170-
return runTask(runnable, 0, -1, b);
169+
public HandledTask runTask(Bindings invokable, boolean b) {
170+
return runTask(invokable, 0, -1, b);
171171
}
172172

173173
boolean remove(HandledCommand i) {

src/main/java/com/mengcraft/script/util/Utils.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,23 @@
22

33
import com.mengcraft.script.ScriptBootstrap;
44
import lombok.SneakyThrows;
5-
import lombok.experimental.var;
65
import org.bukkit.entity.Player;
76
import org.bukkit.event.EventPriority;
87
import org.yaml.snakeyaml.Yaml;
98

109
import javax.script.Bindings;
1110
import javax.script.Invocable;
11+
import javax.script.ScriptEngine;
1212
import java.math.BigDecimal;
1313
import java.util.concurrent.atomic.AtomicInteger;
14+
import java.util.function.Consumer;
1415
import java.util.function.Function;
1516

1617
public class Utils {
1718

1819
private static final Yaml YAML = new Yaml();
1920
private static Function<Object, Bindings> java_from_invoker;
21+
private static Consumer<Bindings> function_invoker;
2022

2123
public static Yaml getYaml() {
2224
return YAML;
@@ -40,13 +42,22 @@ public static void sendBossBar(Player p, BossBarWrapper bar, int tick) {
4042
});
4143
}
4244

45+
@SneakyThrows
46+
public static void setup(ScriptEngine js) {
47+
Bindings bindings = js.createBindings();
48+
js.eval("function apply(a){return Java.from(a);}", bindings);
49+
java_from_invoker = ((Invocable) js).getInterface(bindings, Function.class);
50+
bindings = js.createBindings();
51+
js.eval("function accept(a){a();}", bindings);
52+
function_invoker = ((Invocable) js).getInterface(bindings, Consumer.class);
53+
}
54+
55+
public static void invoke(Bindings bindings) {
56+
function_invoker.accept(bindings);
57+
}
58+
4359
@SneakyThrows
4460
public static <T> Bindings fromJava(T obj) {
45-
if (java_from_invoker == null) {
46-
var js = ScriptBootstrap.jsEngine();
47-
var function = js.eval("(function a(a){return Java.from(a);})");
48-
java_from_invoker = ((Invocable) js).getInterface(function, Function.class);
49-
}
5061
return java_from_invoker.apply(obj);
5162
}
5263

0 commit comments

Comments
 (0)