diff --git a/db/tables_xxl_job.sql b/db/tables_xxl_job.sql index 6f4f61c0..d136c4e4 100644 --- a/db/tables_xxl_job.sql +++ b/db/tables_xxl_job.sql @@ -193,7 +193,14 @@ CREATE TABLE XXL_JOB_QRTZ_TRIGGER_LOGGLUE ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; - +CREATE TABLE XXL_JOB_QRTZ_TRIGGER_REGISTRY ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `registry_group` varchar(255) NOT NULL, + `registry_key` varchar(255) NOT NULL, + `registry_value` varchar(255) NOT NULL, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; commit; diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/executor/jetty/XxlJobExecutor.java b/xxl-job-core/src/main/java/com/xxl/job/core/executor/jetty/XxlJobExecutor.java index a9dea6f3..ea9a6e6a 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/executor/jetty/XxlJobExecutor.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/executor/jetty/XxlJobExecutor.java @@ -1,8 +1,10 @@ package com.xxl.job.core.executor.jetty; -import com.xxl.job.core.router.HandlerRouter; import com.xxl.job.core.handler.IJobHandler; import com.xxl.job.core.handler.annotation.JobHander; +import com.xxl.job.core.registry.RegistHelper; +import com.xxl.job.core.router.HandlerRouter; +import com.xxl.job.core.util.IpUtil; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Server; @@ -16,6 +18,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import java.util.Map; +import java.util.concurrent.TimeUnit; /** * Created by xuxueli on 2016/3/2 21:14. @@ -24,15 +27,23 @@ public class XxlJobExecutor implements ApplicationContextAware { private static final Logger logger = LoggerFactory.getLogger(XxlJobExecutor.class); private int port = 9999; + private String appName; + private RegistHelper registHelper; public void setPort(int port) { this.port = port; } + public void setAppName(String appName) { + this.appName = appName; + } + public void setRegistHelper(RegistHelper registHelper) { + this.registHelper = registHelper; + } // ---------------------------------- job server ------------------------------------ Server server = null; public void start() throws Exception { - new Thread(new Runnable() { + Thread executorTnread = new Thread(new Runnable() { @Override public void run() { server = new Server(); @@ -52,14 +63,16 @@ public class XxlJobExecutor implements ApplicationContextAware { try { server.start(); logger.info(">>>>>>>>>>>> xxl-job jetty server start success at port:{}.", port); - server.join(); // block until server ready + registryBeat(); + server.join(); // block until thread stopped logger.info(">>>>>>>>>>>> xxl-job jetty server join success at port:{}.", port); } catch (Exception e) { e.printStackTrace(); } } - }).start(); - + }); + executorTnread.setDaemon(true); // daemon, service jvm, user thread leave >>> daemon leave >>> jvm leave + executorTnread.start(); } public void destroy(){ @@ -72,6 +85,28 @@ public class XxlJobExecutor implements ApplicationContextAware { } } + private void registryBeat(){ + if (registHelper==null && appName==null || appName.trim().length()==0) { + return; + } + Thread registryThread = new Thread(new Runnable() { + @Override + public void run() { + while (true) { + try { + String address = IpUtil.getIp().concat(":").concat(String.valueOf(port)); + registHelper.registry(RegistHelper.RegistType.EXECUTOR.name(), appName, address); + TimeUnit.SECONDS.sleep(15); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + }); + registryThread.setDaemon(true); + registryThread.start(); + } + // ---------------------------------- init job handler ------------------------------------ public static ApplicationContext applicationContext; @Override diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/registry/RegistHelper.java b/xxl-job-core/src/main/java/com/xxl/job/core/registry/RegistHelper.java new file mode 100644 index 00000000..8435596f --- /dev/null +++ b/xxl-job-core/src/main/java/com/xxl/job/core/registry/RegistHelper.java @@ -0,0 +1,12 @@ +package com.xxl.job.core.registry; + +/** + * Created by xuxueli on 16/9/30. + */ +public interface RegistHelper { + + public enum RegistType{ EXECUTOR, ADMIN } + + public int registry(String registGroup, String registryKey, String registryValue); + +} diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/registry/impl/DbRegistHelper.java b/xxl-job-core/src/main/java/com/xxl/job/core/registry/impl/DbRegistHelper.java new file mode 100644 index 00000000..55a9e9b5 --- /dev/null +++ b/xxl-job-core/src/main/java/com/xxl/job/core/registry/impl/DbRegistHelper.java @@ -0,0 +1,28 @@ +package com.xxl.job.core.registry.impl; + +import com.xxl.job.core.registry.RegistHelper; +import com.xxl.job.core.util.DBUtil; + +import javax.sql.DataSource; + +/** + * Created by xuxueli on 16/9/30. + */ +public class DbRegistHelper implements RegistHelper { + + private DataSource dataSource; + public void setDataSource(DataSource dataSource) { + this.dataSource = dataSource; + } + + @Override + public int registry(String registGroup, String registryKey, String registryValue) { + String updateSql = "UPDATE XXL_JOB_QRTZ_TRIGGER_REGISTRY SET `update_time` = NOW() WHERE `registry_group` = ? AND `registry_key` = ? AND `registry_value` = ?"; + String insertSql = "INSERT INTO XXL_JOB_QRTZ_TRIGGER_REGISTRY( `registry_group` , `registry_key` , `registry_value`, `update_time`) VALUES(? , ? , ?, NOW())"; + int ret = DBUtil.update(dataSource, updateSql, new Object[]{registGroup, registryKey, registryValue}); + if (ret<1) { + ret = DBUtil.update(dataSource, insertSql, new Object[]{registGroup, registryKey, registryValue}); + } + return ret; + } +} diff --git a/xxl-job-executor-example/src/main/resources/applicationcontext-xxl-job.xml b/xxl-job-executor-example/src/main/resources/applicationcontext-xxl-job.xml index 7d88eae1..03d00baa 100644 --- a/xxl-job-executor-example/src/main/resources/applicationcontext-xxl-job.xml +++ b/xxl-job-executor-example/src/main/resources/applicationcontext-xxl-job.xml @@ -16,6 +16,15 @@ + + + + + + + + + @@ -34,7 +43,7 @@ - +