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();
+ }
+ });
+ }
+
}