迁移 springboot
10
pom.xml
|
@ -29,9 +29,8 @@
|
||||||
<javax.servlet-api.version>3.1.0</javax.servlet-api.version>
|
<javax.servlet-api.version>3.1.0</javax.servlet-api.version>
|
||||||
<javax.servlet.jsp-api.version>2.3.3</javax.servlet.jsp-api.version>
|
<javax.servlet.jsp-api.version>2.3.3</javax.servlet.jsp-api.version>
|
||||||
|
|
||||||
<spring.version>4.3.19.RELEASE</spring.version>
|
<spring.version>4.3.20.RELEASE</spring.version>
|
||||||
<jackson.version>2.9.6</jackson.version>
|
<jackson.version>2.9.7</jackson.version>
|
||||||
<aspectjweaver.version>1.8.13</aspectjweaver.version>
|
|
||||||
<slf4j-api.version>1.7.25</slf4j-api.version>
|
<slf4j-api.version>1.7.25</slf4j-api.version>
|
||||||
<freemarker.version>2.3.28</freemarker.version>
|
<freemarker.version>2.3.28</freemarker.version>
|
||||||
<junit.version>4.12</junit.version>
|
<junit.version>4.12</junit.version>
|
||||||
|
@ -53,7 +52,10 @@
|
||||||
<groovy-all.version>2.4.15</groovy-all.version>
|
<groovy-all.version>2.4.15</groovy-all.version>
|
||||||
<quartz.version>2.3.0</quartz.version>
|
<quartz.version>2.3.0</quartz.version>
|
||||||
|
|
||||||
<spring-boot.version>1.5.16.RELEASE</spring-boot.version>
|
<spring-boot.version>1.5.17.RELEASE</spring-boot.version>
|
||||||
|
<mybatis-spring-boot-starter.version>1.3.2</mybatis-spring-boot-starter.version>
|
||||||
|
|
||||||
|
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
FROM tomcat:8.0-jre8-slim
|
FROM openjdk:7-jre-slim
|
||||||
MAINTAINER xuxueli
|
MAINTAINER xuxueli
|
||||||
|
|
||||||
ADD target/xxl-job-admin*.war /usr/local/tomcat/webapps/xxl-job-admin.war
|
ENV PARAMS=""
|
||||||
|
|
||||||
CMD ["catalina.sh", "run"]
|
ADD target/xxl-conf-admin-*.jar /app.jar
|
||||||
|
|
||||||
|
ENTRYPOINT ["sh","-c","java -jar /app.jar $PARAMS"]
|
|
@ -7,77 +7,56 @@
|
||||||
<version>2.0.0-SNAPSHOT</version>
|
<version>2.0.0-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>xxl-job-admin</artifactId>
|
<artifactId>xxl-job-admin</artifactId>
|
||||||
<packaging>war</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
|
<version>${spring-boot.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<!-- springframe start -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework</groupId>
|
|
||||||
<artifactId>spring-webmvc</artifactId>
|
|
||||||
<version>${spring.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework</groupId>
|
|
||||||
<artifactId>spring-context-support</artifactId>
|
|
||||||
<version>${spring.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework</groupId>
|
|
||||||
<artifactId>spring-orm</artifactId>
|
|
||||||
<version>${spring.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework</groupId>
|
|
||||||
<artifactId>spring-test</artifactId>
|
|
||||||
<version>${spring.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<!-- springframe end -->
|
|
||||||
<!-- aspectjweaver (support spring aop) -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.aspectj</groupId>
|
|
||||||
<artifactId>aspectjweaver</artifactId>
|
|
||||||
<version>${aspectjweaver.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<!-- jackson (support spring json) -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
|
||||||
<artifactId>jackson-databind</artifactId>
|
|
||||||
<version>${jackson.version}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- servlet -->
|
<!-- starter-web:spring-webmvc + autoconfigure + logback + yaml + tomcat -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>javax.servlet-api</artifactId>
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
<version>${javax.servlet-api.version}</version>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!-- starter-test:junit + spring-test + mockito -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet.jsp</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>javax.servlet.jsp-api</artifactId>
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
<version>${javax.servlet.jsp-api.version}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- freemarker -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.freemarker</groupId>
|
|
||||||
<artifactId>freemarker</artifactId>
|
|
||||||
<version>${freemarker.version}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- slf4j -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.slf4j</groupId>
|
|
||||||
<artifactId>slf4j-log4j12</artifactId>
|
|
||||||
<version>${slf4j-api.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<!-- junit -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>junit</groupId>
|
|
||||||
<artifactId>junit</artifactId>
|
|
||||||
<version>${junit.version}</version>
|
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- freemarker-starter -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-freemarker</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- mybatis-starter:mybatis + mybatis-spring + tomcat-jdbc(default) -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mybatis.spring.boot</groupId>
|
||||||
|
<artifactId>mybatis-spring-boot-starter</artifactId>
|
||||||
|
<version>${mybatis-spring-boot-starter.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- mysql -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>mysql</groupId>
|
||||||
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
<version>${mysql-connector-java.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<!-- commons-collections4 -->
|
<!-- commons-collections4 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.commons</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
|
@ -97,36 +76,6 @@
|
||||||
<version>${commons-email.version}</version>
|
<version>${commons-email.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- c3p0 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.mchange</groupId>
|
|
||||||
<artifactId>c3p0</artifactId>
|
|
||||||
<version>${c3p0.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<!-- mysql-connector -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>mysql</groupId>
|
|
||||||
<artifactId>mysql-connector-java</artifactId>
|
|
||||||
<version>${mysql-connector-java.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<!-- mybatis-spring -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.mybatis</groupId>
|
|
||||||
<artifactId>mybatis-spring</artifactId>
|
|
||||||
<version>${mybatis-spring.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.mybatis</groupId>
|
|
||||||
<artifactId>mybatis</artifactId>
|
|
||||||
<version>${mybatis.version}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- httpclient -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.httpcomponents</groupId>
|
|
||||||
<artifactId>httpclient</artifactId>
|
|
||||||
<version>${httpclient.version}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- quartz :quartz-2.2.3/c3p0-0.9.1.1/slf4j-api-1.6.6 -->
|
<!-- quartz :quartz-2.2.3/c3p0-0.9.1.1/slf4j-api-1.6.6 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -135,6 +84,7 @@
|
||||||
<version>${quartz.version}</version>
|
<version>${quartz.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<!-- xxl-job-core -->
|
<!-- xxl-job-core -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.xuxueli</groupId>
|
<groupId>com.xuxueli</groupId>
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.xxl.job.admin;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xuxueli 2018-10-28 00:38:13
|
||||||
|
*/
|
||||||
|
@SpringBootApplication
|
||||||
|
public class XxlJobAdminApplication {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(XxlJobAdminApplication.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
package com.xxl.job.admin.controller;
|
package com.xxl.job.admin.controller;
|
||||||
|
|
||||||
|
import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
|
||||||
import com.xxl.job.admin.core.model.XxlJobGroup;
|
import com.xxl.job.admin.core.model.XxlJobGroup;
|
||||||
import com.xxl.job.admin.core.model.XxlJobRegistry;
|
import com.xxl.job.admin.core.model.XxlJobRegistry;
|
||||||
import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
|
import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
|
||||||
|
@ -115,7 +116,7 @@ public class JobGroupController {
|
||||||
|
|
||||||
private List<String> findRegistryByAppName(String appNameParam){
|
private List<String> findRegistryByAppName(String appNameParam){
|
||||||
HashMap<String, List<String>> appAddressMap = new HashMap<String, List<String>>();
|
HashMap<String, List<String>> appAddressMap = new HashMap<String, List<String>>();
|
||||||
List<XxlJobRegistry> list = XxlJobDynamicScheduler.xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT);
|
List<XxlJobRegistry> list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAll(RegistryConfig.DEAD_TIMEOUT);
|
||||||
if (list != null) {
|
if (list != null) {
|
||||||
for (XxlJobRegistry item: list) {
|
for (XxlJobRegistry item: list) {
|
||||||
if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {
|
if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {
|
||||||
|
|
|
@ -3,6 +3,7 @@ package com.xxl.job.admin.controller.interceptor;
|
||||||
import com.xxl.job.admin.core.util.FtlUtil;
|
import com.xxl.job.admin.core.util.FtlUtil;
|
||||||
import com.xxl.job.admin.core.util.I18nUtil;
|
import com.xxl.job.admin.core.util.I18nUtil;
|
||||||
import org.apache.commons.lang3.ArrayUtils;
|
import org.apache.commons.lang3.ArrayUtils;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.web.servlet.ModelAndView;
|
import org.springframework.web.servlet.ModelAndView;
|
||||||
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
|
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
|
||||||
|
|
||||||
|
@ -16,6 +17,7 @@ import java.util.HashMap;
|
||||||
*
|
*
|
||||||
* @author xuxueli 2015-12-12 18:09:04
|
* @author xuxueli 2015-12-12 18:09:04
|
||||||
*/
|
*/
|
||||||
|
@Component
|
||||||
public class CookieInterceptor extends HandlerInterceptorAdapter {
|
public class CookieInterceptor extends HandlerInterceptorAdapter {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -4,6 +4,7 @@ import com.xxl.job.admin.controller.annotation.PermessionLimit;
|
||||||
import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
|
import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
|
||||||
import com.xxl.job.admin.core.util.CookieUtil;
|
import com.xxl.job.admin.core.util.CookieUtil;
|
||||||
import org.apache.commons.codec.digest.DigestUtils;
|
import org.apache.commons.codec.digest.DigestUtils;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.web.method.HandlerMethod;
|
import org.springframework.web.method.HandlerMethod;
|
||||||
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
|
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
|
||||||
|
|
||||||
|
@ -16,23 +17,25 @@ import java.math.BigInteger;
|
||||||
*
|
*
|
||||||
* @author xuxueli 2015-12-12 18:09:04
|
* @author xuxueli 2015-12-12 18:09:04
|
||||||
*/
|
*/
|
||||||
|
@Component
|
||||||
public class PermissionInterceptor extends HandlerInterceptorAdapter {
|
public class PermissionInterceptor extends HandlerInterceptorAdapter {
|
||||||
|
|
||||||
|
|
||||||
public static final String LOGIN_IDENTITY_KEY = "XXL_JOB_LOGIN_IDENTITY";
|
public static final String LOGIN_IDENTITY_KEY = "XXL_JOB_LOGIN_IDENTITY";
|
||||||
public static final String LOGIN_IDENTITY_TOKEN;
|
private static String LOGIN_IDENTITY_TOKEN;
|
||||||
static {
|
public static String getLoginIdentityToken() {
|
||||||
String username = XxlJobAdminConfig.getAdminConfig().getLoginUsername();
|
if (LOGIN_IDENTITY_TOKEN == null) {
|
||||||
String password = XxlJobAdminConfig.getAdminConfig().getLoginPassword();
|
String username = XxlJobAdminConfig.getAdminConfig().getLoginUsername();
|
||||||
|
String password = XxlJobAdminConfig.getAdminConfig().getLoginPassword();
|
||||||
// login token
|
|
||||||
String tokenTmp = DigestUtils.md5Hex(username + "_" + password);
|
|
||||||
tokenTmp = new BigInteger(1, tokenTmp.getBytes()).toString(16);
|
|
||||||
|
|
||||||
LOGIN_IDENTITY_TOKEN = tokenTmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// login token
|
||||||
|
String tokenTmp = DigestUtils.md5Hex(username + "_" + password);
|
||||||
|
tokenTmp = new BigInteger(1, tokenTmp.getBytes()).toString(16);
|
||||||
|
|
||||||
|
LOGIN_IDENTITY_TOKEN = tokenTmp;
|
||||||
|
}
|
||||||
|
return LOGIN_IDENTITY_TOKEN;
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean login(HttpServletResponse response, String username, String password, boolean ifRemember){
|
public static boolean login(HttpServletResponse response, String username, String password, boolean ifRemember){
|
||||||
|
|
||||||
|
@ -40,12 +43,12 @@ public class PermissionInterceptor extends HandlerInterceptorAdapter {
|
||||||
String tokenTmp = DigestUtils.md5Hex(username + "_" + password);
|
String tokenTmp = DigestUtils.md5Hex(username + "_" + password);
|
||||||
tokenTmp = new BigInteger(1, tokenTmp.getBytes()).toString(16);
|
tokenTmp = new BigInteger(1, tokenTmp.getBytes()).toString(16);
|
||||||
|
|
||||||
if (!LOGIN_IDENTITY_TOKEN.equals(tokenTmp)){
|
if (!getLoginIdentityToken().equals(tokenTmp)){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// do login
|
// do login
|
||||||
CookieUtil.set(response, LOGIN_IDENTITY_KEY, LOGIN_IDENTITY_TOKEN, ifRemember);
|
CookieUtil.set(response, LOGIN_IDENTITY_KEY, getLoginIdentityToken(), ifRemember);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
public static void logout(HttpServletRequest request, HttpServletResponse response){
|
public static void logout(HttpServletRequest request, HttpServletResponse response){
|
||||||
|
@ -53,7 +56,7 @@ public class PermissionInterceptor extends HandlerInterceptorAdapter {
|
||||||
}
|
}
|
||||||
public static boolean ifLogin(HttpServletRequest request){
|
public static boolean ifLogin(HttpServletRequest request){
|
||||||
String indentityInfo = CookieUtil.getValue(request, LOGIN_IDENTITY_KEY);
|
String indentityInfo = CookieUtil.getValue(request, LOGIN_IDENTITY_KEY);
|
||||||
if (indentityInfo==null || !LOGIN_IDENTITY_TOKEN.equals(indentityInfo.trim())) {
|
if (indentityInfo==null || !getLoginIdentityToken().equals(indentityInfo.trim())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.xxl.job.admin.controller.interceptor;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
||||||
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* web mvc config
|
||||||
|
*
|
||||||
|
* @author xuxueli 2018-04-02 20:48:20
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
public class WebMvcConfig extends WebMvcConfigurerAdapter {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private PermissionInterceptor permissionInterceptor;
|
||||||
|
@Resource
|
||||||
|
private CookieInterceptor cookieInterceptor;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addInterceptors(InterceptorRegistry registry) {
|
||||||
|
registry.addInterceptor(permissionInterceptor).addPathPatterns("/**");
|
||||||
|
registry.addInterceptor(cookieInterceptor).addPathPatterns("/**");
|
||||||
|
super.addInterceptors(registry);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -4,6 +4,7 @@ import com.xxl.job.core.biz.model.ReturnT;
|
||||||
import com.xxl.job.core.util.JacksonUtil;
|
import com.xxl.job.core.util.JacksonUtil;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import org.springframework.web.method.HandlerMethod;
|
import org.springframework.web.method.HandlerMethod;
|
||||||
import org.springframework.web.servlet.HandlerExceptionResolver;
|
import org.springframework.web.servlet.HandlerExceptionResolver;
|
||||||
|
@ -15,8 +16,10 @@ import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* common exception resolver
|
* common exception resolver
|
||||||
|
*
|
||||||
* @author xuxueli 2016-1-6 19:22:18
|
* @author xuxueli 2016-1-6 19:22:18
|
||||||
*/
|
*/
|
||||||
|
@Component
|
||||||
public class WebExceptionResolver implements HandlerExceptionResolver {
|
public class WebExceptionResolver implements HandlerExceptionResolver {
|
||||||
private static transient Logger logger = LoggerFactory.getLogger(WebExceptionResolver.class);
|
private static transient Logger logger = LoggerFactory.getLogger(WebExceptionResolver.class);
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,16 @@
|
||||||
package com.xxl.job.admin.core.conf;
|
package com.xxl.job.admin.core.conf;
|
||||||
|
|
||||||
|
import com.xxl.job.admin.dao.XxlJobGroupDao;
|
||||||
|
import com.xxl.job.admin.dao.XxlJobInfoDao;
|
||||||
|
import com.xxl.job.admin.dao.XxlJobLogDao;
|
||||||
|
import com.xxl.job.admin.dao.XxlJobRegistryDao;
|
||||||
|
import com.xxl.job.core.biz.AdminBiz;
|
||||||
import org.springframework.beans.factory.InitializingBean;
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* xxl-job config
|
* xxl-job config
|
||||||
*
|
*
|
||||||
|
@ -21,6 +28,8 @@ public class XxlJobAdminConfig implements InitializingBean{
|
||||||
adminConfig = this;
|
adminConfig = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// conf
|
||||||
|
|
||||||
@Value("${xxl.job.mail.host}")
|
@Value("${xxl.job.mail.host}")
|
||||||
private String mailHost;
|
private String mailHost;
|
||||||
|
|
||||||
|
@ -48,6 +57,22 @@ public class XxlJobAdminConfig implements InitializingBean{
|
||||||
@Value("${xxl.job.i18n}")
|
@Value("${xxl.job.i18n}")
|
||||||
private String i18n;
|
private String i18n;
|
||||||
|
|
||||||
|
@Value("${xxl.job.accessToken}")
|
||||||
|
private String accessToken;
|
||||||
|
|
||||||
|
// dao, service
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
public XxlJobLogDao xxlJobLogDao;
|
||||||
|
@Resource
|
||||||
|
public XxlJobInfoDao xxlJobInfoDao;
|
||||||
|
@Resource
|
||||||
|
public XxlJobRegistryDao xxlJobRegistryDao;
|
||||||
|
@Resource
|
||||||
|
public XxlJobGroupDao xxlJobGroupDao;
|
||||||
|
@Resource
|
||||||
|
public AdminBiz adminBiz;
|
||||||
|
|
||||||
|
|
||||||
public String getMailHost() {
|
public String getMailHost() {
|
||||||
return mailHost;
|
return mailHost;
|
||||||
|
@ -85,4 +110,28 @@ public class XxlJobAdminConfig implements InitializingBean{
|
||||||
return i18n;
|
return i18n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getAccessToken() {
|
||||||
|
return accessToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
public XxlJobLogDao getXxlJobLogDao() {
|
||||||
|
return xxlJobLogDao;
|
||||||
|
}
|
||||||
|
|
||||||
|
public XxlJobInfoDao getXxlJobInfoDao() {
|
||||||
|
return xxlJobInfoDao;
|
||||||
|
}
|
||||||
|
|
||||||
|
public XxlJobRegistryDao getXxlJobRegistryDao() {
|
||||||
|
return xxlJobRegistryDao;
|
||||||
|
}
|
||||||
|
|
||||||
|
public XxlJobGroupDao getXxlJobGroupDao() {
|
||||||
|
return xxlJobGroupDao;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdminBiz getAdminBiz() {
|
||||||
|
return adminBiz;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
package com.xxl.job.admin.core.conf;
|
||||||
|
|
||||||
|
import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
|
||||||
|
import org.quartz.Scheduler;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.core.io.ClassPathResource;
|
||||||
|
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
|
||||||
|
|
||||||
|
import javax.sql.DataSource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xuxueli 2018-10-28 00:18:17
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
public class XxlJobDynamicSchedulerConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public SchedulerFactoryBean getSchedulerFactoryBean(DataSource dataSource){
|
||||||
|
|
||||||
|
SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
|
||||||
|
schedulerFactory.setDataSource(dataSource);
|
||||||
|
schedulerFactory.setAutoStartup(true); // 自动启动
|
||||||
|
schedulerFactory.setStartupDelay(20); // 延时启动,应用启动成功后在启动
|
||||||
|
schedulerFactory.setOverwriteExistingJobs(true); // 覆盖DB中JOB:true、以数据库中已经存在的为准:false
|
||||||
|
schedulerFactory.setApplicationContextSchedulerContextKey("applicationContext");
|
||||||
|
schedulerFactory.setConfigLocation(new ClassPathResource("quartz.properties"));
|
||||||
|
|
||||||
|
return schedulerFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean(initMethod = "start", destroyMethod = "destroy")
|
||||||
|
public XxlJobDynamicScheduler getXxlJobDynamicScheduler(SchedulerFactoryBean schedulerFactory){
|
||||||
|
|
||||||
|
Scheduler scheduler = schedulerFactory.getScheduler();
|
||||||
|
|
||||||
|
XxlJobDynamicScheduler xxlJobDynamicScheduler = new XxlJobDynamicScheduler();
|
||||||
|
xxlJobDynamicScheduler.setScheduler(scheduler);
|
||||||
|
|
||||||
|
return xxlJobDynamicScheduler;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
package com.xxl.job.admin.core.schedule;
|
package com.xxl.job.admin.core.schedule;
|
||||||
|
|
||||||
|
import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
|
||||||
import com.xxl.job.admin.core.jobbean.RemoteHttpJobBean;
|
import com.xxl.job.admin.core.jobbean.RemoteHttpJobBean;
|
||||||
import com.xxl.job.admin.core.model.XxlJobInfo;
|
import com.xxl.job.admin.core.model.XxlJobInfo;
|
||||||
import com.xxl.job.admin.core.thread.JobFailMonitorHelper;
|
import com.xxl.job.admin.core.thread.JobFailMonitorHelper;
|
||||||
|
@ -21,6 +22,8 @@ import org.quartz.impl.triggers.CronTriggerImpl;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.BeansException;
|
import org.springframework.beans.BeansException;
|
||||||
|
import org.springframework.beans.factory.DisposableBean;
|
||||||
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
import org.springframework.context.ApplicationContext;
|
import org.springframework.context.ApplicationContext;
|
||||||
import org.springframework.context.ApplicationContextAware;
|
import org.springframework.context.ApplicationContextAware;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
@ -33,7 +36,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||||
* base quartz scheduler util
|
* base quartz scheduler util
|
||||||
* @author xuxueli 2015-12-19 16:13:53
|
* @author xuxueli 2015-12-19 16:13:53
|
||||||
*/
|
*/
|
||||||
public final class XxlJobDynamicScheduler implements ApplicationContextAware {
|
public final class XxlJobDynamicScheduler {
|
||||||
private static final Logger logger = LoggerFactory.getLogger(XxlJobDynamicScheduler.class);
|
private static final Logger logger = LoggerFactory.getLogger(XxlJobDynamicScheduler.class);
|
||||||
|
|
||||||
// ---------------------- param ----------------------
|
// ---------------------- param ----------------------
|
||||||
|
@ -44,31 +47,9 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware {
|
||||||
XxlJobDynamicScheduler.scheduler = scheduler;
|
XxlJobDynamicScheduler.scheduler = scheduler;
|
||||||
}
|
}
|
||||||
|
|
||||||
// accessToken
|
|
||||||
private static String accessToken;
|
|
||||||
public void setAccessToken(String accessToken) {
|
|
||||||
this.accessToken = accessToken;
|
|
||||||
}
|
|
||||||
|
|
||||||
// dao
|
|
||||||
public static XxlJobLogDao xxlJobLogDao;
|
|
||||||
public static XxlJobInfoDao xxlJobInfoDao;
|
|
||||||
public static XxlJobRegistryDao xxlJobRegistryDao;
|
|
||||||
public static XxlJobGroupDao xxlJobGroupDao;
|
|
||||||
public static AdminBiz adminBiz;
|
|
||||||
|
|
||||||
// ---------------------- applicationContext ----------------------
|
|
||||||
@Override
|
|
||||||
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
|
||||||
XxlJobDynamicScheduler.xxlJobLogDao = applicationContext.getBean(XxlJobLogDao.class);
|
|
||||||
XxlJobDynamicScheduler.xxlJobInfoDao = applicationContext.getBean(XxlJobInfoDao.class);
|
|
||||||
XxlJobDynamicScheduler.xxlJobRegistryDao = applicationContext.getBean(XxlJobRegistryDao.class);
|
|
||||||
XxlJobDynamicScheduler.xxlJobGroupDao = applicationContext.getBean(XxlJobGroupDao.class);
|
|
||||||
XxlJobDynamicScheduler.adminBiz = applicationContext.getBean(AdminBiz.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------------------- init + destroy ----------------------
|
// ---------------------- init + destroy ----------------------
|
||||||
public void init() throws Exception {
|
public void start() throws Exception {
|
||||||
// admin registry monitor run
|
// admin registry monitor run
|
||||||
JobRegistryMonitorHelper.getInstance().start();
|
JobRegistryMonitorHelper.getInstance().start();
|
||||||
|
|
||||||
|
@ -76,8 +57,8 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware {
|
||||||
JobFailMonitorHelper.getInstance().start();
|
JobFailMonitorHelper.getInstance().start();
|
||||||
|
|
||||||
// admin-server(spring-mvc)
|
// admin-server(spring-mvc)
|
||||||
NetComServerFactory.putService(AdminBiz.class, XxlJobDynamicScheduler.adminBiz);
|
NetComServerFactory.putService(AdminBiz.class, XxlJobAdminConfig.getAdminConfig().getAdminBiz());
|
||||||
NetComServerFactory.setAccessToken(accessToken);
|
NetComServerFactory.setAccessToken(XxlJobAdminConfig.getAdminConfig().getAccessToken());
|
||||||
|
|
||||||
// init i18n
|
// init i18n
|
||||||
initI18n();
|
initI18n();
|
||||||
|
@ -105,6 +86,7 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware {
|
||||||
JobFailMonitorHelper.getInstance().toStop();
|
JobFailMonitorHelper.getInstance().toStop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ---------------------- executor-client ----------------------
|
// ---------------------- executor-client ----------------------
|
||||||
private static ConcurrentHashMap<String, ExecutorBiz> executorBizRepository = new ConcurrentHashMap<String, ExecutorBiz>();
|
private static ConcurrentHashMap<String, ExecutorBiz> executorBizRepository = new ConcurrentHashMap<String, ExecutorBiz>();
|
||||||
public static ExecutorBiz getExecutorBiz(String address) throws Exception {
|
public static ExecutorBiz getExecutorBiz(String address) throws Exception {
|
||||||
|
@ -121,7 +103,7 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware {
|
||||||
}
|
}
|
||||||
|
|
||||||
// set-cache
|
// set-cache
|
||||||
executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, address, accessToken).getObject();
|
executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, address, XxlJobAdminConfig.getAdminConfig().getAccessToken()).getObject();
|
||||||
executorBizRepository.put(address, executorBiz);
|
executorBizRepository.put(address, executorBiz);
|
||||||
return executorBiz;
|
return executorBiz;
|
||||||
}
|
}
|
||||||
|
@ -362,6 +344,7 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* finaAllJobList
|
* finaAllJobList
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.xxl.job.admin.core.thread;
|
package com.xxl.job.admin.core.thread;
|
||||||
|
|
||||||
|
import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
|
||||||
import com.xxl.job.admin.core.model.XxlJobGroup;
|
import com.xxl.job.admin.core.model.XxlJobGroup;
|
||||||
import com.xxl.job.admin.core.model.XxlJobInfo;
|
import com.xxl.job.admin.core.model.XxlJobInfo;
|
||||||
import com.xxl.job.admin.core.model.XxlJobLog;
|
import com.xxl.job.admin.core.model.XxlJobLog;
|
||||||
|
@ -52,7 +53,7 @@ public class JobFailMonitorHelper {
|
||||||
if (jobLogId==null || jobLogId==0) {
|
if (jobLogId==null || jobLogId==0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
XxlJobLog log = XxlJobDynamicScheduler.xxlJobLogDao.load(jobLogId);
|
XxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(jobLogId);
|
||||||
if (log == null) {
|
if (log == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -70,13 +71,13 @@ public class JobFailMonitorHelper {
|
||||||
// job fail,
|
// job fail,
|
||||||
|
|
||||||
// 1、fail retry
|
// 1、fail retry
|
||||||
XxlJobInfo info = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(log.getJobId());
|
XxlJobInfo info = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(log.getJobId());
|
||||||
|
|
||||||
if (log.getExecutorFailRetryCount() > 0) {
|
if (log.getExecutorFailRetryCount() > 0) {
|
||||||
JobTriggerPoolHelper.trigger(log.getJobId(), TriggerTypeEnum.RETRY, (log.getExecutorFailRetryCount()-1), log.getExecutorShardingParam(), null);
|
JobTriggerPoolHelper.trigger(log.getJobId(), TriggerTypeEnum.RETRY, (log.getExecutorFailRetryCount()-1), log.getExecutorShardingParam(), null);
|
||||||
String retryMsg = "<br><br><span style=\"color:#F39C12;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_type_retry") +"<<<<<<<<<<< </span><br>";
|
String retryMsg = "<br><br><span style=\"color:#F39C12;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_type_retry") +"<<<<<<<<<<< </span><br>";
|
||||||
log.setTriggerMsg(log.getTriggerMsg() + retryMsg);
|
log.setTriggerMsg(log.getTriggerMsg() + retryMsg);
|
||||||
XxlJobDynamicScheduler.xxlJobLogDao.updateTriggerInfo(log);
|
XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateTriggerInfo(log);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2、fail alarm
|
// 2、fail alarm
|
||||||
|
@ -101,10 +102,10 @@ public class JobFailMonitorHelper {
|
||||||
int drainToNum = getInstance().queue.drainTo(jobLogIdList);
|
int drainToNum = getInstance().queue.drainTo(jobLogIdList);
|
||||||
if (jobLogIdList!=null && jobLogIdList.size()>0) {
|
if (jobLogIdList!=null && jobLogIdList.size()>0) {
|
||||||
for (Integer jobLogId: jobLogIdList) {
|
for (Integer jobLogId: jobLogIdList) {
|
||||||
XxlJobLog log = XxlJobDynamicScheduler.xxlJobLogDao.load(jobLogId);
|
XxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(jobLogId);
|
||||||
if (ReturnT.FAIL_CODE == log.getTriggerCode()|| ReturnT.FAIL_CODE==log.getHandleCode()) {
|
if (ReturnT.FAIL_CODE == log.getTriggerCode()|| ReturnT.FAIL_CODE==log.getHandleCode()) {
|
||||||
// job fail,
|
// job fail,
|
||||||
XxlJobInfo info = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(log.getJobId());
|
XxlJobInfo info = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(log.getJobId());
|
||||||
|
|
||||||
failAlarm(info, log);
|
failAlarm(info, log);
|
||||||
logger.info(">>>>>>>>>>> job monitor last, job fail, JobLogId:{}", jobLogId);
|
logger.info(">>>>>>>>>>> job monitor last, job fail, JobLogId:{}", jobLogId);
|
||||||
|
@ -180,7 +181,7 @@ public class JobFailMonitorHelper {
|
||||||
|
|
||||||
Set<String> emailSet = new HashSet<String>(Arrays.asList(info.getAlarmEmail().split(",")));
|
Set<String> emailSet = new HashSet<String>(Arrays.asList(info.getAlarmEmail().split(",")));
|
||||||
for (String email: emailSet) {
|
for (String email: emailSet) {
|
||||||
XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(Integer.valueOf(info.getJobGroup()));
|
XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().load(Integer.valueOf(info.getJobGroup()));
|
||||||
|
|
||||||
String title = I18nUtil.getString("jobconf_monitor");
|
String title = I18nUtil.getString("jobconf_monitor");
|
||||||
String content = MessageFormat.format(mailBodyTemplate,
|
String content = MessageFormat.format(mailBodyTemplate,
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.xxl.job.admin.core.thread;
|
package com.xxl.job.admin.core.thread;
|
||||||
|
|
||||||
|
import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
|
||||||
import com.xxl.job.admin.core.model.XxlJobGroup;
|
import com.xxl.job.admin.core.model.XxlJobGroup;
|
||||||
import com.xxl.job.admin.core.model.XxlJobRegistry;
|
import com.xxl.job.admin.core.model.XxlJobRegistry;
|
||||||
import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
|
import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
|
||||||
|
@ -36,15 +37,15 @@ public class JobRegistryMonitorHelper {
|
||||||
while (!toStop) {
|
while (!toStop) {
|
||||||
try {
|
try {
|
||||||
// auto registry group
|
// auto registry group
|
||||||
List<XxlJobGroup> groupList = XxlJobDynamicScheduler.xxlJobGroupDao.findByAddressType(0);
|
List<XxlJobGroup> groupList = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().findByAddressType(0);
|
||||||
if (CollectionUtils.isNotEmpty(groupList)) {
|
if (CollectionUtils.isNotEmpty(groupList)) {
|
||||||
|
|
||||||
// remove dead address (admin/executor)
|
// remove dead address (admin/executor)
|
||||||
XxlJobDynamicScheduler.xxlJobRegistryDao.removeDead(RegistryConfig.DEAD_TIMEOUT);
|
XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().removeDead(RegistryConfig.DEAD_TIMEOUT);
|
||||||
|
|
||||||
// fresh online address (admin/executor)
|
// fresh online address (admin/executor)
|
||||||
HashMap<String, List<String>> appAddressMap = new HashMap<String, List<String>>();
|
HashMap<String, List<String>> appAddressMap = new HashMap<String, List<String>>();
|
||||||
List<XxlJobRegistry> list = XxlJobDynamicScheduler.xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT);
|
List<XxlJobRegistry> list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAll(RegistryConfig.DEAD_TIMEOUT);
|
||||||
if (list != null) {
|
if (list != null) {
|
||||||
for (XxlJobRegistry item: list) {
|
for (XxlJobRegistry item: list) {
|
||||||
if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {
|
if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {
|
||||||
|
@ -71,7 +72,7 @@ public class JobRegistryMonitorHelper {
|
||||||
addressListStr = StringUtils.join(registryList, ",");
|
addressListStr = StringUtils.join(registryList, ",");
|
||||||
}
|
}
|
||||||
group.setAddressList(addressListStr);
|
group.setAddressList(addressListStr);
|
||||||
XxlJobDynamicScheduler.xxlJobGroupDao.update(group);
|
XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().update(group);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.xxl.job.admin.core.trigger;
|
package com.xxl.job.admin.core.trigger;
|
||||||
|
|
||||||
|
import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
|
||||||
import com.xxl.job.admin.core.model.XxlJobGroup;
|
import com.xxl.job.admin.core.model.XxlJobGroup;
|
||||||
import com.xxl.job.admin.core.model.XxlJobInfo;
|
import com.xxl.job.admin.core.model.XxlJobInfo;
|
||||||
import com.xxl.job.admin.core.model.XxlJobLog;
|
import com.xxl.job.admin.core.model.XxlJobLog;
|
||||||
|
@ -41,7 +42,7 @@ public class XxlJobTrigger {
|
||||||
*/
|
*/
|
||||||
public static void trigger(int jobId, TriggerTypeEnum triggerType, int failRetryCount, String executorShardingParam, String executorParam) {
|
public static void trigger(int jobId, TriggerTypeEnum triggerType, int failRetryCount, String executorShardingParam, String executorParam) {
|
||||||
// load data
|
// load data
|
||||||
XxlJobInfo jobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(jobId);
|
XxlJobInfo jobInfo = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(jobId);
|
||||||
if (jobInfo == null) {
|
if (jobInfo == null) {
|
||||||
logger.warn(">>>>>>>>>>>> trigger fail, jobId invalid,jobId={}", jobId);
|
logger.warn(">>>>>>>>>>>> trigger fail, jobId invalid,jobId={}", jobId);
|
||||||
return;
|
return;
|
||||||
|
@ -50,7 +51,7 @@ public class XxlJobTrigger {
|
||||||
jobInfo.setExecutorParam(executorParam);
|
jobInfo.setExecutorParam(executorParam);
|
||||||
}
|
}
|
||||||
int finalFailRetryCount = failRetryCount>=0?failRetryCount:jobInfo.getExecutorFailRetryCount();
|
int finalFailRetryCount = failRetryCount>=0?failRetryCount:jobInfo.getExecutorFailRetryCount();
|
||||||
XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(jobInfo.getJobGroup());
|
XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().load(jobInfo.getJobGroup());
|
||||||
|
|
||||||
// sharding param
|
// sharding param
|
||||||
int[] shardingParam = null;
|
int[] shardingParam = null;
|
||||||
|
@ -96,7 +97,7 @@ public class XxlJobTrigger {
|
||||||
jobLog.setJobGroup(jobInfo.getJobGroup());
|
jobLog.setJobGroup(jobInfo.getJobGroup());
|
||||||
jobLog.setJobId(jobInfo.getId());
|
jobLog.setJobId(jobInfo.getId());
|
||||||
jobLog.setTriggerTime(new Date());
|
jobLog.setTriggerTime(new Date());
|
||||||
XxlJobDynamicScheduler.xxlJobLogDao.save(jobLog);
|
XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().save(jobLog);
|
||||||
logger.debug(">>>>>>>>>>> xxl-job trigger start, jobId:{}", jobLog.getId());
|
logger.debug(">>>>>>>>>>> xxl-job trigger start, jobId:{}", jobLog.getId());
|
||||||
|
|
||||||
// 2、init trigger-param
|
// 2、init trigger-param
|
||||||
|
@ -169,7 +170,7 @@ public class XxlJobTrigger {
|
||||||
//jobLog.setTriggerTime();
|
//jobLog.setTriggerTime();
|
||||||
jobLog.setTriggerCode(triggerResult.getCode());
|
jobLog.setTriggerCode(triggerResult.getCode());
|
||||||
jobLog.setTriggerMsg(triggerMsgSb.toString());
|
jobLog.setTriggerMsg(triggerMsgSb.toString());
|
||||||
XxlJobDynamicScheduler.xxlJobLogDao.updateTriggerInfo(jobLog);
|
XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateTriggerInfo(jobLog);
|
||||||
|
|
||||||
// 7、monitor trigger
|
// 7、monitor trigger
|
||||||
JobFailMonitorHelper.monitor(jobLog.getId());
|
JobFailMonitorHelper.monitor(jobLog.getId());
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.xxl.job.admin.dao;
|
package com.xxl.job.admin.dao;
|
||||||
|
|
||||||
import com.xxl.job.admin.core.model.XxlJobGroup;
|
import com.xxl.job.admin.core.model.XxlJobGroup;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -8,6 +9,7 @@ import java.util.List;
|
||||||
/**
|
/**
|
||||||
* Created by xuxueli on 16/9/30.
|
* Created by xuxueli on 16/9/30.
|
||||||
*/
|
*/
|
||||||
|
@Mapper
|
||||||
public interface XxlJobGroupDao {
|
public interface XxlJobGroupDao {
|
||||||
|
|
||||||
public List<XxlJobGroup> findAll();
|
public List<XxlJobGroup> findAll();
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.xxl.job.admin.dao;
|
package com.xxl.job.admin.dao;
|
||||||
|
|
||||||
import com.xxl.job.admin.core.model.XxlJobInfo;
|
import com.xxl.job.admin.core.model.XxlJobInfo;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -10,6 +11,7 @@ import java.util.List;
|
||||||
* job info
|
* job info
|
||||||
* @author xuxueli 2016-1-12 18:03:45
|
* @author xuxueli 2016-1-12 18:03:45
|
||||||
*/
|
*/
|
||||||
|
@Mapper
|
||||||
public interface XxlJobInfoDao {
|
public interface XxlJobInfoDao {
|
||||||
|
|
||||||
public List<XxlJobInfo> pageList(@Param("offset") int offset,
|
public List<XxlJobInfo> pageList(@Param("offset") int offset,
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.xxl.job.admin.dao;
|
package com.xxl.job.admin.dao;
|
||||||
|
|
||||||
import com.xxl.job.admin.core.model.XxlJobLog;
|
import com.xxl.job.admin.core.model.XxlJobLog;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
@ -11,6 +12,7 @@ import java.util.Map;
|
||||||
* job log
|
* job log
|
||||||
* @author xuxueli 2016-1-12 18:03:06
|
* @author xuxueli 2016-1-12 18:03:06
|
||||||
*/
|
*/
|
||||||
|
@Mapper
|
||||||
public interface XxlJobLogDao {
|
public interface XxlJobLogDao {
|
||||||
|
|
||||||
public List<XxlJobLog> pageList(@Param("offset") int offset,
|
public List<XxlJobLog> pageList(@Param("offset") int offset,
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.xxl.job.admin.dao;
|
package com.xxl.job.admin.dao;
|
||||||
|
|
||||||
import com.xxl.job.admin.core.model.XxlJobLogGlue;
|
import com.xxl.job.admin.core.model.XxlJobLogGlue;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -9,6 +10,7 @@ import java.util.List;
|
||||||
* job log for glue
|
* job log for glue
|
||||||
* @author xuxueli 2016-5-19 18:04:56
|
* @author xuxueli 2016-5-19 18:04:56
|
||||||
*/
|
*/
|
||||||
|
@Mapper
|
||||||
public interface XxlJobLogGlueDao {
|
public interface XxlJobLogGlueDao {
|
||||||
|
|
||||||
public int save(XxlJobLogGlue xxlJobLogGlue);
|
public int save(XxlJobLogGlue xxlJobLogGlue);
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.xxl.job.admin.dao;
|
package com.xxl.job.admin.dao;
|
||||||
|
|
||||||
import com.xxl.job.admin.core.model.XxlJobRegistry;
|
import com.xxl.job.admin.core.model.XxlJobRegistry;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -8,6 +9,7 @@ import java.util.List;
|
||||||
/**
|
/**
|
||||||
* Created by xuxueli on 16/9/30.
|
* Created by xuxueli on 16/9/30.
|
||||||
*/
|
*/
|
||||||
|
@Mapper
|
||||||
public interface XxlJobRegistryDao {
|
public interface XxlJobRegistryDao {
|
||||||
|
|
||||||
public int removeDead(@Param("timeout") int timeout);
|
public int removeDead(@Param("timeout") int timeout);
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
### web
|
||||||
|
server.port=8080
|
||||||
|
server.context-path=/xxl-job-admin
|
||||||
|
|
||||||
|
### resources
|
||||||
|
spring.mvc.static-path-pattern=/static/**
|
||||||
|
spring.resources.static-locations=classpath:/static/
|
||||||
|
|
||||||
|
### freemarker
|
||||||
|
spring.freemarker.templateLoaderPath=classpath:/templates/
|
||||||
|
spring.freemarker.suffix=.ftl
|
||||||
|
spring.freemarker.charset=UTF-8
|
||||||
|
spring.freemarker.request-context-attribute=request
|
||||||
|
|
||||||
|
### mybatis
|
||||||
|
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
|
||||||
|
|
||||||
|
### xxl-job, datasource
|
||||||
|
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-job?Unicode=true&characterEncoding=UTF-8
|
||||||
|
spring.datasource.username=root
|
||||||
|
spring.datasource.password=root_pwd
|
||||||
|
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
|
||||||
|
|
||||||
|
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
|
||||||
|
spring.datasource.tomcat.max-wait=10000
|
||||||
|
spring.datasource.tomcat.max-active=30
|
||||||
|
spring.datasource.tomcat.test-on-borrow=true
|
||||||
|
|
||||||
|
### xxl-job email
|
||||||
|
xxl.job.mail.host=smtp.163.com
|
||||||
|
xxl.job.mail.port=25
|
||||||
|
xxl.job.mail.ssl=false
|
||||||
|
xxl.job.mail.username=ovono802302@163.com
|
||||||
|
xxl.job.mail.password=asdfzxcv
|
||||||
|
xxl.job.mail.sendNick=《任务调度平台XXL-JOB》
|
||||||
|
|
||||||
|
### xxl-job login
|
||||||
|
xxl.job.login.username=admin
|
||||||
|
xxl.job.login.password=123456
|
||||||
|
|
||||||
|
### xxl-job, access token
|
||||||
|
xxl.job.accessToken=
|
||||||
|
|
||||||
|
### xxl-job, i18n (default empty as chinese, "en" as english)
|
||||||
|
xxl.job.i18n=
|
|
@ -1,10 +0,0 @@
|
||||||
template_update_delay=0
|
|
||||||
default_encoding=UTF-8
|
|
||||||
output_encoding=UTF-8
|
|
||||||
locale=zh_CN
|
|
||||||
number_format=0.##########
|
|
||||||
date_format=yyyy-MM-dd
|
|
||||||
time_format=HH:mm:ss
|
|
||||||
datetime_format=yyyy-MM-dd HH:mm:s
|
|
||||||
classic_compatible=true
|
|
||||||
template_exception_handler=ignore
|
|
|
@ -1,27 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
|
|
||||||
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" threshold="null" debug="null">
|
|
||||||
|
|
||||||
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
|
|
||||||
<param name="Target" value="System.out" />
|
|
||||||
<layout class="org.apache.log4j.PatternLayout">
|
|
||||||
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} xxl-job-admin [%c]-[%t]-[%M]-[%L]-[%p] %m%n"/>
|
|
||||||
</layout>
|
|
||||||
</appender>
|
|
||||||
|
|
||||||
<appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
|
|
||||||
<param name="file" value="/data/applogs/xxl-job/xxl-job-admin.log"/>
|
|
||||||
<param name="append" value="true"/>
|
|
||||||
<param name="encoding" value="UTF-8"/>
|
|
||||||
<layout class="org.apache.log4j.PatternLayout">
|
|
||||||
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} xxl-job-admin [%c]-[%t]-[%M]-[%L]-[%p] %m%n"/>
|
|
||||||
</layout>
|
|
||||||
</appender>
|
|
||||||
|
|
||||||
<root>
|
|
||||||
<level value="INFO" />
|
|
||||||
<appender-ref ref="CONSOLE" />
|
|
||||||
<appender-ref ref="FILE" />
|
|
||||||
</root>
|
|
||||||
|
|
||||||
</log4j:configuration>
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration debug="false" scan="true" scanPeriod="1 seconds">
|
||||||
|
|
||||||
|
<contextName>logback</contextName>
|
||||||
|
<property name="log.path" value="/data/applogs/xxl-job/xxl-job-admin.log"/>
|
||||||
|
|
||||||
|
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<file>${log.path}</file>
|
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||||
|
<fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
|
||||||
|
</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="info">
|
||||||
|
<appender-ref ref="console"/>
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</root>
|
||||||
|
|
||||||
|
</configuration>
|
|
@ -1,21 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xmlns:context="http://www.springframework.org/schema/context"
|
|
||||||
xsi:schemaLocation="http://www.springframework.org/schema/beans
|
|
||||||
http://www.springframework.org/schema/beans/spring-beans.xsd
|
|
||||||
http://www.springframework.org/schema/context
|
|
||||||
http://www.springframework.org/schema/context/spring-context.xsd">
|
|
||||||
|
|
||||||
<context:component-scan base-package="com.xxl.job.admin.core.conf, com.xxl.job.admin.service, com.xxl.job.admin.dao" />
|
|
||||||
|
|
||||||
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
|
|
||||||
<property name="templateLoaderPath" value="/WEB-INF/template/" />
|
|
||||||
<property name="freemarkerSettings">
|
|
||||||
<bean class="org.springframework.beans.factory.config.PropertiesFactoryBean">
|
|
||||||
<property name="location" value="classpath:freemarker.properties" />
|
|
||||||
</bean>
|
|
||||||
</property>
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
</beans>
|
|
|
@ -1,71 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xmlns:tx="http://www.springframework.org/schema/tx"
|
|
||||||
xsi:schemaLocation="http://www.springframework.org/schema/beans
|
|
||||||
http://www.springframework.org/schema/beans/spring-beans.xsd
|
|
||||||
http://www.springframework.org/schema/tx
|
|
||||||
http://www.springframework.org/schema/tx/spring-tx.xsd">
|
|
||||||
|
|
||||||
|
|
||||||
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
|
|
||||||
<property name="fileEncoding" value="utf-8" />
|
|
||||||
<property name="locations">
|
|
||||||
<list>
|
|
||||||
<value>classpath*:xxl-job-admin.properties</value>
|
|
||||||
</list>
|
|
||||||
</property>
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<!-- ********************************* part 1 :for datasource ********************************* -->
|
|
||||||
|
|
||||||
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
|
|
||||||
<property name="driverClass" value="${xxl.job.db.driverClass}" />
|
|
||||||
<property name="jdbcUrl" value="${xxl.job.db.url}" />
|
|
||||||
<property name="user" value="${xxl.job.db.user}" />
|
|
||||||
<property name="password" value="${xxl.job.db.password}" />
|
|
||||||
<property name="initialPoolSize" value="3" />
|
|
||||||
<property name="minPoolSize" value="2" />
|
|
||||||
<property name="maxPoolSize" value="10" />
|
|
||||||
<property name="maxIdleTime" value="60" />
|
|
||||||
<property name="acquireRetryDelay" value="1000" />
|
|
||||||
<property name="acquireRetryAttempts" value="10" />
|
|
||||||
<property name="preferredTestQuery" value="SELECT 1" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
|
|
||||||
<property name="dataSource" ref="dataSource" />
|
|
||||||
<property name="mapperLocations" value="classpath:mybatis-mapper/*.xml"/>
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
|
|
||||||
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
|
|
||||||
<property name="basePackage" value="com.xxl.job.admin.dao" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<!-- ********************************* part 2 :for tx ********************************* -->
|
|
||||||
|
|
||||||
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
|
|
||||||
<property name="dataSource" ref="dataSource" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
|
|
||||||
|
|
||||||
<!-- ********************************* part 3 :for xxl-job scheduler ********************************* -->
|
|
||||||
|
|
||||||
<bean id="quartzScheduler" lazy-init="false" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
|
|
||||||
<property name="dataSource" ref="dataSource" />
|
|
||||||
<property name="autoStartup" value="true" /> <!--自动启动 -->
|
|
||||||
<property name="startupDelay" value="20" /> <!--延时启动,应用启动成功后在启动 -->
|
|
||||||
<property name="overwriteExistingJobs" value="true" /> <!--覆盖DB中JOB:true、以数据库中已经存在的为准:false -->
|
|
||||||
<property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
|
|
||||||
<property name="configLocation" value="classpath:quartz.properties"/>
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<bean id="xxlJobDynamicScheduler" class="com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler" init-method="init" destroy-method="destroy" >
|
|
||||||
<!-- (轻易不要变更“调度器名称”, 任务创建时会绑定该“调度器名称”) -->
|
|
||||||
<property name="scheduler" ref="quartzScheduler"/>
|
|
||||||
<property name="accessToken" value="${xxl.job.accessToken}" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
</beans>
|
|
|
@ -1,45 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
|
||||||
xmlns:context="http://www.springframework.org/schema/context"
|
|
||||||
xmlns:mvc="http://www.springframework.org/schema/mvc"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.springframework.org/schema/beans
|
|
||||||
http://www.springframework.org/schema/beans/spring-beans.xsd
|
|
||||||
http://www.springframework.org/schema/context
|
|
||||||
http://www.springframework.org/schema/context/spring-context.xsd
|
|
||||||
http://www.springframework.org/schema/mvc
|
|
||||||
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
|
|
||||||
|
|
||||||
<mvc:annotation-driven />
|
|
||||||
<context:component-scan base-package="com.xxl.job.admin.controller" />
|
|
||||||
|
|
||||||
<mvc:resources mapping="/favicon.ico" location="/favicon.ico" />
|
|
||||||
<mvc:resources mapping="/static/**" location="/static/" />
|
|
||||||
<mvc:resources mapping="/**/*.html" location="/" />
|
|
||||||
|
|
||||||
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
|
|
||||||
<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
|
|
||||||
<property name="prefix" value="" />
|
|
||||||
<property name="suffix" value=".ftl" />
|
|
||||||
<property name="contentType" value="text/html;charset=UTF-8" />
|
|
||||||
<property name="exposeSpringMacroHelpers" value="true" />
|
|
||||||
<property name="exposeRequestAttributes" value="true" />
|
|
||||||
<property name="exposeSessionAttributes" value="true" />
|
|
||||||
<property name="requestContextAttribute" value="request" />
|
|
||||||
<property name="cache" value="true" />
|
|
||||||
<property name="order" value="0" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
<mvc:interceptors>
|
|
||||||
<mvc:interceptor>
|
|
||||||
<mvc:mapping path="/**"/>
|
|
||||||
<bean class="com.xxl.job.admin.controller.interceptor.PermissionInterceptor"/>
|
|
||||||
</mvc:interceptor>
|
|
||||||
<mvc:interceptor>
|
|
||||||
<mvc:mapping path="/**"/>
|
|
||||||
<bean class="com.xxl.job.admin.controller.interceptor.CookieInterceptor"/>
|
|
||||||
</mvc:interceptor>
|
|
||||||
</mvc:interceptors>
|
|
||||||
<bean id="exceptionResolver" class="com.xxl.job.admin.controller.resolver.WebExceptionResolver" />
|
|
||||||
|
|
||||||
</beans>
|
|
0
xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/css/bootstrap.min.css → xxl-job-admin/src/main/resources/static/adminlte/bootstrap/css/bootstrap.min.css
vendored
Executable file → Normal file
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 106 KiB |
0
xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/js/bootstrap.min.js → xxl-job-admin/src/main/resources/static/adminlte/bootstrap/js/bootstrap.min.js
vendored
Executable file → Normal file
0
xxl-job-admin/src/main/webapp/static/adminlte/dist/css/AdminLTE.min.css → xxl-job-admin/src/main/resources/static/adminlte/dist/css/AdminLTE.min.css
vendored
Executable file → Normal file
0
xxl-job-admin/src/main/webapp/static/adminlte/dist/css/skins/_all-skins.min.css → xxl-job-admin/src/main/resources/static/adminlte/dist/css/skins/_all-skins.min.css
vendored
Executable file → Normal file
0
xxl-job-admin/src/main/webapp/static/adminlte/dist/js/app.min.js → xxl-job-admin/src/main/resources/static/adminlte/dist/js/app.min.js
vendored
Executable file → Normal file
Before Width: | Height: | Size: 160 B After Width: | Height: | Size: 160 B |
Before Width: | Height: | Size: 148 B After Width: | Height: | Size: 148 B |
Before Width: | Height: | Size: 201 B After Width: | Height: | Size: 201 B |
Before Width: | Height: | Size: 158 B After Width: | Height: | Size: 158 B |
Before Width: | Height: | Size: 146 B After Width: | Height: | Size: 146 B |
0
xxl-job-admin/src/main/webapp/static/adminlte/plugins/iCheck/icheck.min.js → xxl-job-admin/src/main/resources/static/adminlte/plugins/iCheck/icheck.min.js
vendored
Executable file → Normal file
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |