diff --git a/xxl-job-core/pom.xml b/xxl-job-core/pom.xml index 6969985a..68f36292 100644 --- a/xxl-job-core/pom.xml +++ b/xxl-job-core/pom.xml @@ -52,6 +52,14 @@ test + + + top.jfunc.common + utils + 1.8.2.3 + + + \ No newline at end of file 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 e617becc..389234d1 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 @@ -4,6 +4,7 @@ import com.xxl.job.core.biz.AdminBiz; import com.xxl.job.core.biz.ExecutorBiz; import com.xxl.job.core.biz.impl.ExecutorBizImpl; import com.xxl.job.core.handler.IJobHandler; +import com.xxl.job.core.handler.annotation.JobHandler; import com.xxl.job.core.log.XxlJobFileAppender; import com.xxl.job.core.thread.ExecutorRegistryThread; import com.xxl.job.core.thread.JobLogFileCleanThread; @@ -21,6 +22,9 @@ import com.xxl.rpc.util.IpUtil; import com.xxl.rpc.util.NetUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import top.jfunc.common.utils.BeanUtil; +import top.jfunc.common.utils.ClassUtil; +import top.jfunc.common.utils.StrUtil; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -223,18 +227,49 @@ public class XxlJobExecutor { } - // ---------------------- job handler repository ---------------------- + /// ---------------------- job handler repository ---------------------- + private static ConcurrentMap jobHandlerRepository = new ConcurrentHashMap(); + public static IJobHandler loadJobHandler(String name){ + return jobHandlerRepository.get(name); + } + public static IJobHandler registJobHandler(String name, IJobHandler jobHandler){ logger.info(">>>>>>>>>>> xxl-job register jobhandler success, name:{}, jobHandler:{}", name, jobHandler); return jobHandlerRepository.put(name, jobHandler); } - public static IJobHandler loadJobHandler(String name){ - return jobHandlerRepository.get(name); + + /** + * 根据包扫描结果注册{@link IJobHandler},包下所有{@link IJobHandler}子类都扫描进 + */ + public static void registJobHandler(String... packages){ + for (String onePackage : packages) { + Set> jobHandlerClasses = ClassUtil.scanPackageBySuper(onePackage, true, IJobHandler.class); + for (Class jobHandlerClass : jobHandlerClasses) { + String name = determineHandlerName(jobHandlerClass); + IJobHandler jobHandler = BeanUtil.newInstance(jobHandlerClass); + registJobHandler(name , jobHandler); + } + } } + /** + * 名字默认是类名首字母小写,可以使用{@link JobHandler}修改名称 + */ + private static String determineHandlerName(Class jobHandlerClass) { + String name = StrUtil.lowerFirst(jobHandlerClass.getSimpleName()); + if(jobHandlerClass.isAnnotationPresent(JobHandler.class)){ + String value = jobHandlerClass.getAnnotation(JobHandler.class).value(); + if(!"".equals(value)){ + name = value; + } + } + return name; + } + + + /// ---------------------- job thread repository ---------------------- - // ---------------------- job thread repository ---------------------- private static ConcurrentMap jobThreadRepository = new ConcurrentHashMap(); public static JobThread registJobThread(int jobId, IJobHandler handler, String removeOldReason){ JobThread newJobThread = new JobThread(jobId, handler);