From 54f9b68b3d6f18b5f63a06b90443ea9fc07d8730 Mon Sep 17 00:00:00 2001 From: redkale Date: Tue, 5 Dec 2023 17:44:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95=E7=94=A8?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../redkale/scheduling/ScheduledFactory.java | 37 +++++++++++-------- .../test/scheduling/ScheduleService.java | 31 ++++++++++++++++ .../redkale/test/scheduling/ScheduleTest.java | 31 ++++++++++++++++ 3 files changed, 84 insertions(+), 15 deletions(-) create mode 100644 src/test/java/org/redkale/test/scheduling/ScheduleService.java create mode 100644 src/test/java/org/redkale/test/scheduling/ScheduleTest.java 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(); + } + +}