From df57942b9162586ce5a4143c835d00f717dfb32b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?tianxiang=20bao=20=EF=BC=88=E5=8C=85=E5=A4=A9=E7=A5=A5?= =?UTF-8?q?=EF=BC=89?= Date: Tue, 15 Oct 2024 15:46:49 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DAgentAware?= =?UTF-8?q?=E5=9B=A0=E4=B8=BA=E5=90=AB=E6=9C=89=E6=9C=AC=E7=B1=BB=E6=88=90?= =?UTF-8?q?=E5=91=98=E5=8F=98=E9=87=8F=E6=8A=A5=E6=A0=88=E6=BA=A2=E5=87=BA?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E3=80=82=20https://gitee.com/dromara/dynamic?= =?UTF-8?q?-tp/issues/IAX904?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dynamictp/extension/agent/AgentAware.java | 21 ++++--- .../dynamictp/agent/AgentAwareTest.java | 55 +++++++++++++++++++ .../agent/MyAgentContainNestWrapper.java | 17 ++++++ .../dynamictp/agent/MyAgentNestWrapper.java | 24 ++++++++ 4 files changed, 108 insertions(+), 9 deletions(-) create mode 100644 test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentContainNestWrapper.java create mode 100644 test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentNestWrapper.java diff --git a/extension/extension-agent/src/main/java/org/dromara/dynamictp/extension/agent/AgentAware.java b/extension/extension-agent/src/main/java/org/dromara/dynamictp/extension/agent/AgentAware.java index a3fc9dc6..2f2d102a 100644 --- a/extension/extension-agent/src/main/java/org/dromara/dynamictp/extension/agent/AgentAware.java +++ b/extension/extension-agent/src/main/java/org/dromara/dynamictp/extension/agent/AgentAware.java @@ -17,6 +17,7 @@ package org.dromara.dynamictp.extension.agent; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ArrayUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -25,10 +26,7 @@ import org.dromara.dynamictp.core.support.task.runnable.DtpRunnable; import java.lang.ref.SoftReference; import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.stream.Collectors; @@ -59,7 +57,7 @@ public class AgentAware extends TaskStatAware { return "agent"; } - private DtpRunnable determineDtpRunnable(List conditionalFields, Runnable r) throws IllegalAccessException { + private DtpRunnable determineDtpRunnable(List conditionalFields, Runnable r, List visitedClass) throws IllegalAccessException { for (Field field : conditionalFields) { if (Objects.isNull(field)) { continue; @@ -69,8 +67,13 @@ public class AgentAware extends TaskStatAware { if (o instanceof DtpRunnable) { return (DtpRunnable) o; } + if (CollUtil.contains(visitedClass, o.getClass())) { + return null; + } else { + visitedClass.add(o.getClass()); + } // 纵向查找 - DtpRunnable dtpRunnable = getDtpRunnable(o.getClass(), o); + DtpRunnable dtpRunnable = getDtpRunnable(o.getClass(), o, visitedClass); if (dtpRunnable != null) { return dtpRunnable; } @@ -78,7 +81,7 @@ public class AgentAware extends TaskStatAware { return null; } - private DtpRunnable getDtpRunnable(Class rClass, Runnable r) throws IllegalAccessException { + private DtpRunnable getDtpRunnable(Class rClass, Runnable r, List visitedClass) throws IllegalAccessException { while (Runnable.class.isAssignableFrom(rClass)) { Field[] declaredFields = rClass.getDeclaredFields(); if (ArrayUtil.isNotEmpty(declaredFields)) { @@ -86,7 +89,7 @@ public class AgentAware extends TaskStatAware { .filter(ele -> Runnable.class.isAssignableFrom(ele.getType())) .collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(conditionFields)) { - DtpRunnable dtpRunnable = determineDtpRunnable(conditionFields, r); + DtpRunnable dtpRunnable = determineDtpRunnable(conditionFields, r, visitedClass); if (Objects.nonNull(dtpRunnable)) { return dtpRunnable; } @@ -107,7 +110,7 @@ public class AgentAware extends TaskStatAware { DtpRunnable dtpRunnable = null; Class rClass = r.getClass(); try { - dtpRunnable = getDtpRunnable(rClass, r); + dtpRunnable = getDtpRunnable(rClass, r, new ArrayList<>()); } catch (IllegalAccessException e) { log.error("getDtpRunnable Error", e); } diff --git a/test/test-extension/src/test/java/org/dromara/dynamictp/agent/AgentAwareTest.java b/test/test-extension/src/test/java/org/dromara/dynamictp/agent/AgentAwareTest.java index ecd38904..aa3dc4db 100644 --- a/test/test-extension/src/test/java/org/dromara/dynamictp/agent/AgentAwareTest.java +++ b/test/test-extension/src/test/java/org/dromara/dynamictp/agent/AgentAwareTest.java @@ -17,14 +17,20 @@ package org.dromara.dynamictp.agent; +import org.dromara.dynamictp.core.support.ThreadPoolBuilder; import org.dromara.dynamictp.extension.agent.AgentAware; import org.dromara.dynamictp.core.support.task.runnable.DtpRunnable; +import org.junit.Assert; import org.junit.Test; import org.junit.jupiter.api.Assertions; import org.springframework.util.ReflectionUtils; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; public class AgentAwareTest { @@ -124,4 +130,53 @@ public class AgentAwareTest { Assertions.assertTrue(result == dtpRunnable); } + + @Test + public void testNestRunnable() throws InvocationTargetException, IllegalAccessException { + + Runnable runnable = () -> System.out.println("test"); + DtpRunnable dtpRunnable = new DtpRunnable(runnable, runnable, "test"); + MyAgentNestWrapper myAgentNestWrapper = new MyAgentNestWrapper(dtpRunnable); + Method getDtpRunnableInstance = ReflectionUtils.findMethod(AgentAware.class, "getDtpRunnableInstance", Runnable.class); + getDtpRunnableInstance.setAccessible(true); + Object result = getDtpRunnableInstance.invoke(new AgentAware(), myAgentNestWrapper); + Assertions.assertTrue(dtpRunnable == dtpRunnable); + } + + @Test + public void testContainNestRunnable() throws InvocationTargetException, IllegalAccessException { + + Runnable runnable = () -> System.out.println("test"); + DtpRunnable dtpRunnable = new DtpRunnable(runnable, runnable, "test"); + MyAgentNestWrapper myAgentNestWrapper = new MyAgentNestWrapper(dtpRunnable); + + MyAgentContainNestWrapper myAgentContainNestWrapper = new MyAgentContainNestWrapper(myAgentNestWrapper); + + Method getDtpRunnableInstance = ReflectionUtils.findMethod(AgentAware.class, "getDtpRunnableInstance", Runnable.class); + getDtpRunnableInstance.setAccessible(true); + Object result = getDtpRunnableInstance.invoke(new AgentAware(), myAgentContainNestWrapper); + Assertions.assertTrue(dtpRunnable == dtpRunnable); + } + + @Test + public void testScheduledThreadPoolExecutor() throws InterruptedException { + ScheduledExecutorService scheduledExecutorService = ThreadPoolBuilder.newBuilder() + .dynamic(true) + .corePoolSize(1) + .scheduled() + .buildScheduled(); + + AtomicInteger count = new AtomicInteger(); + CountDownLatch downLatch = new CountDownLatch(3); + scheduledExecutorService.scheduleAtFixedRate(() -> { + if (count.get() >= 3) { + throw new RuntimeException("down"); + } + count.incrementAndGet(); + downLatch.countDown(); + }, 1, 1, TimeUnit.SECONDS); + + downLatch.await(); + Assert.assertEquals(3, count.get()); + } } diff --git a/test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentContainNestWrapper.java b/test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentContainNestWrapper.java new file mode 100644 index 00000000..956e0c42 --- /dev/null +++ b/test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentContainNestWrapper.java @@ -0,0 +1,17 @@ +package org.dromara.dynamictp.agent; + +public class MyAgentContainNestWrapper implements Runnable { + + private MyAgentNestWrapper agentNestWrapper; + + public MyAgentContainNestWrapper(MyAgentNestWrapper agentNestWrapper) { + this.agentNestWrapper = agentNestWrapper; + } + + @Override + public void run() { + System.out.println("before"); + agentNestWrapper.run(); + System.out.println("after"); + } +} diff --git a/test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentNestWrapper.java b/test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentNestWrapper.java new file mode 100644 index 00000000..b6257374 --- /dev/null +++ b/test/test-extension/src/test/java/org/dromara/dynamictp/agent/MyAgentNestWrapper.java @@ -0,0 +1,24 @@ +package org.dromara.dynamictp.agent; + +import org.dromara.dynamictp.core.support.task.runnable.DtpRunnable; + +public class MyAgentNestWrapper implements Runnable { + + private MyAgentNestWrapper myAgentNestWrapper = this; + + private DtpRunnable dtpRunnable; + + public MyAgentNestWrapper(DtpRunnable dtpRunnable) { + this.dtpRunnable = dtpRunnable; + } + + @Override + public void run() { + System.out.println("before"); + try { + dtpRunnable.run(); + } finally { + System.out.println("finally"); + } + } +} -- Gitee From 338f88ef163f78a57529704715b54ac608205dac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?tianxiang=20bao=20=EF=BC=88=E5=8C=85=E5=A4=A9=E7=A5=A5?= =?UTF-8?q?=EF=BC=89?= Date: Tue, 15 Oct 2024 15:56:53 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DAgentAware?= =?UTF-8?q?=E5=9B=A0=E4=B8=BA=E5=90=AB=E6=9C=89=E6=9C=AC=E7=B1=BB=E6=88=90?= =?UTF-8?q?=E5=91=98=E5=8F=98=E9=87=8F=E6=8A=A5=E6=A0=88=E6=BA=A2=E5=87=BA?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E3=80=82=20=E4=BD=BF=E7=94=A8Set=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2List=20https://gitee.com/dromara/dynamic-tp/issues/IAX?= =?UTF-8?q?904?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/dynamictp/extension/agent/AgentAware.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extension/extension-agent/src/main/java/org/dromara/dynamictp/extension/agent/AgentAware.java b/extension/extension-agent/src/main/java/org/dromara/dynamictp/extension/agent/AgentAware.java index 2f2d102a..f09ee8d7 100644 --- a/extension/extension-agent/src/main/java/org/dromara/dynamictp/extension/agent/AgentAware.java +++ b/extension/extension-agent/src/main/java/org/dromara/dynamictp/extension/agent/AgentAware.java @@ -57,7 +57,7 @@ public class AgentAware extends TaskStatAware { return "agent"; } - private DtpRunnable determineDtpRunnable(List conditionalFields, Runnable r, List visitedClass) throws IllegalAccessException { + private DtpRunnable determineDtpRunnable(List conditionalFields, Runnable r, Set visitedClass) throws IllegalAccessException { for (Field field : conditionalFields) { if (Objects.isNull(field)) { continue; @@ -81,7 +81,7 @@ public class AgentAware extends TaskStatAware { return null; } - private DtpRunnable getDtpRunnable(Class rClass, Runnable r, List visitedClass) throws IllegalAccessException { + private DtpRunnable getDtpRunnable(Class rClass, Runnable r, Set visitedClass) throws IllegalAccessException { while (Runnable.class.isAssignableFrom(rClass)) { Field[] declaredFields = rClass.getDeclaredFields(); if (ArrayUtil.isNotEmpty(declaredFields)) { @@ -110,7 +110,7 @@ public class AgentAware extends TaskStatAware { DtpRunnable dtpRunnable = null; Class rClass = r.getClass(); try { - dtpRunnable = getDtpRunnable(rClass, r, new ArrayList<>()); + dtpRunnable = getDtpRunnable(rClass, r, new HashSet<>()); } catch (IllegalAccessException e) { log.error("getDtpRunnable Error", e); } -- Gitee