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

View File

@ -1,6 +1,7 @@
package net.lamgc.oracle.sentry.script.groovy.trigger; package net.lamgc.oracle.sentry.script.groovy.trigger;
import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.common.util.concurrent.ThreadFactoryBuilder;
import groovy.lang.Closure;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -23,7 +24,7 @@ public class OnceTrigger implements GroovyTrigger {
.build()); .build());
@Override @Override
public void run(Runnable task) { public void run(Closure<?> task) {
EXECUTOR.execute(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.base.Throwables;
import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.common.util.concurrent.ThreadFactoryBuilder;
import groovy.lang.Closure;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
@ -38,7 +39,7 @@ public class TimerTrigger implements GroovyTrigger {
} }
@Override @Override
public void run(Runnable runnable) { public void run(Closure<?> runnable) {
if (trigger == null) { if (trigger == null) {
if (!log.isDebugEnabled()) { if (!log.isDebugEnabled()) {
log.warn("脚本尚未设置 Cron 时间表达式, 任务将不会执行(堆栈信息请检查调试级别日志)."); log.warn("脚本尚未设置 Cron 时间表达式, 任务将不会执行(堆栈信息请检查调试级别日志).");
@ -57,7 +58,21 @@ public class TimerTrigger implements GroovyTrigger {
return; 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("") @TriggerName("")
public class BadAnnotationTrigger extends BaseTestTrigger { 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; package net.lamgc.oracle.sentry.script.groovy.trigger;
import groovy.lang.Closure;
public abstract class BaseTestTrigger implements GroovyTrigger { public abstract class BaseTestTrigger implements GroovyTrigger {
@Override @Override
public void run(Runnable task) { public void run(Closure<?> task) {
throw new UnsupportedOperationException("Unavailable trigger."); throw new UnsupportedOperationException("Unavailable trigger.");
} }
} }