From 670d1ca5440bdd38496743d929440be2ccc63d69 Mon Sep 17 00:00:00 2001 From: lizhen Date: Tue, 17 Dec 2019 19:42:17 +0800 Subject: [PATCH 1/2] =?UTF-8?q?refactor:=E4=BF=AE=E6=94=B9=E8=8E=B7?= =?UTF-8?q?=E5=8F=96XxlJob=E6=B3=A8=E8=A7=A3=E6=96=B9=E6=B3=95=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executor/impl/XxlJobSpringExecutor.java | 117 ++++++++++-------- 1 file changed, 68 insertions(+), 49 deletions(-) diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java b/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java index afb192cf..e1c89563 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java @@ -7,14 +7,18 @@ import com.xxl.job.core.handler.IJobHandler; import com.xxl.job.core.handler.annotation.JobHandler; import com.xxl.job.core.handler.annotation.XxlJob; import com.xxl.job.core.handler.impl.MethodJobHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.core.MethodIntrospector; +import org.springframework.core.annotation.AnnotatedElementUtils; import java.lang.reflect.Method; +import java.util.HashMap; import java.util.Map; /** @@ -23,6 +27,7 @@ import java.util.Map; * @author xuxueli 2018-11-01 09:24:52 */ public class XxlJobSpringExecutor extends XxlJobExecutor implements ApplicationContextAware, InitializingBean, DisposableBean { + private static final Logger logger = LoggerFactory.getLogger(XxlJobSpringExecutor.class); // start @@ -75,61 +80,75 @@ public class XxlJobSpringExecutor extends XxlJobExecutor implements ApplicationC if (applicationContext == null) { return; } - // init job handler from method String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { Object bean = applicationContext.getBean(beanDefinitionName); - Method[] methods = bean.getClass().getDeclaredMethods(); - for (Method method: methods) { - XxlJob xxlJob = AnnotationUtils.findAnnotation(method, XxlJob.class); - if (xxlJob != null) { - // name - String name = xxlJob.value(); - if (name.trim().length() == 0) { - throw new RuntimeException("xxl-job method-jobhandler name invalid, for[" + bean.getClass() + "#"+ method.getName() +"] ."); - } - if (loadJobHandler(name) != null) { - throw new RuntimeException("xxl-job jobhandler[" + name + "] naming conflicts."); - } - - // execute method - if (!(method.getParameterTypes()!=null && method.getParameterTypes().length==1 && method.getParameterTypes()[0].isAssignableFrom(String.class))) { - throw new RuntimeException("xxl-job method-jobhandler param-classtype invalid, for[" + bean.getClass() + "#"+ method.getName() +"] , " + - "The correct method format like \" public ReturnT execute(String param) \" ."); - } - if (!method.getReturnType().isAssignableFrom(ReturnT.class)) { - throw new RuntimeException("xxl-job method-jobhandler return-classtype invalid, for[" + bean.getClass() + "#"+ method.getName() +"] , " + - "The correct method format like \" public ReturnT execute(String param) \" ."); - } - method.setAccessible(true); - - // init and destory - Method initMethod = null; - Method destroyMethod = null; - - if(xxlJob.init().trim().length() > 0) { - try { - initMethod = bean.getClass().getDeclaredMethod(xxlJob.init()); - initMethod.setAccessible(true); - } catch (NoSuchMethodException e) { - throw new RuntimeException("xxl-job method-jobhandler initMethod invalid, for[" + bean.getClass() + "#"+ method.getName() +"] ."); - } - } - if(xxlJob.destroy().trim().length() > 0) { - try { - destroyMethod = bean.getClass().getDeclaredMethod(xxlJob.destroy()); - destroyMethod.setAccessible(true); - } catch (NoSuchMethodException e) { - throw new RuntimeException("xxl-job method-jobhandler destroyMethod invalid, for[" + bean.getClass() + "#"+ method.getName() +"] ."); - } - } - - // registry jobhandler - registJobHandler(name, new MethodJobHandler(bean, method, initMethod, destroyMethod)); + Map annotatedMethods = new HashMap<>(); + try { + annotatedMethods = MethodIntrospector.selectMethods(bean.getClass(), + new MethodIntrospector.MetadataLookup() { + @Override + public XxlJob inspect(Method method) { + return AnnotatedElementUtils.findMergedAnnotation(method, XxlJob.class); + } + }); + } catch (Throwable ex) { + if (logger.isDebugEnabled()) { + logger.debug("Could not resolve methods for bean with name '" + beanDefinitionName + "'", ex); } } + + for (Map.Entry methodXxlJobEntry : annotatedMethods.entrySet()) { + Method method = methodXxlJobEntry.getKey(); + XxlJob xxlJob = methodXxlJobEntry.getValue(); + if (xxlJob == null) { + continue; + } + String name = xxlJob.value(); + if (name.trim().length() == 0) { + throw new RuntimeException("xxl-job method-jobhandler name invalid, for[" + bean.getClass() + "#" + method.getName() + "] ."); + } + if (loadJobHandler(name) != null) { + throw new RuntimeException("xxl-job jobhandler[" + name + "] naming conflicts."); + } + + // execute method + if (!(method.getParameterTypes().length == 1 && method.getParameterTypes()[0].isAssignableFrom(String.class))) { + throw new RuntimeException("xxl-job method-jobhandler param-classtype invalid, for[" + bean.getClass() + "#" + method.getName() + "] , " + + "The correct method format like \" public ReturnT execute(String param) \" ."); + } + if (!method.getReturnType().isAssignableFrom(ReturnT.class)) { + throw new RuntimeException("xxl-job method-jobhandler return-classtype invalid, for[" + bean.getClass() + "#" + method.getName() + "] , " + + "The correct method format like \" public ReturnT execute(String param) \" ."); + } + method.setAccessible(true); + + // init and destory + Method initMethod = null; + Method destroyMethod = null; + + if (xxlJob.init().trim().length() > 0) { + try { + initMethod = bean.getClass().getDeclaredMethod(xxlJob.init()); + initMethod.setAccessible(true); + } catch (NoSuchMethodException e) { + throw new RuntimeException("xxl-job method-jobhandler initMethod invalid, for[" + bean.getClass() + "#" + method.getName() + "] ."); + } + } + if (xxlJob.destroy().trim().length() > 0) { + try { + destroyMethod = bean.getClass().getDeclaredMethod(xxlJob.destroy()); + destroyMethod.setAccessible(true); + } catch (NoSuchMethodException e) { + throw new RuntimeException("xxl-job method-jobhandler destroyMethod invalid, for[" + bean.getClass() + "#" + method.getName() + "] ."); + } + } + + // registry jobhandler + registJobHandler(name, new MethodJobHandler(bean, method, initMethod, destroyMethod)); + } } } From cd68af99afa12089a76365c7a4336509c355b2d4 Mon Sep 17 00:00:00 2001 From: lizhen Date: Wed, 18 Dec 2019 17:54:10 +0800 Subject: [PATCH 2/2] =?UTF-8?q?bugfix:=E8=8E=B7=E5=8F=96XxlJob=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3=E6=96=B9=E6=B3=95=E6=97=B6=EF=BC=8C=E9=9D=9E=E5=8D=95?= =?UTF-8?q?=E4=BE=8Bbean=E5=BC=95=E5=8F=91=E7=9A=84=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java b/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java index e1c89563..02b2e079 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java @@ -81,7 +81,7 @@ public class XxlJobSpringExecutor extends XxlJobExecutor implements ApplicationC return; } // init job handler from method - String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames(); + String[] beanDefinitionNames = applicationContext.getBeanNamesForType(Object.class, false, true); for (String beanDefinitionName : beanDefinitionNames) { Object bean = applicationContext.getBean(beanDefinitionName);