diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java b/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java index 945fded4..4fa2eea6 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java @@ -3,6 +3,8 @@ package com.xxl.job.core.executor; import com.xxl.job.core.biz.AdminBiz; import com.xxl.job.core.biz.client.AdminBizClient; import com.xxl.job.core.handler.IJobHandler; +import com.xxl.job.core.handler.annotation.XxlJob; +import com.xxl.job.core.handler.impl.MethodJobHandler; import com.xxl.job.core.log.XxlJobFileAppender; import com.xxl.job.core.server.EmbedServer; import com.xxl.job.core.thread.JobLogFileCleanThread; @@ -13,6 +15,7 @@ import com.xxl.job.core.util.NetUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -110,6 +113,50 @@ public class XxlJobExecutor { } + protected void registerJobHandler(XxlJob xxlJob, Object bean, Method executeMethod){ + if (xxlJob == null) { + return; + } + + String name = xxlJob.value(); + //make and simplify the variables since they'll be called several times later + Class clazz = bean.getClass(); + String methodName = executeMethod.getName(); + if (name.trim().length() == 0) { + throw new RuntimeException("xxl-job method-jobhandler name invalid, for[" + clazz + "#" + methodName + "] ."); + } + if (loadJobHandler(name) != null) { + throw new RuntimeException("xxl-job jobhandler[" + name + "] naming conflicts."); + } + + executeMethod.setAccessible(true); + + // init and destroy + Method initMethod = null; + Method destroyMethod = null; + + if (xxlJob.init().trim().length() > 0) { + try { + initMethod = clazz.getDeclaredMethod(xxlJob.init()); + initMethod.setAccessible(true); + } catch (NoSuchMethodException e) { + throw new RuntimeException("xxl-job method-jobhandler initMethod invalid, for[" + clazz + "#" + methodName + "] ."); + } + } + if (xxlJob.destroy().trim().length() > 0) { + try { + destroyMethod = clazz.getDeclaredMethod(xxlJob.destroy()); + destroyMethod.setAccessible(true); + } catch (NoSuchMethodException e) { + throw new RuntimeException("xxl-job method-jobhandler destroyMethod invalid, for[" + clazz + "#" + methodName + "] ."); + } + } + + // registry jobhandler + registJobHandler(name, new MethodJobHandler(bean, executeMethod, initMethod, destroyMethod)); + + } + // ---------------------- admin-client (rpc invoker) ---------------------- private static List adminBizList; diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSimpleExecutor.java b/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSimpleExecutor.java index d1b413a3..b262f4a5 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSimpleExecutor.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSimpleExecutor.java @@ -57,62 +57,12 @@ public class XxlJobSimpleExecutor extends XxlJobExecutor { for (Object bean: xxlJobBeanList) { // method Method[] methods = bean.getClass().getDeclaredMethods(); - if (methods==null || methods.length==0) { + if (methods.length == 0) { continue; } for (Method executeMethod : methods) { - - // anno XxlJob xxlJob = executeMethod.getAnnotation(XxlJob.class); - 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() + "#" + executeMethod.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) \" ."); - }*/ - - executeMethod.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() + "#" + executeMethod.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() + "#" + executeMethod.getName() + "] ."); - } - } - - // registry jobhandler - registJobHandler(name, new MethodJobHandler(bean, executeMethod, initMethod, destroyMethod)); - - + registerJobHandler(xxlJob, bean, executeMethod); } } 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 0e689f41..2a6829ec 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 @@ -105,56 +105,9 @@ public class XxlJobSpringExecutor extends XxlJobExecutor implements ApplicationC for (Map.Entry methodXxlJobEntry : annotatedMethods.entrySet()) { Method executeMethod = 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() + "#" + executeMethod.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) \" ."); - }*/ - - executeMethod.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() + "#" + executeMethod.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() + "#" + executeMethod.getName() + "] ."); - } - } - - // registry jobhandler - registJobHandler(name, new MethodJobHandler(bean, executeMethod, initMethod, destroyMethod)); + registerJobHandler(xxlJob, bean, executeMethod); } } - } // ---------------------- applicationContext ---------------------- diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java index 7ea8e52d..404416db 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java @@ -245,8 +245,28 @@ public class SampleXxlJob { public void init(){ logger.info("init"); } + public void destroy(){ - logger.info("destory"); + logger.info("destroy"); + } + + /** + * 6、生命周期任务示例:任务初始化与销毁时,支持private方法(但不推荐); + */ + @XxlJob(value = "demoJobHandler3", init = "initForDemoJobHandler3", destroy = "destroyForDemoJobHandler3") + public void demoJobHandler3() throws Exception { + XxlJobHelper.log("XXL-JOB, Hello World."); + } + + private void initForDemoJobHandler3(){ + logger.info("initForDemoJobHandler3"); + } + + /** + * 演示private方法也可以被访问且执行 + */ + public void destroyForDemoJobHandler3(){ + logger.info("destroyForDemoJobHandler3"); }