diff --git a/src/main/java/org/redkale/scheduling/ScheduledFactory.java b/src/main/java/org/redkale/scheduling/ScheduledFactory.java index b514cf4e5..e3e89ebf3 100644 --- a/src/main/java/org/redkale/scheduling/ScheduledFactory.java +++ b/src/main/java/org/redkale/scheduling/ScheduledFactory.java @@ -3,6 +3,8 @@ */ package org.redkale.scheduling; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; import java.lang.ref.WeakReference; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -154,22 +156,27 @@ public class ScheduledFactory { } protected Runnable createRunnable(final WeakReference ref, Method method) { - if (!Modifier.isPublic(method.getModifiers())) { - method.setAccessible(true); - } - return () -> { - try { - Object obj = ref.get(); - if (obj != null) { - if (logger.isLoggable(Level.FINEST)) { - logger.log(Level.FINEST, "schedule task " + method.getDeclaringClass().getSimpleName() + "." + method.getName()); - } - method.invoke(obj); - } - } catch (Exception e) { - logger.log(Level.SEVERE, "schedule task error", e); + try { + if (!Modifier.isPublic(method.getModifiers())) { + method.setAccessible(true); } - }; + MethodHandle mh = MethodHandles.lookup().unreflect(method); + return () -> { + try { + Object obj = ref.get(); + if (obj != null) { + if (logger.isLoggable(Level.FINEST)) { + logger.log(Level.FINEST, "schedule task " + method.getDeclaringClass().getSimpleName() + "." + method.getName()); + } + mh.invoke(obj); + } + } catch (Throwable t) { + logger.log(Level.SEVERE, "schedule task error", t); + } + }; + } catch (IllegalAccessException e) { + throw new RedkaleException(e); + } } protected String getProperty(String value) { diff --git a/src/test/java/org/redkale/test/scheduling/ScheduleService.java b/src/test/java/org/redkale/test/scheduling/ScheduleService.java new file mode 100644 index 000000000..1ad6a9357 --- /dev/null +++ b/src/test/java/org/redkale/test/scheduling/ScheduleService.java @@ -0,0 +1,31 @@ +/* + * + */ +package org.redkale.test.scheduling; + +import org.redkale.annotation.Scheduled; +import org.redkale.service.Service; +import org.redkale.util.Times; + +/** + * + * @author zhangjx + */ +public class ScheduleService implements Service { + + @Scheduled(cron = "0/1 * * * * ?") + public void task1() { + System.out.println(Times.nowMillis() + "每秒-----------执行task1"); + } + + @Scheduled(cron = "0/1 * * * * ?") + public String task2() { + System.out.println(Times.nowMillis() + "每秒*****执行task2"); + return ""; + } + + @Scheduled(cron = "0/1 * * * * ?") + private void task3() { + System.out.println(Times.nowMillis() + "每秒执行task3"); + } +} diff --git a/src/test/java/org/redkale/test/scheduling/ScheduleTest.java b/src/test/java/org/redkale/test/scheduling/ScheduleTest.java new file mode 100644 index 000000000..63f54c240 --- /dev/null +++ b/src/test/java/org/redkale/test/scheduling/ScheduleTest.java @@ -0,0 +1,31 @@ +/* + * + */ +package org.redkale.test.scheduling; + +import org.junit.jupiter.api.Test; +import org.redkale.scheduling.ScheduledFactory; +import org.redkale.util.Utility; + +/** + * + * @author zhangjx + */ +public class ScheduleTest { + + public static void main(String[] args) throws Throwable { + ScheduleTest test = new ScheduleTest(); + test.run(); + } + + @Test + public void run() throws Exception { + ScheduledFactory factory = ScheduledFactory.create(null); + ScheduleService service = new ScheduleService(); + factory.schedule(service); + Utility.sleep(3000); + factory.unschedule(service); + factory.destroy(); + } + +}