refactor: 调整 Trigger 接收闭包的类型, 以便添加新的功能.

调整 Trigger 接收闭包的类型(Runnable -> Closure), 闭包可传递参数, 且 Trigger 为 Groovy 特有(至少目前是这样), 故调整类型以提供更多灵活性.
This commit is contained in:
LamGC 2021-08-20 13:59:06 +08:00
parent cbb1784f5e
commit 6bd28909ae
Signed by: LamGC
GPG Key ID: 6C5AE2A913941E1D
5 changed files with 25 additions and 9 deletions

View File

@ -1,5 +1,7 @@
package net.lamgc.oracle.sentry.script.groovy.trigger;
import groovy.lang.Closure;
/**
* Groovy 脚本的触发器接口.
* <p> 实现该接口并添加 {@link TriggerName} 注解后,
@ -13,6 +15,6 @@ public interface GroovyTrigger {
* <p> 注意, 触发器执行 run 方法不可以阻塞方法返回.
* @param task 触发器需要执行的任务.
*/
void run(Runnable task);
void run(Closure<?> task);
}

View File

@ -1,6 +1,7 @@
package net.lamgc.oracle.sentry.script.groovy.trigger;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import groovy.lang.Closure;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -23,7 +24,7 @@ public class OnceTrigger implements GroovyTrigger {
.build());
@Override
public void run(Runnable task) {
public void run(Closure<?> task) {
EXECUTOR.execute(task);
}
}

View File

@ -2,6 +2,7 @@ package net.lamgc.oracle.sentry.script.groovy.trigger;
import com.google.common.base.Throwables;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import groovy.lang.Closure;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
@ -38,7 +39,7 @@ public class TimerTrigger implements GroovyTrigger {
}
@Override
public void run(Runnable runnable) {
public void run(Closure<?> runnable) {
if (trigger == null) {
if (!log.isDebugEnabled()) {
log.warn("脚本尚未设置 Cron 时间表达式, 任务将不会执行(堆栈信息请检查调试级别日志).");
@ -57,7 +58,21 @@ public class TimerTrigger implements GroovyTrigger {
return;
}
SCHEDULER.schedule(runnable, trigger);
SCHEDULER.schedule(new TimerTaskRunnable(runnable), trigger);
}
private static class TimerTaskRunnable implements Runnable {
private final Closure<?> closure;
private TimerTaskRunnable(Closure<?> closure) {
this.closure = closure;
}
@Override
public void run() {
closure.call();
}
}
}

View File

@ -2,8 +2,4 @@ package net.lamgc.oracle.sentry.script.groovy.trigger;
@TriggerName("")
public class BadAnnotationTrigger extends BaseTestTrigger {
@Override
public void run(Runnable task) {
throw new UnsupportedOperationException("Unavailable trigger.");
}
}

View File

@ -1,8 +1,10 @@
package net.lamgc.oracle.sentry.script.groovy.trigger;
import groovy.lang.Closure;
public abstract class BaseTestTrigger implements GroovyTrigger {
@Override
public void run(Runnable task) {
public void run(Closure<?> task) {
throw new UnsupportedOperationException("Unavailable trigger.");
}
}