diff --git a/xxl-job-core/pom.xml b/xxl-job-core/pom.xml index 9b8fa0cd..4c671b82 100644 --- a/xxl-job-core/pom.xml +++ b/xxl-job-core/pom.xml @@ -26,6 +26,12 @@ gson ${gson.version} + + top.jfunc.common + utils + 1.8.3.5 + + 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 9c632a35..cad6e074 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,7 @@ 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.log.XxlJobFileAppender; import com.xxl.job.core.server.EmbedServer; import com.xxl.job.core.thread.JobLogFileCleanThread; @@ -12,10 +13,14 @@ import com.xxl.job.core.util.IpUtil; import com.xxl.job.core.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.ArrayList; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -176,7 +181,33 @@ public class XxlJobExecutor { logger.info(">>>>>>>>>>> xxl-job register jobhandler success, name:{}, jobHandler:{}", name, jobHandler); return jobHandlerRepository.put(name, jobHandler); } + /** + * 根据包扫描结果注册{@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 XxlJob}修改名称 + */ + private static String determineHandlerName(Class jobHandlerClass) { + String name = StrUtil.lowerFirst(jobHandlerClass.getSimpleName()); + if(jobHandlerClass.isAnnotationPresent(XxlJob.class)){ + String value = jobHandlerClass.getAnnotation(XxlJob.class).value(); + if(!"".equals(value)){ + name = value; + } + } + return name; + } // ---------------------- job thread repository ---------------------- private static ConcurrentMap jobThreadRepository = new ConcurrentHashMap(); diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/FramelessApplication.java b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/FramelessApplication.java index e259b8f5..e03179ad 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/FramelessApplication.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/FramelessApplication.java @@ -3,6 +3,7 @@ package com.xxl.job.executor.sample.frameless; import com.xxl.job.executor.sample.frameless.config.FrameLessXxlJobConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import top.jfunc.common.thread.HoldProcessor; import java.util.concurrent.TimeUnit; @@ -18,21 +19,26 @@ public class FramelessApplication { // start FrameLessXxlJobConfig.getInstance().initXxlJobExecutor(); - // Blocks until interrupted - while (true) { - try { - TimeUnit.HOURS.sleep(1); - } catch (InterruptedException e) { - break; - } - } + waitHere(); } catch (Exception e) { logger.error(e.getMessage(), e); - } finally { - // destory - FrameLessXxlJobConfig.getInstance().destoryXxlJobExecutor(); } } + private static void waitHere() { + final HoldProcessor holdProcessor = new HoldProcessor(); + holdProcessor.startAwait(); + logger.info("程序开始等待"); + Runtime.getRuntime().addShutdownHook(new Thread(){ + @Override + public void run() { + logger.info("收到kill 信号,执行清理程序"); + //在关闭的时候释放资源 + FrameLessXxlJobConfig.getInstance().destoryXxlJobExecutor(); + holdProcessor.stopAwait(); + } + }); + } + }