记得上下班打卡 | git大法好,push需谨慎

Commit aedb3efa authored by anjiabin's avatar anjiabin

提交client-job相关代码

parent 79641e55
drop schema if exists liquidnet_clijob; drop schema if exists dev_ln_clijob;
create database liquidnet_clijob character set utf8mb4 collate utf8mb4_unicode_ci; create database dev_ln_clijob character set utf8mb4 collate utf8mb4_unicode_ci;
-- >>------------------------------------------------------------------------------------ -- >>------------------------------------------------------------------------------------
use `liquidnet_clijob`; use `dev_ln_clijob`;
SET NAMES utf8mb4; SET NAMES utf8mb4;
...@@ -117,3 +117,4 @@ INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`) V ...@@ -117,3 +117,4 @@ INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`) V
INSERT INTO `xxl_job_lock` ( `lock_name`) VALUES ( 'schedule_lock'); INSERT INTO `xxl_job_lock` ( `lock_name`) VALUES ( 'schedule_lock');
commit; commit;
...@@ -9,40 +9,41 @@ ...@@ -9,40 +9,41 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>liquidnet-client-job</artifactId> <artifactId>liquidnet-client-job</artifactId>
<packaging>jar</packaging>
<properties> <!-- <dependencyManagement>-->
<java.version>1.8</java.version> <!-- <dependencies>-->
</properties> <!-- <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>
<dependency> <dependency>
<groupId>org.springframework.cloud</groupId> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<!-- <exclusions>-->
<!-- <exclusion>-->
<!-- <groupId>com.google.guava</groupId>-->
<!-- <artifactId>guava</artifactId>-->
<!-- </exclusion>-->
<!-- </exclusions>-->
</dependency> </dependency>
<!--Spring Cloud Config 客户端依赖-->
<dependency> <dependency>
<groupId>org.springframework.cloud</groupId> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId> <artifactId>spring-cloud-starter-config</artifactId>
</dependency> </dependency>
<!-- starter-web:spring-webmvc + autoconfigure + logback + yaml + tomcat -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
<!-- starter-test:junit + spring-test + mockito -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId> <artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> </dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-jdbc</artifactId>-->
<!-- </dependency>-->
<!-- freemarker-starter --> <!-- freemarker-starter -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
...@@ -65,41 +66,28 @@ ...@@ -65,41 +66,28 @@
<dependency> <dependency>
<groupId>org.mybatis.spring.boot</groupId> <groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId> <artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version> <version>${mybatis-spring-boot-starter.version}</version>
</dependency> </dependency>
<!-- mysql --> <!-- mysql -->
<dependency> <dependency>
<groupId>mysql</groupId> <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version> <version>${mysql-connector-java.version}</version>
</dependency> </dependency>
<!-- xxl-job-core --> <!-- xxl-job-core -->
<dependency> <dependency>
<groupId>com.xuxueli</groupId> <groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId> <artifactId>xxl-job-core</artifactId>
<version>2.2.0</version> <version>2.3.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies> </dependencies>
<build> <build>
<plugins> <plugins>
<plugin> <plugin>
...@@ -108,28 +96,4 @@ ...@@ -108,28 +96,4 @@
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
<repositories>
<repository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project> </project>
package com.liquidnet.client; package com.liquidnet.client.job.admin;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner; import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
...@@ -16,8 +13,8 @@ import java.net.UnknownHostException; ...@@ -16,8 +13,8 @@ import java.net.UnknownHostException;
import java.util.Arrays; import java.util.Arrays;
@Slf4j @Slf4j
@EnableEurekaClient
@SpringBootApplication(scanBasePackages = {"com.liquidnet"}) @SpringBootApplication(scanBasePackages = {"com.liquidnet"})
//@SpringBootApplication(scanBasePackages = {"com.liquidnet"})
public class ClientJobApplication implements CommandLineRunner { public class ClientJobApplication implements CommandLineRunner {
@Autowired @Autowired
private Environment environment; private Environment environment;
......
package com.liquidnet.client.job.controller; package com.liquidnet.client.job.admin.controller;
import com.liquidnet.client.job.admin.controller.annotation.PermissionLimit;
import com.liquidnet.client.job.controller.annotation.PermissionLimit; import com.liquidnet.client.job.admin.service.LoginService;
import com.liquidnet.client.job.service.LoginService; import com.liquidnet.client.job.admin.service.XxlJobService;
import com.liquidnet.client.job.service.XxlJobService;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
...@@ -13,6 +12,8 @@ import org.springframework.web.bind.annotation.InitBinder; ...@@ -13,6 +12,8 @@ import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
...@@ -23,6 +24,7 @@ import java.util.Map; ...@@ -23,6 +24,7 @@ import java.util.Map;
/** /**
* index controller * index controller
* @author xuxueli 2015-12-19 16:13:16
*/ */
@Controller @Controller
public class IndexController { public class IndexController {
...@@ -42,22 +44,23 @@ public class IndexController { ...@@ -42,22 +44,23 @@ public class IndexController {
return "index"; return "index";
} }
@RequestMapping("/chartInfo") @RequestMapping("/chartInfo")
@ResponseBody @ResponseBody
public ReturnT<Map<String, Object>> chartInfo(Date startDate, Date endDate) { public ReturnT<Map<String, Object>> chartInfo(Date startDate, Date endDate) {
ReturnT<Map<String, Object>> chartInfo = xxlJobService.chartInfo(startDate, endDate); ReturnT<Map<String, Object>> chartInfo = xxlJobService.chartInfo(startDate, endDate);
return chartInfo; return chartInfo;
} }
@RequestMapping("/toLogin") @RequestMapping("/toLogin")
@PermissionLimit(limit=false) @PermissionLimit(limit=false)
public String toLogin(HttpServletRequest request, HttpServletResponse response) { public ModelAndView toLogin(HttpServletRequest request, HttpServletResponse response,ModelAndView modelAndView) {
if (loginService.ifLogin(request, response) != null) { if (loginService.ifLogin(request, response) != null) {
return "redirect:/"; modelAndView.setView(new RedirectView("/",true,false));
return modelAndView;
} }
return "login"; return new ModelAndView("login");
} }
@RequestMapping(value="login", method=RequestMethod.POST) @RequestMapping(value="login", method=RequestMethod.POST)
@ResponseBody @ResponseBody
@PermissionLimit(limit=false) @PermissionLimit(limit=false)
...@@ -65,14 +68,14 @@ public class IndexController { ...@@ -65,14 +68,14 @@ public class IndexController {
boolean ifRem = (ifRemember!=null && ifRemember.trim().length()>0 && "on".equals(ifRemember))?true:false; boolean ifRem = (ifRemember!=null && ifRemember.trim().length()>0 && "on".equals(ifRemember))?true:false;
return loginService.login(request, response, userName, password, ifRem); return loginService.login(request, response, userName, password, ifRem);
} }
@RequestMapping(value="logout", method=RequestMethod.POST) @RequestMapping(value="logout", method=RequestMethod.POST)
@ResponseBody @ResponseBody
@PermissionLimit(limit=false) @PermissionLimit(limit=false)
public ReturnT<String> logout(HttpServletRequest request, HttpServletResponse response){ public ReturnT<String> logout(HttpServletRequest request, HttpServletResponse response){
return loginService.logout(request, response); return loginService.logout(request, response);
} }
@RequestMapping("/help") @RequestMapping("/help")
public String help() { public String help() {
...@@ -89,5 +92,5 @@ public class IndexController { ...@@ -89,5 +92,5 @@ public class IndexController {
dateFormat.setLenient(false); dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
} }
} }
package com.liquidnet.client.job.controller; package com.liquidnet.client.job.admin.controller;
import com.liquidnet.client.job.core.conf.XxlJobAdminConfig; import com.liquidnet.client.job.admin.controller.annotation.PermissionLimit;
import com.liquidnet.client.job.controller.annotation.PermissionLimit; import com.liquidnet.client.job.admin.core.conf.XxlJobAdminConfig;
import com.xxl.job.core.biz.AdminBiz; import com.xxl.job.core.biz.AdminBiz;
import com.xxl.job.core.biz.model.HandleCallbackParam; import com.xxl.job.core.biz.model.HandleCallbackParam;
import com.xxl.job.core.biz.model.RegistryParam; import com.xxl.job.core.biz.model.RegistryParam;
...@@ -18,7 +18,9 @@ import javax.annotation.Resource; ...@@ -18,7 +18,9 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.List; import java.util.List;
/**
* Created by xuxueli on 17/5/10.
*/
@Controller @Controller
@RequestMapping("/api") @RequestMapping("/api")
public class JobApiController { public class JobApiController {
......
package com.liquidnet.client.job.controller; package com.liquidnet.client.job.admin.controller;
import com.liquidnet.client.job.admin.core.model.XxlJobInfo;
import com.liquidnet.client.job.core.model.XxlJobInfo; import com.liquidnet.client.job.admin.core.model.XxlJobLogGlue;
import com.liquidnet.client.job.core.model.XxlJobLogGlue; import com.liquidnet.client.job.admin.core.util.I18nUtil;
import com.liquidnet.client.job.core.util.I18nUtil; import com.liquidnet.client.job.admin.dao.XxlJobInfoDao;
import com.liquidnet.client.job.dao.XxlJobInfoDao; import com.liquidnet.client.job.admin.dao.XxlJobLogGlueDao;
import com.liquidnet.client.job.dao.XxlJobLogGlueDao;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.glue.GlueTypeEnum; import com.xxl.job.core.glue.GlueTypeEnum;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
...@@ -20,6 +19,7 @@ import java.util.List; ...@@ -20,6 +19,7 @@ import java.util.List;
/** /**
* job code controller * job code controller
* @author xuxueli 2015-12-19 16:13:16
*/ */
@Controller @Controller
@RequestMapping("/jobcode") @RequestMapping("/jobcode")
......
package com.liquidnet.client.job.controller; package com.liquidnet.client.job.admin.controller;
import com.liquidnet.client.job.admin.core.model.XxlJobGroup;
import com.liquidnet.client.job.core.model.XxlJobGroup; import com.liquidnet.client.job.admin.core.model.XxlJobRegistry;
import com.liquidnet.client.job.core.model.XxlJobRegistry; import com.liquidnet.client.job.admin.core.util.I18nUtil;
import com.liquidnet.client.job.core.util.I18nUtil; import com.liquidnet.client.job.admin.dao.XxlJobGroupDao;
import com.liquidnet.client.job.dao.XxlJobGroupDao; import com.liquidnet.client.job.admin.dao.XxlJobInfoDao;
import com.liquidnet.client.job.dao.XxlJobInfoDao; import com.liquidnet.client.job.admin.dao.XxlJobRegistryDao;
import com.liquidnet.client.job.dao.XxlJobRegistryDao;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.enums.RegistryConfig; import com.xxl.job.core.enums.RegistryConfig;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
...@@ -21,6 +20,7 @@ import java.util.*; ...@@ -21,6 +20,7 @@ import java.util.*;
/** /**
* job group controller * job group controller
* @author xuxueli 2016-10-02 20:52:56
*/ */
@Controller @Controller
@RequestMapping("/jobgroup") @RequestMapping("/jobgroup")
...@@ -68,13 +68,23 @@ public class JobGroupController { ...@@ -68,13 +68,23 @@ public class JobGroupController {
if (xxlJobGroup.getAppname().length()<4 || xxlJobGroup.getAppname().length()>64) { if (xxlJobGroup.getAppname().length()<4 || xxlJobGroup.getAppname().length()>64) {
return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_appname_length") ); return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_appname_length") );
} }
if (xxlJobGroup.getAppname().contains(">") || xxlJobGroup.getAppname().contains("<")) {
return new ReturnT<String>(500, "AppName"+I18nUtil.getString("system_unvalid") );
}
if (xxlJobGroup.getTitle()==null || xxlJobGroup.getTitle().trim().length()==0) { if (xxlJobGroup.getTitle()==null || xxlJobGroup.getTitle().trim().length()==0) {
return new ReturnT<String>(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobgroup_field_title")) ); return new ReturnT<String>(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobgroup_field_title")) );
} }
if (xxlJobGroup.getTitle().contains(">") || xxlJobGroup.getTitle().contains("<")) {
return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_title")+I18nUtil.getString("system_unvalid") );
}
if (xxlJobGroup.getAddressType()!=0) { if (xxlJobGroup.getAddressType()!=0) {
if (xxlJobGroup.getAddressList()==null || xxlJobGroup.getAddressList().trim().length()==0) { if (xxlJobGroup.getAddressList()==null || xxlJobGroup.getAddressList().trim().length()==0) {
return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_addressType_limit") ); return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_addressType_limit") );
} }
if (xxlJobGroup.getAddressList().contains(">") || xxlJobGroup.getAddressList().contains("<")) {
return new ReturnT<String>(500, I18nUtil.getString("jobgroup_field_registryList")+I18nUtil.getString("system_unvalid") );
}
String[] addresss = xxlJobGroup.getAddressList().split(","); String[] addresss = xxlJobGroup.getAddressList().split(",");
for (String item: addresss) { for (String item: addresss) {
if (item==null || item.trim().length()==0) { if (item==null || item.trim().length()==0) {
...@@ -83,6 +93,9 @@ public class JobGroupController { ...@@ -83,6 +93,9 @@ public class JobGroupController {
} }
} }
// process
xxlJobGroup.setUpdateTime(new Date());
int ret = xxlJobGroupDao.save(xxlJobGroup); int ret = xxlJobGroupDao.save(xxlJobGroup);
return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL; return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL;
} }
...@@ -126,6 +139,9 @@ public class JobGroupController { ...@@ -126,6 +139,9 @@ public class JobGroupController {
} }
} }
// process
xxlJobGroup.setUpdateTime(new Date());
int ret = xxlJobGroupDao.update(xxlJobGroup); int ret = xxlJobGroupDao.update(xxlJobGroup);
return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL; return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL;
} }
......
package com.liquidnet.client.job.controller; package com.liquidnet.client.job.admin.controller;
import com.liquidnet.client.job.core.cron.CronExpression;
import com.liquidnet.client.job.core.exception.XxlJobException; import com.liquidnet.client.job.admin.core.exception.XxlJobException;
import com.liquidnet.client.job.core.model.XxlJobGroup; import com.liquidnet.client.job.admin.core.model.XxlJobGroup;
import com.liquidnet.client.job.core.model.XxlJobInfo; import com.liquidnet.client.job.admin.core.model.XxlJobInfo;
import com.liquidnet.client.job.core.model.XxlJobUser; import com.liquidnet.client.job.admin.core.model.XxlJobUser;
import com.liquidnet.client.job.core.route.ExecutorRouteStrategyEnum; import com.liquidnet.client.job.admin.core.route.ExecutorRouteStrategyEnum;
import com.liquidnet.client.job.core.thread.JobTriggerPoolHelper; import com.liquidnet.client.job.admin.core.scheduler.MisfireStrategyEnum;
import com.liquidnet.client.job.core.trigger.TriggerTypeEnum; import com.liquidnet.client.job.admin.core.scheduler.ScheduleTypeEnum;
import com.liquidnet.client.job.core.util.I18nUtil; import com.liquidnet.client.job.admin.core.thread.JobScheduleHelper;
import com.liquidnet.client.job.dao.XxlJobGroupDao; import com.liquidnet.client.job.admin.core.thread.JobTriggerPoolHelper;
import com.liquidnet.client.job.service.LoginService; import com.liquidnet.client.job.admin.core.trigger.TriggerTypeEnum;
import com.liquidnet.client.job.service.XxlJobService; import com.liquidnet.client.job.admin.core.util.I18nUtil;
import com.liquidnet.client.job.admin.dao.XxlJobGroupDao;
import com.liquidnet.client.job.admin.service.LoginService;
import com.liquidnet.client.job.admin.service.XxlJobService;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
import com.xxl.job.core.glue.GlueTypeEnum; import com.xxl.job.core.glue.GlueTypeEnum;
import com.xxl.job.core.util.DateUtil; import com.xxl.job.core.util.DateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -23,15 +28,16 @@ import org.springframework.web.bind.annotation.ResponseBody; ...@@ -23,15 +28,16 @@ import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.text.ParseException;
import java.util.*; import java.util.*;
/** /**
* index controller * index controller
* @author xuxueli 2015-12-19 16:13:16
*/ */
@Controller @Controller
@RequestMapping("/jobinfo") @RequestMapping("/jobinfo")
public class JobInfoController { public class JobInfoController {
private static Logger logger = LoggerFactory.getLogger(JobInfoController.class);
@Resource @Resource
private XxlJobGroupDao xxlJobGroupDao; private XxlJobGroupDao xxlJobGroupDao;
...@@ -45,6 +51,8 @@ public class JobInfoController { ...@@ -45,6 +51,8 @@ public class JobInfoController {
model.addAttribute("ExecutorRouteStrategyEnum", ExecutorRouteStrategyEnum.values()); // 路由策略-列表 model.addAttribute("ExecutorRouteStrategyEnum", ExecutorRouteStrategyEnum.values()); // 路由策略-列表
model.addAttribute("GlueTypeEnum", GlueTypeEnum.values()); // Glue类型-字典 model.addAttribute("GlueTypeEnum", GlueTypeEnum.values()); // Glue类型-字典
model.addAttribute("ExecutorBlockStrategyEnum", ExecutorBlockStrategyEnum.values()); // 阻塞处理策略-字典 model.addAttribute("ExecutorBlockStrategyEnum", ExecutorBlockStrategyEnum.values()); // 阻塞处理策略-字典
model.addAttribute("ScheduleTypeEnum", ScheduleTypeEnum.values()); // 调度类型
model.addAttribute("MisfireStrategyEnum", MisfireStrategyEnum.values()); // 调度过期策略
// 执行器列表 // 执行器列表
List<XxlJobGroup> jobGroupList_all = xxlJobGroupDao.findAll(); List<XxlJobGroup> jobGroupList_all = xxlJobGroupDao.findAll();
...@@ -142,23 +150,29 @@ public class JobInfoController { ...@@ -142,23 +150,29 @@ public class JobInfoController {
@RequestMapping("/nextTriggerTime") @RequestMapping("/nextTriggerTime")
@ResponseBody @ResponseBody
public ReturnT<List<String>> nextTriggerTime(String cron) { public ReturnT<List<String>> nextTriggerTime(String scheduleType, String scheduleConf) {
XxlJobInfo paramXxlJobInfo = new XxlJobInfo();
paramXxlJobInfo.setScheduleType(scheduleType);
paramXxlJobInfo.setScheduleConf(scheduleConf);
List<String> result = new ArrayList<>(); List<String> result = new ArrayList<>();
try { try {
CronExpression cronExpression = new CronExpression(cron);
Date lastTime = new Date(); Date lastTime = new Date();
for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) {
lastTime = cronExpression.getNextValidTimeAfter(lastTime); lastTime = JobScheduleHelper.generateNextValidTime(paramXxlJobInfo, lastTime);
if (lastTime != null) { if (lastTime != null) {
result.add(DateUtil.formatDateTime(lastTime)); result.add(DateUtil.formatDateTime(lastTime));
} else { } else {
break; break;
} }
} }
} catch (ParseException e) { } catch (Exception e) {
return new ReturnT<List<String>>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_unvalid")); logger.error(e.getMessage(), e);
return new ReturnT<List<String>>(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) + e.getMessage());
} }
return new ReturnT<List<String>>(result); return new ReturnT<List<String>>(result);
} }
} }
package com.liquidnet.client.job.controller; package com.liquidnet.client.job.admin.controller;
import com.liquidnet.client.job.core.exception.XxlJobException; import com.liquidnet.client.job.admin.core.complete.XxlJobCompleter;
import com.liquidnet.client.job.core.model.XxlJobGroup; import com.liquidnet.client.job.admin.core.exception.XxlJobException;
import com.liquidnet.client.job.core.model.XxlJobInfo; import com.liquidnet.client.job.admin.core.model.XxlJobGroup;
import com.liquidnet.client.job.core.model.XxlJobLog; import com.liquidnet.client.job.admin.core.model.XxlJobInfo;
import com.liquidnet.client.job.core.scheduler.XxlJobScheduler; import com.liquidnet.client.job.admin.core.model.XxlJobLog;
import com.liquidnet.client.job.core.util.I18nUtil; import com.liquidnet.client.job.admin.core.scheduler.XxlJobScheduler;
import com.liquidnet.client.job.dao.XxlJobGroupDao; import com.liquidnet.client.job.admin.core.util.I18nUtil;
import com.liquidnet.client.job.dao.XxlJobInfoDao; import com.liquidnet.client.job.admin.dao.XxlJobGroupDao;
import com.liquidnet.client.job.dao.XxlJobLogDao; import com.liquidnet.client.job.admin.dao.XxlJobInfoDao;
import com.liquidnet.client.job.admin.dao.XxlJobLogDao;
import com.xxl.job.core.biz.ExecutorBiz; import com.xxl.job.core.biz.ExecutorBiz;
import com.xxl.job.core.biz.model.KillParam; import com.xxl.job.core.biz.model.KillParam;
import com.xxl.job.core.biz.model.LogParam; import com.xxl.job.core.biz.model.LogParam;
...@@ -32,6 +33,7 @@ import java.util.Map; ...@@ -32,6 +33,7 @@ import java.util.Map;
/** /**
* index controller * index controller
* @author xuxueli 2015-12-19 16:13:16
*/ */
@Controller @Controller
@RequestMapping("/joblog") @RequestMapping("/joblog")
...@@ -182,7 +184,7 @@ public class JobLogController { ...@@ -182,7 +184,7 @@ public class JobLogController {
log.setHandleCode(ReturnT.FAIL_CODE); log.setHandleCode(ReturnT.FAIL_CODE);
log.setHandleMsg( I18nUtil.getString("joblog_kill_log_byman")+":" + (runResult.getMsg()!=null?runResult.getMsg():"")); log.setHandleMsg( I18nUtil.getString("joblog_kill_log_byman")+":" + (runResult.getMsg()!=null?runResult.getMsg():""));
log.setHandleTime(new Date()); log.setHandleTime(new Date());
xxlJobLogDao.updateHandleInfo(log); XxlJobCompleter.updateHandleInfoAndFinish(log);
return new ReturnT<String>(runResult.getMsg()); return new ReturnT<String>(runResult.getMsg());
} else { } else {
return new ReturnT<String>(500, runResult.getMsg()); return new ReturnT<String>(500, runResult.getMsg());
......
package com.liquidnet.client.job.controller; package com.liquidnet.client.job.admin.controller;
import com.liquidnet.client.job.admin.controller.annotation.PermissionLimit;
import com.liquidnet.client.job.core.model.XxlJobGroup; import com.liquidnet.client.job.admin.core.model.XxlJobGroup;
import com.liquidnet.client.job.core.model.XxlJobUser; import com.liquidnet.client.job.admin.core.model.XxlJobUser;
import com.liquidnet.client.job.core.util.I18nUtil; import com.liquidnet.client.job.admin.core.util.I18nUtil;
import com.liquidnet.client.job.dao.XxlJobGroupDao; import com.liquidnet.client.job.admin.dao.XxlJobGroupDao;
import com.liquidnet.client.job.dao.XxlJobUserDao; import com.liquidnet.client.job.admin.dao.XxlJobUserDao;
import com.liquidnet.client.job.controller.annotation.PermissionLimit; import com.liquidnet.client.job.admin.service.LoginService;
import com.liquidnet.client.job.service.LoginService;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
...@@ -23,6 +22,9 @@ import java.util.HashMap; ...@@ -23,6 +22,9 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
/**
* @author xuxueli 2019-05-04 16:39:50
*/
@Controller @Controller
@RequestMapping("/user") @RequestMapping("/user")
public class UserController { public class UserController {
...@@ -54,6 +56,13 @@ public class UserController { ...@@ -54,6 +56,13 @@ public class UserController {
List<XxlJobUser> list = xxlJobUserDao.pageList(start, length, username, role); List<XxlJobUser> list = xxlJobUserDao.pageList(start, length, username, role);
int list_count = xxlJobUserDao.pageListCount(start, length, username, role); int list_count = xxlJobUserDao.pageListCount(start, length, username, role);
// filter
if (list!=null && list.size()>0) {
for (XxlJobUser item: list) {
item.setPassword(null);
}
}
// package result // package result
Map<String, Object> maps = new HashMap<String, Object>(); Map<String, Object> maps = new HashMap<String, Object>();
maps.put("recordsTotal", list_count); // 总记录数 maps.put("recordsTotal", list_count); // 总记录数
......
package com.liquidnet.client.job.controller.annotation; package com.liquidnet.client.job.admin.controller.annotation;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
...@@ -8,6 +8,7 @@ import java.lang.annotation.Target; ...@@ -8,6 +8,7 @@ import java.lang.annotation.Target;
/** /**
* 权限限制 * 权限限制
* @author xuxueli 2015-12-12 18:29:02
*/ */
@Target(ElementType.METHOD) @Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
......
package com.liquidnet.client.job.controller.interceptor; package com.liquidnet.client.job.admin.controller.interceptor;
import com.liquidnet.client.job.admin.core.util.FtlUtil;
import com.liquidnet.client.job.core.util.FtlUtil; import com.liquidnet.client.job.admin.core.util.I18nUtil;
import com.liquidnet.client.job.core.util.I18nUtil;
import org.springframework.stereotype.Component; 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;
...@@ -15,6 +14,7 @@ import java.util.HashMap; ...@@ -15,6 +14,7 @@ import java.util.HashMap;
/** /**
* push cookies to model as cookieMap * push cookies to model as cookieMap
* *
* @author xuxueli 2015-12-12 18:09:04
*/ */
@Component @Component
public class CookieInterceptor extends HandlerInterceptorAdapter { public class CookieInterceptor extends HandlerInterceptorAdapter {
......
package com.liquidnet.client.job.controller.interceptor; package com.liquidnet.client.job.admin.controller.interceptor;
import com.liquidnet.client.job.admin.controller.annotation.PermissionLimit;
import com.liquidnet.client.job.core.model.XxlJobUser; import com.liquidnet.client.job.admin.core.model.XxlJobUser;
import com.liquidnet.client.job.core.util.I18nUtil; import com.liquidnet.client.job.admin.core.util.I18nUtil;
import com.liquidnet.client.job.controller.annotation.PermissionLimit; import com.liquidnet.client.job.admin.service.LoginService;
import com.liquidnet.client.job.service.LoginService;
import org.springframework.stereotype.Component; 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,6 +15,7 @@ import javax.servlet.http.HttpServletResponse; ...@@ -16,6 +15,7 @@ import javax.servlet.http.HttpServletResponse;
/** /**
* 权限拦截 * 权限拦截
* *
* @author xuxueli 2015-12-12 18:09:04
*/ */
@Component @Component
public class PermissionInterceptor extends HandlerInterceptorAdapter { public class PermissionInterceptor extends HandlerInterceptorAdapter {
...@@ -43,8 +43,8 @@ public class PermissionInterceptor extends HandlerInterceptorAdapter { ...@@ -43,8 +43,8 @@ public class PermissionInterceptor extends HandlerInterceptorAdapter {
if (needLogin) { if (needLogin) {
XxlJobUser loginUser = loginService.ifLogin(request, response); XxlJobUser loginUser = loginService.ifLogin(request, response);
if (loginUser == null) { if (loginUser == null) {
response.sendRedirect(request.getContextPath() + "/toLogin"); response.setStatus(302);
//request.getRequestDispatcher("/toLogin").forward(request, response); response.setHeader("location", request.getContextPath()+"/toLogin");
return false; return false;
} }
if (needAdminuser && loginUser.getRole()!=1) { if (needAdminuser && loginUser.getRole()!=1) {
......
package com.liquidnet.client.job.controller.interceptor; package com.liquidnet.client.job.admin.controller.interceptor;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import javax.annotation.Resource; import javax.annotation.Resource;
/** /**
* web mvc config * web mvc config
* *
* @author xuxueli 2018-04-02 20:48:20
*/ */
@Configuration @Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport { public class WebMvcConfig implements WebMvcConfigurer {
@Resource @Resource
private PermissionInterceptor permissionInterceptor; private PermissionInterceptor permissionInterceptor;
...@@ -25,17 +25,4 @@ public class WebMvcConfig extends WebMvcConfigurationSupport { ...@@ -25,17 +25,4 @@ public class WebMvcConfig extends WebMvcConfigurationSupport {
registry.addInterceptor(cookieInterceptor).addPathPatterns("/**"); registry.addInterceptor(cookieInterceptor).addPathPatterns("/**");
} }
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations(
"classpath:/static/");
// registry.addResourceHandler("*.css").addResourceLocations(
// "classpath:/static/");
// registry.addResourceHandler("*.img").addResourceLocations(
// "classpath:/static/");
// registry.addResourceHandler("*.ico").addResourceLocations(
// "classpath:/static/");
super.addResourceHandlers(registry);
}
} }
\ No newline at end of file
package com.liquidnet.client.job.controller.resolver; package com.liquidnet.client.job.admin.controller.resolver;
import com.liquidnet.client.job.admin.core.exception.XxlJobException;
import com.liquidnet.client.job.core.exception.XxlJobException; import com.liquidnet.client.job.admin.core.util.JacksonUtil;
import com.liquidnet.client.job.core.util.JacksonUtil;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -19,6 +18,7 @@ import java.io.IOException; ...@@ -19,6 +18,7 @@ import java.io.IOException;
/** /**
* common exception resolver * common exception resolver
* *
* @author xuxueli 2016-1-6 19:22:18
*/ */
@Component @Component
public class WebExceptionResolver implements HandlerExceptionResolver { public class WebExceptionResolver implements HandlerExceptionResolver {
...@@ -34,10 +34,12 @@ public class WebExceptionResolver implements HandlerExceptionResolver { ...@@ -34,10 +34,12 @@ public class WebExceptionResolver implements HandlerExceptionResolver {
// if json // if json
boolean isJson = false; boolean isJson = false;
HandlerMethod method = (HandlerMethod)handler; if (handler instanceof HandlerMethod) {
ResponseBody responseBody = method.getMethodAnnotation(ResponseBody.class); HandlerMethod method = (HandlerMethod)handler;
if (responseBody != null) { ResponseBody responseBody = method.getMethodAnnotation(ResponseBody.class);
isJson = true; if (responseBody != null) {
isJson = true;
}
} }
// error result // error result
......
package com.liquidnet.client.job.core.alarm; package com.liquidnet.client.job.admin.core.alarm;
import com.liquidnet.client.job.admin.core.model.XxlJobInfo;
import com.liquidnet.client.job.admin.core.model.XxlJobLog;
import com.liquidnet.client.job.core.model.XxlJobInfo; /**
import com.liquidnet.client.job.core.model.XxlJobLog; * @author xuxueli 2020-01-19
*/
public interface JobAlarm { public interface JobAlarm {
/** /**
......
package com.liquidnet.client.job.core.alarm; package com.liquidnet.client.job.admin.core.alarm;
import com.liquidnet.client.job.admin.core.model.XxlJobInfo;
import com.liquidnet.client.job.core.model.XxlJobInfo; import com.liquidnet.client.job.admin.core.model.XxlJobLog;
import com.liquidnet.client.job.core.model.XxlJobLog;
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;
......
package com.liquidnet.client.job.core.alarm.impl; package com.liquidnet.client.job.admin.core.alarm.impl;
import com.liquidnet.client.job.admin.core.alarm.JobAlarm;
import com.liquidnet.client.job.core.conf.XxlJobAdminConfig; import com.liquidnet.client.job.admin.core.conf.XxlJobAdminConfig;
import com.liquidnet.client.job.core.util.I18nUtil; import com.liquidnet.client.job.admin.core.model.XxlJobGroup;
import com.liquidnet.client.job.core.alarm.JobAlarm; import com.liquidnet.client.job.admin.core.model.XxlJobInfo;
import com.liquidnet.client.job.core.model.XxlJobGroup; import com.liquidnet.client.job.admin.core.model.XxlJobLog;
import com.liquidnet.client.job.core.model.XxlJobInfo; import com.liquidnet.client.job.admin.core.util.I18nUtil;
import com.liquidnet.client.job.core.model.XxlJobLog;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -22,6 +21,7 @@ import java.util.Set; ...@@ -22,6 +21,7 @@ import java.util.Set;
/** /**
* job alarm by email * job alarm by email
* *
* @author xuxueli 2020-01-19
*/ */
@Component @Component
public class EmailJobAlarm implements JobAlarm { public class EmailJobAlarm implements JobAlarm {
...@@ -65,7 +65,7 @@ public class EmailJobAlarm implements JobAlarm { ...@@ -65,7 +65,7 @@ public class EmailJobAlarm implements JobAlarm {
MimeMessage mimeMessage = XxlJobAdminConfig.getAdminConfig().getMailSender().createMimeMessage(); MimeMessage mimeMessage = XxlJobAdminConfig.getAdminConfig().getMailSender().createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom(XxlJobAdminConfig.getAdminConfig().getEmailUserName(), personal); helper.setFrom(XxlJobAdminConfig.getAdminConfig().getEmailFrom(), personal);
helper.setTo(email); helper.setTo(email);
helper.setSubject(title); helper.setSubject(title);
helper.setText(content, true); helper.setText(content, true);
......
package com.liquidnet.client.job.admin.core.complete;
import com.liquidnet.client.job.admin.core.conf.XxlJobAdminConfig;
import com.liquidnet.client.job.admin.core.model.XxlJobInfo;
import com.liquidnet.client.job.admin.core.model.XxlJobLog;
import com.liquidnet.client.job.admin.core.thread.JobTriggerPoolHelper;
import com.liquidnet.client.job.admin.core.trigger.TriggerTypeEnum;
import com.liquidnet.client.job.admin.core.util.I18nUtil;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.context.XxlJobContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.MessageFormat;
/**
* @author xuxueli 2020-10-30 20:43:10
*/
public class XxlJobCompleter {
private static Logger logger = LoggerFactory.getLogger(XxlJobCompleter.class);
/**
* common fresh handle entrance (limit only once)
*
* @param xxlJobLog
* @return
*/
public static int updateHandleInfoAndFinish(XxlJobLog xxlJobLog) {
// finish
finishJob(xxlJobLog);
// text最大64kb 避免长度过长
if (xxlJobLog.getHandleMsg().length() > 15000) {
xxlJobLog.setHandleMsg( xxlJobLog.getHandleMsg().substring(0, 15000) );
}
// fresh handle
return XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateHandleInfo(xxlJobLog);
}
/**
* do somethind to finish job
*/
private static void finishJob(XxlJobLog xxlJobLog){
// 1、handle success, to trigger child job
String triggerChildMsg = null;
if (XxlJobContext.HANDLE_COCE_SUCCESS == xxlJobLog.getHandleCode()) {
XxlJobInfo xxlJobInfo = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(xxlJobLog.getJobId());
if (xxlJobInfo!=null && xxlJobInfo.getChildJobId()!=null && xxlJobInfo.getChildJobId().trim().length()>0) {
triggerChildMsg = "<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_child_run") +"<<<<<<<<<<< </span><br>";
String[] childJobIds = xxlJobInfo.getChildJobId().split(",");
for (int i = 0; i < childJobIds.length; i++) {
int childJobId = (childJobIds[i]!=null && childJobIds[i].trim().length()>0 && isNumeric(childJobIds[i]))?Integer.valueOf(childJobIds[i]):-1;
if (childJobId > 0) {
JobTriggerPoolHelper.trigger(childJobId, TriggerTypeEnum.PARENT, -1, null, null, null);
ReturnT<String> triggerChildResult = ReturnT.SUCCESS;
// add msg
triggerChildMsg += MessageFormat.format(I18nUtil.getString("jobconf_callback_child_msg1"),
(i+1),
childJobIds.length,
childJobIds[i],
(triggerChildResult.getCode()==ReturnT.SUCCESS_CODE?I18nUtil.getString("system_success"):I18nUtil.getString("system_fail")),
triggerChildResult.getMsg());
} else {
triggerChildMsg += MessageFormat.format(I18nUtil.getString("jobconf_callback_child_msg2"),
(i+1),
childJobIds.length,
childJobIds[i]);
}
}
}
}
if (triggerChildMsg != null) {
xxlJobLog.setHandleMsg( xxlJobLog.getHandleMsg() + triggerChildMsg );
}
// 2、fix_delay trigger next
// on the way
}
private static boolean isNumeric(String str){
try {
int result = Integer.valueOf(str);
return true;
} catch (NumberFormatException e) {
return false;
}
}
}
package com.liquidnet.client.job.core.conf; package com.liquidnet.client.job.admin.core.conf;
import com.liquidnet.client.job.admin.core.alarm.JobAlarmer;
import com.liquidnet.client.job.core.alarm.JobAlarmer; import com.liquidnet.client.job.admin.core.scheduler.XxlJobScheduler;
import com.liquidnet.client.job.core.scheduler.XxlJobScheduler; import com.liquidnet.client.job.admin.dao.*;
import com.liquidnet.client.job.dao.*;
import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.DisposableBean;
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;
...@@ -17,6 +16,7 @@ import java.util.Arrays; ...@@ -17,6 +16,7 @@ import java.util.Arrays;
/** /**
* xxl-job config * xxl-job config
* *
* @author xuxueli 2017-04-28
*/ */
@Component @Component
...@@ -55,8 +55,8 @@ public class XxlJobAdminConfig implements InitializingBean, DisposableBean { ...@@ -55,8 +55,8 @@ public class XxlJobAdminConfig implements InitializingBean, DisposableBean {
@Value("${xxl.job.accessToken}") @Value("${xxl.job.accessToken}")
private String accessToken; private String accessToken;
@Value("${spring.mail.username}") @Value("${spring.mail.from}")
private String emailUserName; private String emailFrom;
@Value("${xxl.job.triggerpool.fast.max}") @Value("${xxl.job.triggerpool.fast.max}")
private int triggerPoolFastMax; private int triggerPoolFastMax;
...@@ -98,8 +98,8 @@ public class XxlJobAdminConfig implements InitializingBean, DisposableBean { ...@@ -98,8 +98,8 @@ public class XxlJobAdminConfig implements InitializingBean, DisposableBean {
return accessToken; return accessToken;
} }
public String getEmailUserName() { public String getEmailFrom() {
return emailUserName; return emailFrom;
} }
public int getTriggerPoolFastMax() { public int getTriggerPoolFastMax() {
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
* *
*/ */
package com.liquidnet.client.job.core.cron; package com.liquidnet.client.job.admin.core.cron;
import java.io.Serializable; import java.io.Serializable;
import java.text.ParseException; import java.text.ParseException;
...@@ -889,7 +889,7 @@ public final class CronExpression implements Serializable, Cloneable { ...@@ -889,7 +889,7 @@ public final class CronExpression implements Serializable, Cloneable {
return buf.toString(); return buf.toString();
} }
protected String getExpressionSetSummary(Set<Integer> set) { protected String getExpressionSetSummary(java.util.Set<Integer> set) {
if (set.contains(NO_SPEC)) { if (set.contains(NO_SPEC)) {
return "?"; return "?";
...@@ -915,7 +915,7 @@ public final class CronExpression implements Serializable, Cloneable { ...@@ -915,7 +915,7 @@ public final class CronExpression implements Serializable, Cloneable {
return buf.toString(); return buf.toString();
} }
protected String getExpressionSetSummary(ArrayList<Integer> list) { protected String getExpressionSetSummary(java.util.ArrayList<Integer> list) {
if (list.contains(NO_SPEC)) { if (list.contains(NO_SPEC)) {
return "?"; return "?";
...@@ -1162,7 +1162,7 @@ public final class CronExpression implements Serializable, Cloneable { ...@@ -1162,7 +1162,7 @@ public final class CronExpression implements Serializable, Cloneable {
public Date getTimeAfter(Date afterTime) { public Date getTimeAfter(Date afterTime) {
// Computation is based on Gregorian year only. // Computation is based on Gregorian year only.
Calendar cl = new GregorianCalendar(getTimeZone()); Calendar cl = new java.util.GregorianCalendar(getTimeZone());
// move ahead one second, since we're computing the time *after* the // move ahead one second, since we're computing the time *after* the
// given time // given time
......
package com.liquidnet.client.job.core.exception; package com.liquidnet.client.job.admin.core.exception;
/**
* @author xuxueli 2019-05-04 23:19:29
*/
public class XxlJobException extends RuntimeException { public class XxlJobException extends RuntimeException {
public XxlJobException() { public XxlJobException() {
......
package com.liquidnet.client.job.core.model; package com.liquidnet.client.job.admin.core.model;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date;
import java.util.List; import java.util.List;
/**
* Created by xuxueli on 16/9/30.
*/
public class XxlJobGroup { public class XxlJobGroup {
private int id; private int id;
...@@ -12,6 +15,7 @@ public class XxlJobGroup { ...@@ -12,6 +15,7 @@ public class XxlJobGroup {
private String title; private String title;
private int addressType; // 执行器地址类型:0=自动注册、1=手动录入 private int addressType; // 执行器地址类型:0=自动注册、1=手动录入
private String addressList; // 执行器地址列表,多地址逗号分隔(手动录入) private String addressList; // 执行器地址列表,多地址逗号分隔(手动录入)
private Date updateTime;
// registry list // registry list
private List<String> registryList; // 执行器地址列表(系统注册) private List<String> registryList; // 执行器地址列表(系统注册)
...@@ -58,6 +62,14 @@ public class XxlJobGroup { ...@@ -58,6 +62,14 @@ public class XxlJobGroup {
return addressList; return addressList;
} }
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public void setAddressList(String addressList) { public void setAddressList(String addressList) {
this.addressList = addressList; this.addressList = addressList;
} }
......
package com.liquidnet.client.job.core.model; package com.liquidnet.client.job.admin.core.model;
import java.util.Date; import java.util.Date;
/** /**
* xxl-job info * xxl-job info
* *
* @author xuxueli 2016-1-12 18:25:49
*/ */
public class XxlJobInfo { public class XxlJobInfo {
private int id; // 主键ID private int id; // 主键ID
private int jobGroup; // 执行器主键ID private int jobGroup; // 执行器主键ID
private String jobCron; // 任务执行CRON表达式
private String jobDesc; private String jobDesc;
private Date addTime; private Date addTime;
...@@ -20,6 +20,10 @@ public class XxlJobInfo { ...@@ -20,6 +20,10 @@ public class XxlJobInfo {
private String author; // 负责人 private String author; // 负责人
private String alarmEmail; // 报警邮件 private String alarmEmail; // 报警邮件
private String scheduleType; // 调度类型
private String scheduleConf; // 调度配置,值含义取决于调度类型
private String misfireStrategy; // 调度过期策略
private String executorRouteStrategy; // 执行器路由策略 private String executorRouteStrategy; // 执行器路由策略
private String executorHandler; // 执行器,任务Handler名称 private String executorHandler; // 执行器,任务Handler名称
private String executorParam; // 执行器,任务参数 private String executorParam; // 执行器,任务参数
...@@ -55,14 +59,6 @@ public class XxlJobInfo { ...@@ -55,14 +59,6 @@ public class XxlJobInfo {
this.jobGroup = jobGroup; this.jobGroup = jobGroup;
} }
public String getJobCron() {
return jobCron;
}
public void setJobCron(String jobCron) {
this.jobCron = jobCron;
}
public String getJobDesc() { public String getJobDesc() {
return jobDesc; return jobDesc;
} }
...@@ -103,6 +99,30 @@ public class XxlJobInfo { ...@@ -103,6 +99,30 @@ public class XxlJobInfo {
this.alarmEmail = alarmEmail; this.alarmEmail = alarmEmail;
} }
public String getScheduleType() {
return scheduleType;
}
public void setScheduleType(String scheduleType) {
this.scheduleType = scheduleType;
}
public String getScheduleConf() {
return scheduleConf;
}
public void setScheduleConf(String scheduleConf) {
this.scheduleConf = scheduleConf;
}
public String getMisfireStrategy() {
return misfireStrategy;
}
public void setMisfireStrategy(String misfireStrategy) {
this.misfireStrategy = misfireStrategy;
}
public String getExecutorRouteStrategy() { public String getExecutorRouteStrategy() {
return executorRouteStrategy; return executorRouteStrategy;
} }
......
package com.liquidnet.client.job.core.model; package com.liquidnet.client.job.admin.core.model;
import java.util.Date; import java.util.Date;
/** /**
* xxl-job log, used to track trigger process * xxl-job log, used to track trigger process
* @author xuxueli 2015-12-19 23:19:09
*/ */
public class XxlJobLog { public class XxlJobLog {
......
package com.liquidnet.client.job.core.model; package com.liquidnet.client.job.admin.core.model;
import java.util.Date; import java.util.Date;
/** /**
* xxl-job log for glue, used to track job code process * xxl-job log for glue, used to track job code process
* @author xuxueli 2016-5-19 17:57:46
*/ */
public class XxlJobLogGlue { public class XxlJobLogGlue {
......
package com.liquidnet.client.job.core.model; package com.liquidnet.client.job.admin.core.model;
import java.util.Date; import java.util.Date;
/**
* Created by xuxueli on 16/9/30.
*/
public class XxlJobRegistry { public class XxlJobRegistry {
private int id; private int id;
......
package com.liquidnet.client.job.core.model; package com.liquidnet.client.job.admin.core.model;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
/**
* @author xuxueli 2019-05-04 16:43:12
*/
public class XxlJobUser { public class XxlJobUser {
private int id; private int id;
......
package com.liquidnet.client.job.core.old;//package com.xxl.job.admin.core.jobbean; package com.liquidnet.client.job.admin.core.old;//package com.liquidnet.client.job.admin.core.jobbean;
// //
//import com.xxl.job.admin.core.thread.JobTriggerPoolHelper; //import com.liquidnet.client.job.admin.core.thread.JobTriggerPoolHelper;
//import com.xxl.job.admin.core.trigger.TriggerTypeEnum; //import com.liquidnet.client.job.admin.core.trigger.TriggerTypeEnum;
//import org.quartz.JobExecutionContext; //import org.quartz.JobExecutionContext;
//import org.quartz.JobExecutionException; //import org.quartz.JobExecutionException;
//import org.quartz.JobKey; //import org.quartz.JobKey;
......
package com.liquidnet.client.job.core.old;//package com.xxl.job.admin.core.schedule; package com.liquidnet.client.job.admin.core.old;//package com.liquidnet.client.job.admin.core.schedule;
// //
//import com.xxl.job.admin.core.conf.XxlJobAdminConfig; //import com.liquidnet.client.job.admin.core.conf.XxlJobAdminConfig;
//import com.xxl.job.admin.core.jobbean.RemoteHttpJobBean; //import com.liquidnet.client.job.admin.core.jobbean.RemoteHttpJobBean;
//import com.xxl.job.admin.core.model.XxlJobInfo; //import com.liquidnet.client.job.admin.core.model.XxlJobInfo;
//import com.xxl.job.admin.core.thread.JobFailMonitorHelper; //import com.liquidnet.client.job.admin.core.thread.JobFailMonitorHelper;
//import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper; //import com.liquidnet.client.job.admin.core.thread.JobRegistryMonitorHelper;
//import com.xxl.job.admin.core.thread.JobTriggerPoolHelper; //import com.liquidnet.client.job.admin.core.thread.JobTriggerPoolHelper;
//import com.xxl.job.admin.core.util.I18nUtil; //import com.liquidnet.client.job.admin.core.util.I18nUtil;
//import com.xxl.job.core.biz.AdminBiz; //import com.xxl.job.core.biz.AdminBiz;
//import com.xxl.job.core.biz.ExecutorBiz; //import com.xxl.job.core.biz.ExecutorBiz;
//import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; //import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
......
package com.liquidnet.client.job.core.old;//package com.xxl.job.admin.core.quartz; package com.liquidnet.client.job.admin.core.old;//package com.liquidnet.client.job.admin.core.quartz;
// //
//import org.quartz.SchedulerConfigException; //import org.quartz.SchedulerConfigException;
//import org.quartz.spi.ThreadPool; //import org.quartz.spi.ThreadPool;
......
package com.liquidnet.client.job.core.route; package com.liquidnet.client.job.admin.core.route;
import com.liquidnet.client.job.core.route.strategy.*;
import com.liquidnet.client.job.core.util.I18nUtil;
import com.liquidnet.client.job.core.route.strategy.*;
import com.liquidnet.client.job.admin.core.route.strategy.*;
import com.liquidnet.client.job.admin.core.util.I18nUtil;
/**
* Created by xuxueli on 17/3/10.
*/
public enum ExecutorRouteStrategyEnum { public enum ExecutorRouteStrategyEnum {
FIRST(I18nUtil.getString("jobconf_route_first"), new ExecutorRouteFirst()), FIRST(I18nUtil.getString("jobconf_route_first"), new ExecutorRouteFirst()),
......
package com.liquidnet.client.job.core.route; package com.liquidnet.client.job.admin.core.route;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.biz.model.TriggerParam; import com.xxl.job.core.biz.model.TriggerParam;
...@@ -7,7 +7,9 @@ import org.slf4j.LoggerFactory; ...@@ -7,7 +7,9 @@ import org.slf4j.LoggerFactory;
import java.util.List; import java.util.List;
/**
* Created by xuxueli on 17/3/10.
*/
public abstract class ExecutorRouter { public abstract class ExecutorRouter {
protected static Logger logger = LoggerFactory.getLogger(ExecutorRouter.class); protected static Logger logger = LoggerFactory.getLogger(ExecutorRouter.class);
......
package com.liquidnet.client.job.core.route.strategy; package com.liquidnet.client.job.admin.core.route.strategy;
import com.liquidnet.client.job.admin.core.route.ExecutorRouter;
import com.liquidnet.client.job.core.route.ExecutorRouter; import com.liquidnet.client.job.admin.core.scheduler.XxlJobScheduler;
import com.liquidnet.client.job.core.util.I18nUtil; import com.liquidnet.client.job.admin.core.util.I18nUtil;
import com.liquidnet.client.job.core.scheduler.XxlJobScheduler;
import com.xxl.job.core.biz.ExecutorBiz; import com.xxl.job.core.biz.ExecutorBiz;
import com.xxl.job.core.biz.model.IdleBeatParam; import com.xxl.job.core.biz.model.IdleBeatParam;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
...@@ -11,6 +10,9 @@ import com.xxl.job.core.biz.model.TriggerParam; ...@@ -11,6 +10,9 @@ import com.xxl.job.core.biz.model.TriggerParam;
import java.util.List; import java.util.List;
/**
* Created by xuxueli on 17/3/10.
*/
public class ExecutorRouteBusyover extends ExecutorRouter { public class ExecutorRouteBusyover extends ExecutorRouter {
@Override @Override
......
package com.liquidnet.client.job.core.route.strategy; package com.liquidnet.client.job.admin.core.route.strategy;
import com.liquidnet.client.job.admin.core.route.ExecutorRouter;
import com.liquidnet.client.job.core.route.ExecutorRouter;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.biz.model.TriggerParam; import com.xxl.job.core.biz.model.TriggerParam;
...@@ -16,6 +15,7 @@ import java.util.TreeMap; ...@@ -16,6 +15,7 @@ import java.util.TreeMap;
* 分组下机器地址相同,不同JOB均匀散列在不同机器上,保证分组下机器分配JOB平均;且每个JOB固定调度其中一台机器; * 分组下机器地址相同,不同JOB均匀散列在不同机器上,保证分组下机器分配JOB平均;且每个JOB固定调度其中一台机器;
* a、virtual node:解决不均衡问题 * a、virtual node:解决不均衡问题
* b、hash method replace hashCode:String的hashCode可能重复,需要进一步扩大hashCode的取值范围 * b、hash method replace hashCode:String的hashCode可能重复,需要进一步扩大hashCode的取值范围
* Created by xuxueli on 17/3/10.
*/ */
public class ExecutorRouteConsistentHash extends ExecutorRouter { public class ExecutorRouteConsistentHash extends ExecutorRouter {
......
package com.liquidnet.client.job.core.route.strategy; package com.liquidnet.client.job.admin.core.route.strategy;
import com.liquidnet.client.job.core.route.ExecutorRouter; import com.liquidnet.client.job.admin.core.route.ExecutorRouter;
import com.liquidnet.client.job.core.util.I18nUtil; import com.liquidnet.client.job.admin.core.scheduler.XxlJobScheduler;
import com.liquidnet.client.job.core.scheduler.XxlJobScheduler; import com.liquidnet.client.job.admin.core.util.I18nUtil;
import com.xxl.job.core.biz.ExecutorBiz; import com.xxl.job.core.biz.ExecutorBiz;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.biz.model.TriggerParam; import com.xxl.job.core.biz.model.TriggerParam;
import java.util.List; import java.util.List;
/**
* Created by xuxueli on 17/3/10.
*/
public class ExecutorRouteFailover extends ExecutorRouter { public class ExecutorRouteFailover extends ExecutorRouter {
@Override @Override
......
package com.liquidnet.client.job.core.route.strategy; package com.liquidnet.client.job.admin.core.route.strategy;
import com.liquidnet.client.job.core.route.ExecutorRouter; import com.liquidnet.client.job.admin.core.route.ExecutorRouter;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.biz.model.TriggerParam; import com.xxl.job.core.biz.model.TriggerParam;
import java.util.List; import java.util.List;
/**
* Created by xuxueli on 17/3/10.
*/
public class ExecutorRouteFirst extends ExecutorRouter { public class ExecutorRouteFirst extends ExecutorRouter {
@Override @Override
......
package com.liquidnet.client.job.core.route.strategy; package com.liquidnet.client.job.admin.core.route.strategy;
import com.liquidnet.client.job.admin.core.route.ExecutorRouter;
import com.liquidnet.client.job.core.route.ExecutorRouter;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.biz.model.TriggerParam; import com.xxl.job.core.biz.model.TriggerParam;
...@@ -14,6 +13,7 @@ import java.util.concurrent.ConcurrentMap; ...@@ -14,6 +13,7 @@ import java.util.concurrent.ConcurrentMap;
* a(*)、LFU(Least Frequently Used):最不经常使用,频率/次数 * a(*)、LFU(Least Frequently Used):最不经常使用,频率/次数
* b、LRU(Least Recently Used):最近最久未使用,时间 * b、LRU(Least Recently Used):最近最久未使用,时间
* *
* Created by xuxueli on 17/3/10.
*/ */
public class ExecutorRouteLFU extends ExecutorRouter { public class ExecutorRouteLFU extends ExecutorRouter {
......
package com.liquidnet.client.job.core.route.strategy; package com.liquidnet.client.job.admin.core.route.strategy;
import com.liquidnet.client.job.core.route.ExecutorRouter; import com.liquidnet.client.job.admin.core.route.ExecutorRouter;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.biz.model.TriggerParam; import com.xxl.job.core.biz.model.TriggerParam;
...@@ -15,6 +15,7 @@ import java.util.concurrent.ConcurrentMap; ...@@ -15,6 +15,7 @@ import java.util.concurrent.ConcurrentMap;
* a、LFU(Least Frequently Used):最不经常使用,频率/次数 * a、LFU(Least Frequently Used):最不经常使用,频率/次数
* b(*)、LRU(Least Recently Used):最近最久未使用,时间 * b(*)、LRU(Least Recently Used):最近最久未使用,时间
* *
* Created by xuxueli on 17/3/10.
*/ */
public class ExecutorRouteLRU extends ExecutorRouter { public class ExecutorRouteLRU extends ExecutorRouter {
......
package com.liquidnet.client.job.core.route.strategy; package com.liquidnet.client.job.admin.core.route.strategy;
import com.liquidnet.client.job.core.route.ExecutorRouter; import com.liquidnet.client.job.admin.core.route.ExecutorRouter;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.biz.model.TriggerParam; import com.xxl.job.core.biz.model.TriggerParam;
import java.util.List; import java.util.List;
/**
* Created by xuxueli on 17/3/10.
*/
public class ExecutorRouteLast extends ExecutorRouter { public class ExecutorRouteLast extends ExecutorRouter {
@Override @Override
......
package com.liquidnet.client.job.core.route.strategy; package com.liquidnet.client.job.admin.core.route.strategy;
import com.liquidnet.client.job.core.route.ExecutorRouter; import com.liquidnet.client.job.admin.core.route.ExecutorRouter;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.biz.model.TriggerParam; import com.xxl.job.core.biz.model.TriggerParam;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
/**
* Created by xuxueli on 17/3/10.
*/
public class ExecutorRouteRandom extends ExecutorRouter { public class ExecutorRouteRandom extends ExecutorRouter {
private static Random localRandom = new Random(); private static Random localRandom = new Random();
......
package com.liquidnet.client.job.core.route.strategy; package com.liquidnet.client.job.admin.core.route.strategy;
import com.liquidnet.client.job.core.route.ExecutorRouter; import com.liquidnet.client.job.admin.core.route.ExecutorRouter;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.biz.model.TriggerParam; import com.xxl.job.core.biz.model.TriggerParam;
...@@ -8,12 +8,16 @@ import java.util.List; ...@@ -8,12 +8,16 @@ import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Created by xuxueli on 17/3/10.
*/
public class ExecutorRouteRound extends ExecutorRouter { public class ExecutorRouteRound extends ExecutorRouter {
private static ConcurrentMap<Integer, Integer> routeCountEachJob = new ConcurrentHashMap<Integer, Integer>(); private static ConcurrentMap<Integer, AtomicInteger> routeCountEachJob = new ConcurrentHashMap<>();
private static long CACHE_VALID_TIME = 0; private static long CACHE_VALID_TIME = 0;
private static int count(int jobId) { private static int count(int jobId) {
// cache clear // cache clear
if (System.currentTimeMillis() > CACHE_VALID_TIME) { if (System.currentTimeMillis() > CACHE_VALID_TIME) {
...@@ -21,11 +25,16 @@ public class ExecutorRouteRound extends ExecutorRouter { ...@@ -21,11 +25,16 @@ public class ExecutorRouteRound extends ExecutorRouter {
CACHE_VALID_TIME = System.currentTimeMillis() + 1000*60*60*24; CACHE_VALID_TIME = System.currentTimeMillis() + 1000*60*60*24;
} }
// count++ AtomicInteger count = routeCountEachJob.get(jobId);
Integer count = routeCountEachJob.get(jobId); if (count == null || count.get() > 1000000) {
count = (count==null || count>1000000)?(new Random().nextInt(100)):++count; // 初始化时主动Random一次,缓解首次压力 // 初始化时主动Random一次,缓解首次压力
count = new AtomicInteger(new Random().nextInt(100));
} else {
// count++
count.addAndGet(1);
}
routeCountEachJob.put(jobId, count); routeCountEachJob.put(jobId, count);
return count; return count.get();
} }
@Override @Override
......
package com.liquidnet.client.job.admin.core.scheduler;
import com.liquidnet.client.job.admin.core.util.I18nUtil;
/**
* @author xuxueli 2020-10-29 21:11:23
*/
public enum MisfireStrategyEnum {
/**
* do nothing
*/
DO_NOTHING(I18nUtil.getString("misfire_strategy_do_nothing")),
/**
* fire once now
*/
FIRE_ONCE_NOW(I18nUtil.getString("misfire_strategy_fire_once_now"));
private String title;
MisfireStrategyEnum(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
public static MisfireStrategyEnum match(String name, MisfireStrategyEnum defaultItem){
for (MisfireStrategyEnum item: MisfireStrategyEnum.values()) {
if (item.name().equals(name)) {
return item;
}
}
return defaultItem;
}
}
package com.liquidnet.client.job.admin.core.scheduler;
import com.liquidnet.client.job.admin.core.util.I18nUtil;
/**
* @author xuxueli 2020-10-29 21:11:23
*/
public enum ScheduleTypeEnum {
NONE(I18nUtil.getString("schedule_type_none")),
/**
* schedule by cron
*/
CRON(I18nUtil.getString("schedule_type_cron")),
/**
* schedule by fixed rate (in seconds)
*/
FIX_RATE(I18nUtil.getString("schedule_type_fix_rate")),
/**
* schedule by fix delay (in seconds), after the last time
*/
/*FIX_DELAY(I18nUtil.getString("schedule_type_fix_delay"))*/;
private String title;
ScheduleTypeEnum(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
public static ScheduleTypeEnum match(String name, ScheduleTypeEnum defaultItem){
for (ScheduleTypeEnum item: ScheduleTypeEnum.values()) {
if (item.name().equals(name)) {
return item;
}
}
return defaultItem;
}
}
package com.liquidnet.client.job.core.scheduler; package com.liquidnet.client.job.admin.core.scheduler;
import com.liquidnet.client.job.admin.core.conf.XxlJobAdminConfig;
import com.liquidnet.client.job.core.conf.XxlJobAdminConfig; import com.liquidnet.client.job.admin.core.thread.*;
import com.liquidnet.client.job.core.thread.*; import com.liquidnet.client.job.admin.core.util.I18nUtil;
import com.liquidnet.client.job.core.util.I18nUtil;
import com.liquidnet.client.job.core.thread.*;
import com.xxl.job.core.biz.ExecutorBiz; import com.xxl.job.core.biz.ExecutorBiz;
import com.xxl.job.core.biz.client.ExecutorBizClient; import com.xxl.job.core.biz.client.ExecutorBizClient;
import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
...@@ -14,7 +12,9 @@ import org.slf4j.LoggerFactory; ...@@ -14,7 +12,9 @@ import org.slf4j.LoggerFactory;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
/**
* @author xuxueli 2018-10-28 00:18:17
*/
public class XxlJobScheduler { public class XxlJobScheduler {
private static final Logger logger = LoggerFactory.getLogger(XxlJobScheduler.class); private static final Logger logger = LoggerFactory.getLogger(XxlJobScheduler.class);
...@@ -24,22 +24,22 @@ public class XxlJobScheduler { ...@@ -24,22 +24,22 @@ public class XxlJobScheduler {
// init i18n // init i18n
initI18n(); initI18n();
// admin trigger pool start
JobTriggerPoolHelper.toStart();
// admin registry monitor run // admin registry monitor run
JobRegistryMonitorHelper.getInstance().start(); JobRegistryHelper.getInstance().start();
// admin fail-monitor run // admin fail-monitor run
JobFailMonitorHelper.getInstance().start(); JobFailMonitorHelper.getInstance().start();
// admin lose-monitor run // admin lose-monitor run ( depend on JobTriggerPoolHelper )
JobLosedMonitorHelper.getInstance().start(); JobCompleteHelper.getInstance().start();
// admin trigger pool start
JobTriggerPoolHelper.toStart();
// admin log report start // admin log report start
JobLogReportHelper.getInstance().start(); JobLogReportHelper.getInstance().start();
// start-schedule // start-schedule ( depend on JobTriggerPoolHelper )
JobScheduleHelper.getInstance().start(); JobScheduleHelper.getInstance().start();
logger.info(">>>>>>>>> init xxl-job admin success."); logger.info(">>>>>>>>> init xxl-job admin success.");
...@@ -54,17 +54,17 @@ public class XxlJobScheduler { ...@@ -54,17 +54,17 @@ public class XxlJobScheduler {
// admin log report stop // admin log report stop
JobLogReportHelper.getInstance().toStop(); JobLogReportHelper.getInstance().toStop();
// admin trigger pool stop
JobTriggerPoolHelper.toStop();
// admin lose-monitor stop // admin lose-monitor stop
JobLosedMonitorHelper.getInstance().toStop(); JobCompleteHelper.getInstance().toStop();
// admin fail-monitor stop // admin fail-monitor stop
JobFailMonitorHelper.getInstance().toStop(); JobFailMonitorHelper.getInstance().toStop();
// admin registry stop // admin registry stop
JobRegistryMonitorHelper.getInstance().toStop(); JobRegistryHelper.getInstance().toStop();
// admin trigger pool stop
JobTriggerPoolHelper.toStop();
} }
......
package com.liquidnet.client.job.core.thread; package com.liquidnet.client.job.admin.core.thread;
import com.liquidnet.client.job.admin.core.complete.XxlJobCompleter;
import com.liquidnet.client.job.core.conf.XxlJobAdminConfig; import com.liquidnet.client.job.admin.core.conf.XxlJobAdminConfig;
import com.liquidnet.client.job.core.model.XxlJobLog; import com.liquidnet.client.job.admin.core.model.XxlJobLog;
import com.liquidnet.client.job.core.util.I18nUtil; import com.liquidnet.client.job.admin.core.util.I18nUtil;
import com.xxl.job.core.biz.model.HandleCallbackParam;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.util.DateUtil; import com.xxl.job.core.util.DateUtil;
import org.slf4j.Logger; import org.slf4j.Logger;
...@@ -11,30 +12,65 @@ import org.slf4j.LoggerFactory; ...@@ -11,30 +12,65 @@ import org.slf4j.LoggerFactory;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.*;
/** /**
* job lose-monitor instance * job lose-monitor instance
* *
* @author xuxueli 2015-9-1 18:05:56
*/ */
public class JobLosedMonitorHelper { public class JobCompleteHelper {
private static Logger logger = LoggerFactory.getLogger(JobLosedMonitorHelper.class); private static Logger logger = LoggerFactory.getLogger(JobCompleteHelper.class);
private static JobLosedMonitorHelper instance = new JobLosedMonitorHelper(); private static JobCompleteHelper instance = new JobCompleteHelper();
public static JobLosedMonitorHelper getInstance(){ public static JobCompleteHelper getInstance(){
return instance; return instance;
} }
// ---------------------- monitor ---------------------- // ---------------------- monitor ----------------------
private ThreadPoolExecutor callbackThreadPool = null;
private Thread monitorThread; private Thread monitorThread;
private volatile boolean toStop = false; private volatile boolean toStop = false;
public void start(){ public void start(){
// for callback
callbackThreadPool = new ThreadPoolExecutor(
2,
20,
30L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(3000),
new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r, "xxl-job, admin JobLosedMonitorHelper-callbackThreadPool-" + r.hashCode());
}
},
new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
r.run();
logger.warn(">>>>>>>>>>> xxl-job, callback too fast, match threadpool rejected handler(run now).");
}
});
// for monitor
monitorThread = new Thread(new Runnable() { monitorThread = new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
// wait for JobTriggerPoolHelper-init
try {
TimeUnit.MILLISECONDS.sleep(50);
} catch (InterruptedException e) {
if (!toStop) {
logger.error(e.getMessage(), e);
}
}
// monitor // monitor
while (!toStop) { while (!toStop) {
try { try {
...@@ -50,9 +86,9 @@ public class JobLosedMonitorHelper { ...@@ -50,9 +86,9 @@ public class JobLosedMonitorHelper {
jobLog.setHandleTime(new Date()); jobLog.setHandleTime(new Date());
jobLog.setHandleCode(ReturnT.FAIL_CODE); jobLog.setHandleCode(ReturnT.FAIL_CODE);
jobLog.setHandleMsg(I18nUtil.getString("joblog_lost_fail") ); jobLog.setHandleMsg( I18nUtil.getString("joblog_lost_fail") );
XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateHandleInfo(jobLog); XxlJobCompleter.updateHandleInfoAndFinish(jobLog);
} }
} }
...@@ -83,7 +119,11 @@ public class JobLosedMonitorHelper { ...@@ -83,7 +119,11 @@ public class JobLosedMonitorHelper {
public void toStop(){ public void toStop(){
toStop = true; toStop = true;
// interrupt and wait
// stop registryOrRemoveThreadPool
callbackThreadPool.shutdownNow();
// stop monitorThread (interrupt and wait)
monitorThread.interrupt(); monitorThread.interrupt();
try { try {
monitorThread.join(); monitorThread.join();
...@@ -92,4 +132,53 @@ public class JobLosedMonitorHelper { ...@@ -92,4 +132,53 @@ public class JobLosedMonitorHelper {
} }
} }
// ---------------------- helper ----------------------
public ReturnT<String> callback(List<HandleCallbackParam> callbackParamList) {
callbackThreadPool.execute(new Runnable() {
@Override
public void run() {
for (HandleCallbackParam handleCallbackParam: callbackParamList) {
ReturnT<String> callbackResult = callback(handleCallbackParam);
logger.debug(">>>>>>>>> JobApiController.callback {}, handleCallbackParam={}, callbackResult={}",
(callbackResult.getCode()== ReturnT.SUCCESS_CODE?"success":"fail"), handleCallbackParam, callbackResult);
}
}
});
return ReturnT.SUCCESS;
}
private ReturnT<String> callback(HandleCallbackParam handleCallbackParam) {
// valid log item
XxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(handleCallbackParam.getLogId());
if (log == null) {
return new ReturnT<String>(ReturnT.FAIL_CODE, "log item not found.");
}
if (log.getHandleCode() > 0) {
return new ReturnT<String>(ReturnT.FAIL_CODE, "log repeate callback."); // avoid repeat callback, trigger child job etc
}
// handle msg
StringBuffer handleMsg = new StringBuffer();
if (log.getHandleMsg()!=null) {
handleMsg.append(log.getHandleMsg()).append("<br>");
}
if (handleCallbackParam.getHandleMsg() != null) {
handleMsg.append(handleCallbackParam.getHandleMsg());
}
// success, save log
log.setHandleTime(new Date());
log.setHandleCode(handleCallbackParam.getHandleCode());
log.setHandleMsg(handleMsg.toString());
XxlJobCompleter.updateHandleInfoAndFinish(log);
return ReturnT.SUCCESS;
}
} }
package com.liquidnet.client.job.core.thread; package com.liquidnet.client.job.admin.core.thread;
import com.liquidnet.client.job.admin.core.conf.XxlJobAdminConfig;
import com.liquidnet.client.job.core.conf.XxlJobAdminConfig; import com.liquidnet.client.job.admin.core.model.XxlJobInfo;
import com.liquidnet.client.job.core.model.XxlJobInfo; import com.liquidnet.client.job.admin.core.model.XxlJobLog;
import com.liquidnet.client.job.core.model.XxlJobLog; import com.liquidnet.client.job.admin.core.trigger.TriggerTypeEnum;
import com.liquidnet.client.job.core.util.I18nUtil; import com.liquidnet.client.job.admin.core.util.I18nUtil;
import com.liquidnet.client.job.core.trigger.TriggerTypeEnum;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -15,6 +14,7 @@ import java.util.concurrent.TimeUnit; ...@@ -15,6 +14,7 @@ import java.util.concurrent.TimeUnit;
/** /**
* job monitor instance * job monitor instance
* *
* @author xuxueli 2015-9-1 18:05:56
*/ */
public class JobFailMonitorHelper { public class JobFailMonitorHelper {
private static Logger logger = LoggerFactory.getLogger(JobFailMonitorHelper.class); private static Logger logger = LoggerFactory.getLogger(JobFailMonitorHelper.class);
......
package com.liquidnet.client.job.core.thread; package com.liquidnet.client.job.admin.core.thread;
import com.liquidnet.client.job.admin.core.conf.XxlJobAdminConfig;
import com.liquidnet.client.job.core.conf.XxlJobAdminConfig; import com.liquidnet.client.job.admin.core.model.XxlJobLogReport;
import com.liquidnet.client.job.core.model.XxlJobLogReport;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -15,6 +14,7 @@ import java.util.concurrent.TimeUnit; ...@@ -15,6 +14,7 @@ import java.util.concurrent.TimeUnit;
/** /**
* job log report helper * job log report helper
* *
* @author xuxueli 2019-11-22
*/ */
public class JobLogReportHelper { public class JobLogReportHelper {
private static Logger logger = LoggerFactory.getLogger(JobLogReportHelper.class); private static Logger logger = LoggerFactory.getLogger(JobLogReportHelper.class);
......
package com.liquidnet.client.job.core.thread; package com.liquidnet.client.job.admin.core.thread;
import com.liquidnet.client.job.admin.core.conf.XxlJobAdminConfig;
import com.liquidnet.client.job.core.conf.XxlJobAdminConfig; import com.liquidnet.client.job.admin.core.model.XxlJobGroup;
import com.liquidnet.client.job.core.model.XxlJobGroup; import com.liquidnet.client.job.admin.core.model.XxlJobRegistry;
import com.liquidnet.client.job.core.model.XxlJobRegistry; import com.xxl.job.core.biz.model.RegistryParam;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.enums.RegistryConfig; import com.xxl.job.core.enums.RegistryConfig;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.*;
/** /**
* job registry instance * job registry instance
* @author xuxueli 2016-10-02 19:10:24
*/ */
public class JobRegistryMonitorHelper { public class JobRegistryHelper {
private static Logger logger = LoggerFactory.getLogger(JobRegistryMonitorHelper.class); private static Logger logger = LoggerFactory.getLogger(JobRegistryHelper.class);
private static JobRegistryMonitorHelper instance = new JobRegistryMonitorHelper(); private static JobRegistryHelper instance = new JobRegistryHelper();
public static JobRegistryMonitorHelper getInstance(){ public static JobRegistryHelper getInstance(){
return instance; return instance;
} }
private Thread registryThread; private ThreadPoolExecutor registryOrRemoveThreadPool = null;
private Thread registryMonitorThread;
private volatile boolean toStop = false; private volatile boolean toStop = false;
public void start(){ public void start(){
registryThread = new Thread(new Runnable() {
// for registry or remove
registryOrRemoveThreadPool = new ThreadPoolExecutor(
2,
10,
30L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(2000),
new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r, "xxl-job, admin JobRegistryMonitorHelper-registryOrRemoveThreadPool-" + r.hashCode());
}
},
new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
r.run();
logger.warn(">>>>>>>>>>> xxl-job, registry or remove too fast, match threadpool rejected handler(run now).");
}
});
// for monitor
registryMonitorThread = new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
while (!toStop) { while (!toStop) {
...@@ -66,13 +94,16 @@ public class JobRegistryMonitorHelper { ...@@ -66,13 +94,16 @@ public class JobRegistryMonitorHelper {
String addressListStr = null; String addressListStr = null;
if (registryList!=null && !registryList.isEmpty()) { if (registryList!=null && !registryList.isEmpty()) {
Collections.sort(registryList); Collections.sort(registryList);
addressListStr = ""; StringBuilder addressListSB = new StringBuilder();
for (String item:registryList) { for (String item:registryList) {
addressListStr += item + ","; addressListSB.append(item).append(",");
} }
addressListStr = addressListSB.toString();
addressListStr = addressListStr.substring(0, addressListStr.length()-1); addressListStr = addressListStr.substring(0, addressListStr.length()-1);
} }
group.setAddressList(addressListStr); group.setAddressList(addressListStr);
group.setUpdateTime(new Date());
XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().update(group); XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().update(group);
} }
} }
...@@ -92,20 +123,82 @@ public class JobRegistryMonitorHelper { ...@@ -92,20 +123,82 @@ public class JobRegistryMonitorHelper {
logger.info(">>>>>>>>>>> xxl-job, job registry monitor thread stop"); logger.info(">>>>>>>>>>> xxl-job, job registry monitor thread stop");
} }
}); });
registryThread.setDaemon(true); registryMonitorThread.setDaemon(true);
registryThread.setName("xxl-job, admin JobRegistryMonitorHelper"); registryMonitorThread.setName("xxl-job, admin JobRegistryMonitorHelper-registryMonitorThread");
registryThread.start(); registryMonitorThread.start();
} }
public void toStop(){ public void toStop(){
toStop = true; toStop = true;
// interrupt and wait
registryThread.interrupt(); // stop registryOrRemoveThreadPool
registryOrRemoveThreadPool.shutdownNow();
// stop monitir (interrupt and wait)
registryMonitorThread.interrupt();
try { try {
registryThread.join(); registryMonitorThread.join();
} catch (InterruptedException e) { } catch (InterruptedException e) {
logger.error(e.getMessage(), e); logger.error(e.getMessage(), e);
} }
} }
// ---------------------- helper ----------------------
public ReturnT<String> registry(RegistryParam registryParam) {
// valid
if (!StringUtils.hasText(registryParam.getRegistryGroup())
|| !StringUtils.hasText(registryParam.getRegistryKey())
|| !StringUtils.hasText(registryParam.getRegistryValue())) {
return new ReturnT<String>(ReturnT.FAIL_CODE, "Illegal Argument.");
}
// async execute
registryOrRemoveThreadPool.execute(new Runnable() {
@Override
public void run() {
int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryUpdate(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date());
if (ret < 1) {
XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registrySave(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date());
// fresh
freshGroupRegistryInfo(registryParam);
}
}
});
return ReturnT.SUCCESS;
}
public ReturnT<String> registryRemove(RegistryParam registryParam) {
// valid
if (!StringUtils.hasText(registryParam.getRegistryGroup())
|| !StringUtils.hasText(registryParam.getRegistryKey())
|| !StringUtils.hasText(registryParam.getRegistryValue())) {
return new ReturnT<String>(ReturnT.FAIL_CODE, "Illegal Argument.");
}
// async execute
registryOrRemoveThreadPool.execute(new Runnable() {
@Override
public void run() {
int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryDelete(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue());
if (ret > 0) {
// fresh
freshGroupRegistryInfo(registryParam);
}
}
});
return ReturnT.SUCCESS;
}
private void freshGroupRegistryInfo(RegistryParam registryParam){
// Under consideration, prevent affecting core tables
}
} }
package com.liquidnet.client.job.core.thread; package com.liquidnet.client.job.admin.core.thread;
import com.liquidnet.client.job.admin.core.conf.XxlJobAdminConfig;
import com.liquidnet.client.job.core.conf.XxlJobAdminConfig; import com.liquidnet.client.job.admin.core.cron.CronExpression;
import com.liquidnet.client.job.core.cron.CronExpression; import com.liquidnet.client.job.admin.core.model.XxlJobInfo;
import com.liquidnet.client.job.core.model.XxlJobInfo; import com.liquidnet.client.job.admin.core.scheduler.MisfireStrategyEnum;
import com.liquidnet.client.job.core.trigger.TriggerTypeEnum; import com.liquidnet.client.job.admin.core.scheduler.ScheduleTypeEnum;
import com.liquidnet.client.job.admin.core.trigger.TriggerTypeEnum;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.SQLException; import java.sql.SQLException;
import java.text.ParseException;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/**
* @author xuxueli 2019-05-21
*/
public class JobScheduleHelper { public class JobScheduleHelper {
private static Logger logger = LoggerFactory.getLogger(JobScheduleHelper.class); private static Logger logger = LoggerFactory.getLogger(JobScheduleHelper.class);
...@@ -85,7 +87,15 @@ public class JobScheduleHelper { ...@@ -85,7 +87,15 @@ public class JobScheduleHelper {
// 2.1、trigger-expire > 5s:pass && make next-trigger-time // 2.1、trigger-expire > 5s:pass && make next-trigger-time
logger.warn(">>>>>>>>>>> xxl-job, schedule misfire, jobId = " + jobInfo.getId()); logger.warn(">>>>>>>>>>> xxl-job, schedule misfire, jobId = " + jobInfo.getId());
// fresh next // 1、misfire match
MisfireStrategyEnum misfireStrategyEnum = MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), MisfireStrategyEnum.DO_NOTHING);
if (MisfireStrategyEnum.FIRE_ONCE_NOW == misfireStrategyEnum) {
// FIRE_ONCE_NOW 》 trigger
JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.MISFIRE, -1, null, null, null);
logger.debug(">>>>>>>>>>> xxl-job, schedule push trigger : jobId = " + jobInfo.getId() );
}
// 2、fresh next
refreshNextValidTime(jobInfo, new Date()); refreshNextValidTime(jobInfo, new Date());
} else if (nowTime > jobInfo.getTriggerNextTime()) { } else if (nowTime > jobInfo.getTriggerNextTime()) {
...@@ -212,17 +222,17 @@ public class JobScheduleHelper { ...@@ -212,17 +222,17 @@ public class JobScheduleHelper {
@Override @Override
public void run() { public void run() {
// align second
try {
TimeUnit.MILLISECONDS.sleep(1000 - System.currentTimeMillis()%1000 );
} catch (InterruptedException e) {
if (!ringThreadToStop) {
logger.error(e.getMessage(), e);
}
}
while (!ringThreadToStop) { while (!ringThreadToStop) {
// align second
try {
TimeUnit.MILLISECONDS.sleep(1000 - System.currentTimeMillis() % 1000);
} catch (InterruptedException e) {
if (!ringThreadToStop) {
logger.error(e.getMessage(), e);
}
}
try { try {
// second data // second data
List<Integer> ringItemData = new ArrayList<>(); List<Integer> ringItemData = new ArrayList<>();
...@@ -250,15 +260,6 @@ public class JobScheduleHelper { ...@@ -250,15 +260,6 @@ public class JobScheduleHelper {
logger.error(">>>>>>>>>>> xxl-job, JobScheduleHelper#ringThread error:{}", e); logger.error(">>>>>>>>>>> xxl-job, JobScheduleHelper#ringThread error:{}", e);
} }
} }
// next second, align second
try {
TimeUnit.MILLISECONDS.sleep(1000 - System.currentTimeMillis()%1000);
} catch (InterruptedException e) {
if (!ringThreadToStop) {
logger.error(e.getMessage(), e);
}
}
} }
logger.info(">>>>>>>>>>> xxl-job, JobScheduleHelper#ringThread stop"); logger.info(">>>>>>>>>>> xxl-job, JobScheduleHelper#ringThread stop");
} }
...@@ -268,8 +269,8 @@ public class JobScheduleHelper { ...@@ -268,8 +269,8 @@ public class JobScheduleHelper {
ringThread.start(); ringThread.start();
} }
private void refreshNextValidTime(XxlJobInfo jobInfo, Date fromTime) throws ParseException { private void refreshNextValidTime(XxlJobInfo jobInfo, Date fromTime) throws Exception {
Date nextValidTime = new CronExpression(jobInfo.getJobCron()).getNextValidTimeAfter(fromTime); Date nextValidTime = generateNextValidTime(jobInfo, fromTime);
if (nextValidTime != null) { if (nextValidTime != null) {
jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime()); jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());
jobInfo.setTriggerNextTime(nextValidTime.getTime()); jobInfo.setTriggerNextTime(nextValidTime.getTime());
...@@ -277,6 +278,8 @@ public class JobScheduleHelper { ...@@ -277,6 +278,8 @@ public class JobScheduleHelper {
jobInfo.setTriggerStatus(0); jobInfo.setTriggerStatus(0);
jobInfo.setTriggerLastTime(0); jobInfo.setTriggerLastTime(0);
jobInfo.setTriggerNextTime(0); jobInfo.setTriggerNextTime(0);
logger.warn(">>>>>>>>>>> xxl-job, refreshNextValidTime fail for job: jobId={}, scheduleType={}, scheduleConf={}",
jobInfo.getId(), jobInfo.getScheduleType(), jobInfo.getScheduleConf());
} }
} }
...@@ -350,4 +353,17 @@ public class JobScheduleHelper { ...@@ -350,4 +353,17 @@ public class JobScheduleHelper {
logger.info(">>>>>>>>>>> xxl-job, JobScheduleHelper stop"); logger.info(">>>>>>>>>>> xxl-job, JobScheduleHelper stop");
} }
// ---------------------- tools ----------------------
public static Date generateNextValidTime(XxlJobInfo jobInfo, Date fromTime) throws Exception {
ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), null);
if (ScheduleTypeEnum.CRON == scheduleTypeEnum) {
Date nextValidTime = new CronExpression(jobInfo.getScheduleConf()).getNextValidTimeAfter(fromTime);
return nextValidTime;
} else if (ScheduleTypeEnum.FIX_RATE == scheduleTypeEnum /*|| ScheduleTypeEnum.FIX_DELAY == scheduleTypeEnum*/) {
return new Date(fromTime.getTime() + Integer.valueOf(jobInfo.getScheduleConf())*1000 );
}
return null;
}
} }
package com.liquidnet.client.job.core.thread; package com.liquidnet.client.job.admin.core.thread;
import com.liquidnet.client.job.core.conf.XxlJobAdminConfig; import com.liquidnet.client.job.admin.core.conf.XxlJobAdminConfig;
import com.liquidnet.client.job.core.trigger.TriggerTypeEnum; import com.liquidnet.client.job.admin.core.trigger.TriggerTypeEnum;
import com.liquidnet.client.job.core.trigger.XxlJobTrigger; import com.liquidnet.client.job.admin.core.trigger.XxlJobTrigger;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -12,6 +12,7 @@ import java.util.concurrent.atomic.AtomicInteger; ...@@ -12,6 +12,7 @@ import java.util.concurrent.atomic.AtomicInteger;
/** /**
* job trigger thread pool helper * job trigger thread pool helper
* *
* @author xuxueli 2018-07-03 21:08:07
*/ */
public class JobTriggerPoolHelper { public class JobTriggerPoolHelper {
private static Logger logger = LoggerFactory.getLogger(JobTriggerPoolHelper.class); private static Logger logger = LoggerFactory.getLogger(JobTriggerPoolHelper.class);
......
package com.liquidnet.client.job.core.trigger; package com.liquidnet.client.job.admin.core.trigger;
import com.liquidnet.client.job.admin.core.util.I18nUtil;
import com.liquidnet.client.job.core.util.I18nUtil;
/** /**
* trigger type enum * trigger type enum
*
* @author xuxueli 2018-09-16 04:56:41
*/ */
public enum TriggerTypeEnum { public enum TriggerTypeEnum {
...@@ -12,7 +13,8 @@ public enum TriggerTypeEnum { ...@@ -12,7 +13,8 @@ public enum TriggerTypeEnum {
CRON(I18nUtil.getString("jobconf_trigger_type_cron")), CRON(I18nUtil.getString("jobconf_trigger_type_cron")),
RETRY(I18nUtil.getString("jobconf_trigger_type_retry")), RETRY(I18nUtil.getString("jobconf_trigger_type_retry")),
PARENT(I18nUtil.getString("jobconf_trigger_type_parent")), PARENT(I18nUtil.getString("jobconf_trigger_type_parent")),
API(I18nUtil.getString("jobconf_trigger_type_api")); API(I18nUtil.getString("jobconf_trigger_type_api")),
MISFIRE(I18nUtil.getString("jobconf_trigger_type_misfire"));
private TriggerTypeEnum(String title){ private TriggerTypeEnum(String title){
this.title = title; this.title = title;
......
package com.liquidnet.client.job.core.trigger; package com.liquidnet.client.job.admin.core.trigger;
import com.liquidnet.client.job.core.conf.XxlJobAdminConfig; import com.liquidnet.client.job.admin.core.conf.XxlJobAdminConfig;
import com.liquidnet.client.job.core.model.XxlJobGroup; import com.liquidnet.client.job.admin.core.model.XxlJobGroup;
import com.liquidnet.client.job.core.model.XxlJobInfo; import com.liquidnet.client.job.admin.core.model.XxlJobInfo;
import com.liquidnet.client.job.core.model.XxlJobLog; import com.liquidnet.client.job.admin.core.model.XxlJobLog;
import com.liquidnet.client.job.core.route.ExecutorRouteStrategyEnum; import com.liquidnet.client.job.admin.core.route.ExecutorRouteStrategyEnum;
import com.liquidnet.client.job.core.util.I18nUtil; import com.liquidnet.client.job.admin.core.scheduler.XxlJobScheduler;
import com.liquidnet.client.job.core.scheduler.XxlJobScheduler; import com.liquidnet.client.job.admin.core.util.I18nUtil;
import com.xxl.job.core.biz.ExecutorBiz; import com.xxl.job.core.biz.ExecutorBiz;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.biz.model.TriggerParam; import com.xxl.job.core.biz.model.TriggerParam;
...@@ -20,6 +20,7 @@ import java.util.Date; ...@@ -20,6 +20,7 @@ import java.util.Date;
/** /**
* xxl-job trigger * xxl-job trigger
* Created by xuxueli on 17/7/13.
*/ */
public class XxlJobTrigger { public class XxlJobTrigger {
private static Logger logger = LoggerFactory.getLogger(XxlJobTrigger.class); private static Logger logger = LoggerFactory.getLogger(XxlJobTrigger.class);
......
package com.liquidnet.client.job.core.util; package com.liquidnet.client.job.admin.core.util;
import javax.servlet.http.Cookie; import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
...@@ -6,6 +6,8 @@ import javax.servlet.http.HttpServletResponse; ...@@ -6,6 +6,8 @@ import javax.servlet.http.HttpServletResponse;
/** /**
* Cookie.Util * Cookie.Util
*
* @author xuxueli 2015-12-12 18:01:06
*/ */
public class CookieUtil { public class CookieUtil {
......
package com.liquidnet.client.job.core.util; package com.liquidnet.client.job.admin.core.util;
import freemarker.ext.beans.BeansWrapper; import freemarker.ext.beans.BeansWrapper;
import freemarker.ext.beans.BeansWrapperBuilder; import freemarker.ext.beans.BeansWrapperBuilder;
...@@ -9,6 +9,8 @@ import org.slf4j.LoggerFactory; ...@@ -9,6 +9,8 @@ import org.slf4j.LoggerFactory;
/** /**
* ftl util * ftl util
*
* @author xuxueli 2018-01-17 20:37:48
*/ */
public class FtlUtil { public class FtlUtil {
private static Logger logger = LoggerFactory.getLogger(FtlUtil.class); private static Logger logger = LoggerFactory.getLogger(FtlUtil.class);
......
package com.liquidnet.client.job.core.util; package com.liquidnet.client.job.admin.core.util;
import com.liquidnet.client.job.admin.core.conf.XxlJobAdminConfig;
import com.liquidnet.client.job.core.conf.XxlJobAdminConfig;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.ClassPathResource;
...@@ -17,6 +16,8 @@ import java.util.Properties; ...@@ -17,6 +16,8 @@ import java.util.Properties;
/** /**
* i18n util * i18n util
*
* @author xuxueli 2018-01-17 20:39:06
*/ */
public class I18nUtil { public class I18nUtil {
private static Logger logger = LoggerFactory.getLogger(I18nUtil.class); private static Logger logger = LoggerFactory.getLogger(I18nUtil.class);
......
package com.liquidnet.client.job.core.util; package com.liquidnet.client.job.admin.core.util;
import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParseException;
...@@ -15,7 +15,8 @@ import java.io.IOException; ...@@ -15,7 +15,8 @@ import java.io.IOException;
* *
* 1、obj need private and set/get; * 1、obj need private and set/get;
* 2、do not support inner class; * 2、do not support inner class;
* *
* @author xuxueli 2015-9-25 18:02:56
*/ */
public class JacksonUtil { public class JacksonUtil {
private static Logger logger = LoggerFactory.getLogger(JacksonUtil.class); private static Logger logger = LoggerFactory.getLogger(JacksonUtil.class);
......
package com.liquidnet.client.job.core.util; package com.liquidnet.client.job.admin.core.util;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
/** /**
* local cache tool * local cache tool
*
* @author xuxueli 2018-01-22 21:37:34
*/ */
public class LocalCacheUtil { public class LocalCacheUtil {
......
package com.liquidnet.client.job.dao; package com.liquidnet.client.job.admin.dao;
import com.liquidnet.client.job.core.model.XxlJobGroup; import com.liquidnet.client.job.admin.core.model.XxlJobGroup;
import org.apache.ibatis.annotations.Mapper; 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;
/**
* Created by xuxueli on 16/9/30.
*/
@Mapper @Mapper
public interface XxlJobGroupDao { public interface XxlJobGroupDao {
......
package com.liquidnet.client.job.dao; package com.liquidnet.client.job.admin.dao;
import com.liquidnet.client.job.core.model.XxlJobInfo; import com.liquidnet.client.job.admin.core.model.XxlJobInfo;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
...@@ -9,6 +9,7 @@ import java.util.List; ...@@ -9,6 +9,7 @@ import java.util.List;
/** /**
* job info * job info
* @author xuxueli 2016-1-12 18:03:45
*/ */
@Mapper @Mapper
public interface XxlJobInfoDao { public interface XxlJobInfoDao {
...@@ -21,26 +22,26 @@ public interface XxlJobInfoDao { ...@@ -21,26 +22,26 @@ public interface XxlJobInfoDao {
@Param("executorHandler") String executorHandler, @Param("executorHandler") String executorHandler,
@Param("author") String author); @Param("author") String author);
public int pageListCount(@Param("offset") int offset, public int pageListCount(@Param("offset") int offset,
@Param("pagesize") int pagesize, @Param("pagesize") int pagesize,
@Param("jobGroup") int jobGroup, @Param("jobGroup") int jobGroup,
@Param("triggerStatus") int triggerStatus, @Param("triggerStatus") int triggerStatus,
@Param("jobDesc") String jobDesc, @Param("jobDesc") String jobDesc,
@Param("executorHandler") String executorHandler, @Param("executorHandler") String executorHandler,
@Param("author") String author); @Param("author") String author);
public int save(XxlJobInfo info); public int save(XxlJobInfo info);
public XxlJobInfo loadById(@Param("id") int id); public XxlJobInfo loadById(@Param("id") int id);
public int update(XxlJobInfo xxlJobInfo); public int update(XxlJobInfo xxlJobInfo);
public int delete(@Param("id") long id); public int delete(@Param("id") long id);
public List<XxlJobInfo> getJobsByGroup(@Param("jobGroup") int jobGroup); public List<XxlJobInfo> getJobsByGroup(@Param("jobGroup") int jobGroup);
public int findAllCount(); public int findAllCount();
public List<XxlJobInfo> scheduleJobQuery(@Param("maxNextTime") long maxNextTime, @Param("pagesize") int pagesize ); public List<XxlJobInfo> scheduleJobQuery(@Param("maxNextTime") long maxNextTime, @Param("pagesize") int pagesize);
public int scheduleUpdate(XxlJobInfo xxlJobInfo); public int scheduleUpdate(XxlJobInfo xxlJobInfo);
......
package com.liquidnet.client.job.dao; package com.liquidnet.client.job.admin.dao;
import com.liquidnet.client.job.core.model.XxlJobLog; import com.liquidnet.client.job.admin.core.model.XxlJobLog;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
...@@ -24,13 +24,13 @@ public interface XxlJobLogDao { ...@@ -24,13 +24,13 @@ public interface XxlJobLogDao {
@Param("triggerTimeEnd") Date triggerTimeEnd, @Param("triggerTimeEnd") Date triggerTimeEnd,
@Param("logStatus") int logStatus); @Param("logStatus") int logStatus);
public int pageListCount(@Param("offset") int offset, public int pageListCount(@Param("offset") int offset,
@Param("pagesize") int pagesize, @Param("pagesize") int pagesize,
@Param("jobGroup") int jobGroup, @Param("jobGroup") int jobGroup,
@Param("jobId") int jobId, @Param("jobId") int jobId,
@Param("triggerTimeStart") Date triggerTimeStart, @Param("triggerTimeStart") Date triggerTimeStart,
@Param("triggerTimeEnd") Date triggerTimeEnd, @Param("triggerTimeEnd") Date triggerTimeEnd,
@Param("logStatus") int logStatus); @Param("logStatus") int logStatus);
public XxlJobLog load(@Param("id") long id); public XxlJobLog load(@Param("id") long id);
public long save(XxlJobLog xxlJobLog); public long save(XxlJobLog xxlJobLog);
...@@ -38,24 +38,24 @@ public interface XxlJobLogDao { ...@@ -38,24 +38,24 @@ public interface XxlJobLogDao {
public int updateTriggerInfo(XxlJobLog xxlJobLog); public int updateTriggerInfo(XxlJobLog xxlJobLog);
public int updateHandleInfo(XxlJobLog xxlJobLog); public int updateHandleInfo(XxlJobLog xxlJobLog);
public int delete(@Param("jobId") int jobId); public int delete(@Param("jobId") int jobId);
public Map<String, Object> findLogReport(@Param("from") Date from, public Map<String, Object> findLogReport(@Param("from") Date from,
@Param("to") Date to); @Param("to") Date to);
public List<Long> findClearLogIds(@Param("jobGroup") int jobGroup, public List<Long> findClearLogIds(@Param("jobGroup") int jobGroup,
@Param("jobId") int jobId, @Param("jobId") int jobId,
@Param("clearBeforeTime") Date clearBeforeTime, @Param("clearBeforeTime") Date clearBeforeTime,
@Param("clearBeforeNum") int clearBeforeNum, @Param("clearBeforeNum") int clearBeforeNum,
@Param("pagesize") int pagesize); @Param("pagesize") int pagesize);
public int clearLog(@Param("logIds") List<Long> logIds); public int clearLog(@Param("logIds") List<Long> logIds);
public List<Long> findFailJobLogIds(@Param("pagesize") int pagesize); public List<Long> findFailJobLogIds(@Param("pagesize") int pagesize);
public int updateAlarmStatus(@Param("logId") long logId, public int updateAlarmStatus(@Param("logId") long logId,
@Param("oldAlarmStatus") int oldAlarmStatus, @Param("oldAlarmStatus") int oldAlarmStatus,
@Param("newAlarmStatus") int newAlarmStatus); @Param("newAlarmStatus") int newAlarmStatus);
public List<Long> findLostJobIds(@Param("losedTime") Date losedTime); public List<Long> findLostJobIds(@Param("losedTime") Date losedTime);
......
package com.liquidnet.client.job.dao; package com.liquidnet.client.job.admin.dao;
import com.liquidnet.client.job.core.model.XxlJobLogGlue;
import com.liquidnet.client.job.admin.core.model.XxlJobLogGlue;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
...@@ -7,6 +8,7 @@ import java.util.List; ...@@ -7,6 +8,7 @@ import java.util.List;
/** /**
* job log for glue * job log for glue
* @author xuxueli 2016-5-19 18:04:56
*/ */
@Mapper @Mapper
public interface XxlJobLogGlueDao { public interface XxlJobLogGlueDao {
......
package com.liquidnet.client.job.dao; package com.liquidnet.client.job.admin.dao;
import com.liquidnet.client.job.admin.core.model.XxlJobLogReport;
import com.liquidnet.client.job.core.model.XxlJobLogReport;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
...@@ -10,6 +9,7 @@ import java.util.List; ...@@ -10,6 +9,7 @@ import java.util.List;
/** /**
* job log * job log
* @author xuxueli 2019-11-22
*/ */
@Mapper @Mapper
public interface XxlJobLogReportDao { public interface XxlJobLogReportDao {
...@@ -19,7 +19,7 @@ public interface XxlJobLogReportDao { ...@@ -19,7 +19,7 @@ public interface XxlJobLogReportDao {
public int update(XxlJobLogReport xxlJobLogReport); public int update(XxlJobLogReport xxlJobLogReport);
public List<XxlJobLogReport> queryLogReport(@Param("triggerDayFrom") Date triggerDayFrom, public List<XxlJobLogReport> queryLogReport(@Param("triggerDayFrom") Date triggerDayFrom,
@Param("triggerDayTo") Date triggerDayTo); @Param("triggerDayTo") Date triggerDayTo);
public XxlJobLogReport queryLogReportTotal(); public XxlJobLogReport queryLogReportTotal();
......
package com.liquidnet.client.job.dao; package com.liquidnet.client.job.admin.dao;
import com.liquidnet.client.job.core.model.XxlJobRegistry; import com.liquidnet.client.job.admin.core.model.XxlJobRegistry;
import org.apache.ibatis.annotations.Mapper; 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;
import java.util.List; import java.util.List;
/**
* Created by xuxueli on 16/9/30.
*/
@Mapper @Mapper
public interface XxlJobRegistryDao { public interface XxlJobRegistryDao {
...@@ -30,7 +32,7 @@ public interface XxlJobRegistryDao { ...@@ -30,7 +32,7 @@ public interface XxlJobRegistryDao {
@Param("updateTime") Date updateTime); @Param("updateTime") Date updateTime);
public int registryDelete(@Param("registryGroup") String registryGroup, public int registryDelete(@Param("registryGroup") String registryGroup,
@Param("registryKey") String registryKey, @Param("registryKey") String registryKey,
@Param("registryValue") String registryValue); @Param("registryValue") String registryValue);
} }
package com.liquidnet.client.job.dao; package com.liquidnet.client.job.admin.dao;
import com.liquidnet.client.job.core.model.XxlJobUser; import com.liquidnet.client.job.admin.core.model.XxlJobUser;
import org.apache.ibatis.annotations.Mapper; 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;
/**
* @author xuxueli 2019-05-04 16:44:59
*/
@Mapper @Mapper
public interface XxlJobUserDao { public interface XxlJobUserDao {
...@@ -15,9 +17,9 @@ public interface XxlJobUserDao { ...@@ -15,9 +17,9 @@ public interface XxlJobUserDao {
@Param("username") String username, @Param("username") String username,
@Param("role") int role); @Param("role") int role);
public int pageListCount(@Param("offset") int offset, public int pageListCount(@Param("offset") int offset,
@Param("pagesize") int pagesize, @Param("pagesize") int pagesize,
@Param("username") String username, @Param("username") String username,
@Param("role") int role); @Param("role") int role);
public XxlJobUser loadByUserName(@Param("username") String username); public XxlJobUser loadByUserName(@Param("username") String username);
......
package com.liquidnet.client.job.service; package com.liquidnet.client.job.admin.service;
import com.liquidnet.client.job.admin.core.model.XxlJobUser;
import com.liquidnet.client.job.core.model.XxlJobUser; import com.liquidnet.client.job.admin.core.util.CookieUtil;
import com.liquidnet.client.job.core.util.CookieUtil; import com.liquidnet.client.job.admin.core.util.I18nUtil;
import com.liquidnet.client.job.core.util.I18nUtil; import com.liquidnet.client.job.admin.core.util.JacksonUtil;
import com.liquidnet.client.job.core.util.JacksonUtil; import com.liquidnet.client.job.admin.dao.XxlJobUserDao;
import com.liquidnet.client.job.dao.XxlJobUserDao;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.util.DigestUtils; import org.springframework.util.DigestUtils;
...@@ -15,7 +14,9 @@ import javax.servlet.http.HttpServletRequest; ...@@ -15,7 +14,9 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.math.BigInteger; import java.math.BigInteger;
/**
* @author xuxueli 2019-05-04 22:13:264
*/
@Configuration @Configuration
public class LoginService { public class LoginService {
......
package com.liquidnet.client.job.service; package com.liquidnet.client.job.admin.service;
import com.liquidnet.client.job.core.model.XxlJobInfo; import com.liquidnet.client.job.admin.core.model.XxlJobInfo;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import java.util.Date; import java.util.Date;
...@@ -9,6 +9,8 @@ import java.util.Map; ...@@ -9,6 +9,8 @@ import java.util.Map;
/** /**
* core job action for xxl-job * core job action for xxl-job
*
* @author xuxueli 2016-5-28 15:30:33
*/ */
public interface XxlJobService { public interface XxlJobService {
......
package com.liquidnet.client.job.admin.service.impl;
import com.liquidnet.client.job.admin.core.thread.JobCompleteHelper;
import com.liquidnet.client.job.admin.core.thread.JobRegistryHelper;
import com.xxl.job.core.biz.AdminBiz;
import com.xxl.job.core.biz.model.HandleCallbackParam;
import com.xxl.job.core.biz.model.RegistryParam;
import com.xxl.job.core.biz.model.ReturnT;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author xuxueli 2017-07-27 21:54:20
*/
@Service
public class AdminBizImpl implements AdminBiz {
@Override
public ReturnT<String> callback(List<HandleCallbackParam> callbackParamList) {
return JobCompleteHelper.getInstance().callback(callbackParamList);
}
@Override
public ReturnT<String> registry(RegistryParam registryParam) {
return JobRegistryHelper.getInstance().registry(registryParam);
}
@Override
public ReturnT<String> registryRemove(RegistryParam registryParam) {
return JobRegistryHelper.getInstance().registryRemove(registryParam);
}
}
package com.liquidnet.client.job.service.impl;
import com.liquidnet.client.job.core.model.XxlJobInfo;
import com.liquidnet.client.job.core.model.XxlJobLog;
import com.liquidnet.client.job.core.thread.JobTriggerPoolHelper;
import com.liquidnet.client.job.core.trigger.TriggerTypeEnum;
import com.liquidnet.client.job.core.util.I18nUtil;
import com.liquidnet.client.job.dao.XxlJobGroupDao;
import com.liquidnet.client.job.dao.XxlJobInfoDao;
import com.liquidnet.client.job.dao.XxlJobLogDao;
import com.liquidnet.client.job.dao.XxlJobRegistryDao;
import com.xxl.job.core.biz.AdminBiz;
import com.xxl.job.core.biz.model.HandleCallbackParam;
import com.xxl.job.core.biz.model.RegistryParam;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.text.MessageFormat;
import java.util.Date;
import java.util.List;
/**
* @author xuxueli 2017-07-27 21:54:20
*/
@Service
public class AdminBizImpl implements AdminBiz {
private static Logger logger = LoggerFactory.getLogger(AdminBizImpl.class);
@Resource
public XxlJobLogDao xxlJobLogDao;
@Resource
private XxlJobInfoDao xxlJobInfoDao;
@Resource
private XxlJobRegistryDao xxlJobRegistryDao;
@Resource
private XxlJobGroupDao xxlJobGroupDao;
@Override
public ReturnT<String> callback(List<HandleCallbackParam> callbackParamList) {
for (HandleCallbackParam handleCallbackParam: callbackParamList) {
ReturnT<String> callbackResult = callback(handleCallbackParam);
logger.debug(">>>>>>>>> JobApiController.callback {}, handleCallbackParam={}, callbackResult={}",
(callbackResult.getCode()==IJobHandler.SUCCESS.getCode()?"success":"fail"), handleCallbackParam, callbackResult);
}
return ReturnT.SUCCESS;
}
private ReturnT<String> callback(HandleCallbackParam handleCallbackParam) {
// valid log item
XxlJobLog log = xxlJobLogDao.load(handleCallbackParam.getLogId());
if (log == null) {
return new ReturnT<String>(ReturnT.FAIL_CODE, "log item not found.");
}
if (log.getHandleCode() > 0) {
return new ReturnT<String>(ReturnT.FAIL_CODE, "log repeate callback."); // avoid repeat callback, trigger child job etc
}
// trigger success, to trigger child job
String callbackMsg = null;
if (IJobHandler.SUCCESS.getCode() == handleCallbackParam.getExecuteResult().getCode()) {
XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(log.getJobId());
if (xxlJobInfo!=null && xxlJobInfo.getChildJobId()!=null && xxlJobInfo.getChildJobId().trim().length()>0) {
callbackMsg = "<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_child_run") +"<<<<<<<<<<< </span><br>";
String[] childJobIds = xxlJobInfo.getChildJobId().split(",");
for (int i = 0; i < childJobIds.length; i++) {
int childJobId = (childJobIds[i]!=null && childJobIds[i].trim().length()>0 && isNumeric(childJobIds[i]))?Integer.valueOf(childJobIds[i]):-1;
if (childJobId > 0) {
JobTriggerPoolHelper.trigger(childJobId, TriggerTypeEnum.PARENT, -1, null, null, null);
ReturnT<String> triggerChildResult = ReturnT.SUCCESS;
// add msg
callbackMsg += MessageFormat.format(I18nUtil.getString("jobconf_callback_child_msg1"),
(i+1),
childJobIds.length,
childJobIds[i],
(triggerChildResult.getCode()==ReturnT.SUCCESS_CODE?I18nUtil.getString("system_success"):I18nUtil.getString("system_fail")),
triggerChildResult.getMsg());
} else {
callbackMsg += MessageFormat.format(I18nUtil.getString("jobconf_callback_child_msg2"),
(i+1),
childJobIds.length,
childJobIds[i]);
}
}
}
}
// handle msg
StringBuffer handleMsg = new StringBuffer();
if (log.getHandleMsg()!=null) {
handleMsg.append(log.getHandleMsg()).append("<br>");
}
if (handleCallbackParam.getExecuteResult().getMsg() != null) {
handleMsg.append(handleCallbackParam.getExecuteResult().getMsg());
}
if (callbackMsg != null) {
handleMsg.append(callbackMsg);
}
if (handleMsg.length() > 15000) {
handleMsg = new StringBuffer(handleMsg.substring(0, 15000)); // text最大64kb 避免长度过长
}
// success, save log
log.setHandleTime(new Date());
log.setHandleCode(handleCallbackParam.getExecuteResult().getCode());
log.setHandleMsg(handleMsg.toString());
xxlJobLogDao.updateHandleInfo(log);
return ReturnT.SUCCESS;
}
private boolean isNumeric(String str){
try {
int result = Integer.valueOf(str);
return true;
} catch (NumberFormatException e) {
return false;
}
}
@Override
public ReturnT<String> registry(RegistryParam registryParam) {
// valid
if (!StringUtils.hasText(registryParam.getRegistryGroup())
|| !StringUtils.hasText(registryParam.getRegistryKey())
|| !StringUtils.hasText(registryParam.getRegistryValue())) {
return new ReturnT<String>(ReturnT.FAIL_CODE, "Illegal Argument.");
}
int ret = xxlJobRegistryDao.registryUpdate(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date());
if (ret < 1) {
xxlJobRegistryDao.registrySave(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date());
// fresh
freshGroupRegistryInfo(registryParam);
}
return ReturnT.SUCCESS;
}
@Override
public ReturnT<String> registryRemove(RegistryParam registryParam) {
// valid
if (!StringUtils.hasText(registryParam.getRegistryGroup())
|| !StringUtils.hasText(registryParam.getRegistryKey())
|| !StringUtils.hasText(registryParam.getRegistryValue())) {
return new ReturnT<String>(ReturnT.FAIL_CODE, "Illegal Argument.");
}
int ret = xxlJobRegistryDao.registryDelete(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue());
if (ret > 0) {
// fresh
freshGroupRegistryInfo(registryParam);
}
return ReturnT.SUCCESS;
}
private void freshGroupRegistryInfo(RegistryParam registryParam){
// Under consideration, prevent affecting core tables
}
}
admin_name=Scheduling Center admin_name=Scheduling Center
admin_name_full=Distributed Task Scheduling Platform XXL-JOB admin_name_full=Distributed Task Scheduling Platform XXL-JOB
admin_version=2.2.0 admin_version=2.3.0
admin_i18n=en admin_i18n=en
## system ## system
...@@ -117,8 +117,6 @@ jobinfo_field_jobdesc=Job description ...@@ -117,8 +117,6 @@ jobinfo_field_jobdesc=Job description
jobinfo_field_timeout=Job timeout period jobinfo_field_timeout=Job timeout period
jobinfo_field_gluetype=GLUE Type jobinfo_field_gluetype=GLUE Type
jobinfo_field_executorparam=Param jobinfo_field_executorparam=Param
jobinfo_field_cron_unvalid=The Cron is illegal
jobinfo_field_cron_never_fire=The Cron will never fire
jobinfo_field_author=Author jobinfo_field_author=Author
jobinfo_field_alarmemail=Alarm email jobinfo_field_alarmemail=Alarm email
jobinfo_field_alarmemail_placeholder=Please enter alarm mail, if there are more than one comma separated jobinfo_field_alarmemail_placeholder=Please enter alarm mail, if there are more than one comma separated
...@@ -144,6 +142,19 @@ jobinfo_glue_rollback=Version Backtrack ...@@ -144,6 +142,19 @@ jobinfo_glue_rollback=Version Backtrack
jobinfo_glue_jobid_unvalid=Job ID is illegal jobinfo_glue_jobid_unvalid=Job ID is illegal
jobinfo_glue_gluetype_unvalid=The job is not GLUE Type jobinfo_glue_gluetype_unvalid=The job is not GLUE Type
jobinfo_field_executorTimeout_placeholder=Job Timeout period,in seconds. effect if greater than zero jobinfo_field_executorTimeout_placeholder=Job Timeout period,in seconds. effect if greater than zero
schedule_type=Schedule Type
schedule_type_none=None
schedule_type_cron=Cron
schedule_type_fix_rate=Fix rate
schedule_type_fix_delay=Fix delay
schedule_type_none_limit_start=The current schedule type disables startup
misfire_strategy=Misfire strategy
misfire_strategy_do_nothing=Do nothing
misfire_strategy_fire_once_now=Fire once now
jobinfo_conf_base=Base configuration
jobinfo_conf_schedule=Schedule configuration
jobinfo_conf_job=Job configuration
jobinfo_conf_advanced=Advanced configuration
## job log ## job log
joblog_name=Trigger Log joblog_name=Trigger Log
...@@ -243,6 +254,7 @@ jobconf_trigger_type_manual=Manual trigger ...@@ -243,6 +254,7 @@ jobconf_trigger_type_manual=Manual trigger
jobconf_trigger_type_parent=Parent job trigger jobconf_trigger_type_parent=Parent job trigger
jobconf_trigger_type_api=Api trigger jobconf_trigger_type_api=Api trigger
jobconf_trigger_type_retry=Fail retry trigger jobconf_trigger_type_retry=Fail retry trigger
jobconf_trigger_type_misfire=Misfire compensation trigger
## user ## user
user_manage=User Manage user_manage=User Manage
......
admin_name=任务调度中心 admin_name=任务调度中心
admin_name_full=分布式任务调度平台XXL-JOB admin_name_full=分布式任务调度平台XXL-JOB
admin_version=2.2.0 admin_version=2.3.0
admin_i18n= admin_i18n=
## system ## system
...@@ -116,8 +116,6 @@ jobinfo_field_jobgroup=执行器 ...@@ -116,8 +116,6 @@ jobinfo_field_jobgroup=执行器
jobinfo_field_jobdesc=任务描述 jobinfo_field_jobdesc=任务描述
jobinfo_field_gluetype=运行模式 jobinfo_field_gluetype=运行模式
jobinfo_field_executorparam=任务参数 jobinfo_field_executorparam=任务参数
jobinfo_field_cron_unvalid=Cron格式非法
jobinfo_field_cron_never_fire=Cron非法,永远不会触发
jobinfo_field_author=负责人 jobinfo_field_author=负责人
jobinfo_field_timeout=任务超时时间 jobinfo_field_timeout=任务超时时间
jobinfo_field_alarmemail=报警邮件 jobinfo_field_alarmemail=报警邮件
...@@ -144,6 +142,19 @@ jobinfo_glue_rollback=版本回溯 ...@@ -144,6 +142,19 @@ jobinfo_glue_rollback=版本回溯
jobinfo_glue_jobid_unvalid=任务ID非法 jobinfo_glue_jobid_unvalid=任务ID非法
jobinfo_glue_gluetype_unvalid=该任务非GLUE模式 jobinfo_glue_gluetype_unvalid=该任务非GLUE模式
jobinfo_field_executorTimeout_placeholder=任务超时时间,单位秒,大于零时生效 jobinfo_field_executorTimeout_placeholder=任务超时时间,单位秒,大于零时生效
schedule_type=调度类型
schedule_type_none=
schedule_type_cron=CRON
schedule_type_fix_rate=固定速度
schedule_type_fix_delay=固定延迟
schedule_type_none_limit_start=当前调度类型禁止启动
misfire_strategy=调度过期策略
misfire_strategy_do_nothing=忽略
misfire_strategy_fire_once_now=立即执行一次
jobinfo_conf_base=基础配置
jobinfo_conf_schedule=调度配置
jobinfo_conf_job=任务配置
jobinfo_conf_advanced=高级配置
## job log ## job log
joblog_name=调度日志 joblog_name=调度日志
...@@ -243,6 +254,7 @@ jobconf_trigger_type_manual=手动触发 ...@@ -243,6 +254,7 @@ jobconf_trigger_type_manual=手动触发
jobconf_trigger_type_parent=父任务触发 jobconf_trigger_type_parent=父任务触发
jobconf_trigger_type_api=API触发 jobconf_trigger_type_api=API触发
jobconf_trigger_type_retry=失败重试触发 jobconf_trigger_type_retry=失败重试触发
jobconf_trigger_type_misfire=调度过期补偿
## user ## user
user_manage=用户管理 user_manage=用户管理
......
admin_name=任務調度中心 admin_name=任務調度中心
admin_name_full=分布式任務調度平臺XXL-JOB admin_name_full=分布式任務調度平臺XXL-JOB
admin_version=2.2.0 admin_version=2.3.0
admin_i18n= admin_i18n=
## system ## system
...@@ -116,8 +116,6 @@ jobinfo_field_jobgroup=執行器 ...@@ -116,8 +116,6 @@ jobinfo_field_jobgroup=執行器
jobinfo_field_jobdesc=任務描述 jobinfo_field_jobdesc=任務描述
jobinfo_field_gluetype=運行模式 jobinfo_field_gluetype=運行模式
jobinfo_field_executorparam=任務參數 jobinfo_field_executorparam=任務參數
jobinfo_field_cron_unvalid=Cron 格式非法
jobinfo_field_cron_never_fire=Cron 格式非法,永遠不會觸發
jobinfo_field_author=負責人 jobinfo_field_author=負責人
jobinfo_field_timeout=任務超時秒數 jobinfo_field_timeout=任務超時秒數
jobinfo_field_alarmemail=告警郵件 jobinfo_field_alarmemail=告警郵件
...@@ -144,6 +142,19 @@ jobinfo_glue_rollback=版本回復 ...@@ -144,6 +142,19 @@ jobinfo_glue_rollback=版本回復
jobinfo_glue_jobid_unvalid=任務ID非法 jobinfo_glue_jobid_unvalid=任務ID非法
jobinfo_glue_gluetype_unvalid=該任務非GLUE模式 jobinfo_glue_gluetype_unvalid=該任務非GLUE模式
jobinfo_field_executorTimeout_placeholder=任務超時時間,單位秒,大於零時生效 jobinfo_field_executorTimeout_placeholder=任務超時時間,單位秒,大於零時生效
schedule_type=調度類型
schedule_type_none=
schedule_type_cron=CRON
schedule_type_fix_rate=固定速度
schedule_type_fix_delay=固定延遲
schedule_type_none_limit_start=當前調度類型禁止啟動
misfire_strategy=調度過期策略
misfire_strategy_do_nothing=忽略
misfire_strategy_fire_once_now=立即執行壹次
jobinfo_conf_base=基礎配置
jobinfo_conf_schedule=調度配置
jobinfo_conf_job=任務配置
jobinfo_conf_advanced=高級配置
## job log ## job log
joblog_name=調度日誌 joblog_name=調度日誌
...@@ -243,6 +254,7 @@ jobconf_trigger_type_manual=手動觸發 ...@@ -243,6 +254,7 @@ jobconf_trigger_type_manual=手動觸發
jobconf_trigger_type_parent=父任務觸發 jobconf_trigger_type_parent=父任務觸發
jobconf_trigger_type_api=API觸發 jobconf_trigger_type_api=API觸發
jobconf_trigger_type_retry=失敗重試觸發 jobconf_trigger_type_retry=失敗重試觸發
jobconf_trigger_type_misfire=調度過期補償
## user ## user
user_manage=用户管理 user_manage=用户管理
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liquidnet.client.job.dao.XxlJobGroupDao"> <mapper namespace="com.liquidnet.client.job.admin.dao.XxlJobGroupDao">
<resultMap id="XxlJobGroup" type="com.liquidnet.client.job.core.model.XxlJobGroup" > <resultMap id="XxlJobGroup" type="com.liquidnet.client.job.admin.core.model.XxlJobGroup" >
<result column="id" property="id" /> <result column="id" property="id" />
<result column="app_name" property="appname" /> <result column="app_name" property="appname" />
<result column="title" property="title" /> <result column="title" property="title" />
<result column="address_type" property="addressType" /> <result column="address_type" property="addressType" />
<result column="address_list" property="addressList" /> <result column="address_list" property="addressList" />
<result column="update_time" property="updateTime" />
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
...@@ -16,7 +17,8 @@ ...@@ -16,7 +17,8 @@
t.app_name, t.app_name,
t.title, t.title,
t.address_type, t.address_type,
t.address_list t.address_list,
t.update_time
</sql> </sql>
<select id="findAll" resultMap="XxlJobGroup"> <select id="findAll" resultMap="XxlJobGroup">
...@@ -32,17 +34,18 @@ ...@@ -32,17 +34,18 @@
ORDER BY t.app_name, t.title, t.id ASC ORDER BY t.app_name, t.title, t.id ASC
</select> </select>
<insert id="save" parameterType="com.liquidnet.client.job.core.model.XxlJobGroup" useGeneratedKeys="true" keyProperty="id" > <insert id="save" parameterType="com.liquidnet.client.job.admin.core.model.XxlJobGroup" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO xxl_job_group ( `app_name`, `title`, `address_type`, `address_list`) INSERT INTO xxl_job_group ( `app_name`, `title`, `address_type`, `address_list`, `update_time`)
values ( #{appname}, #{title}, #{addressType}, #{addressList}); values ( #{appname}, #{title}, #{addressType}, #{addressList}, #{updateTime} );
</insert> </insert>
<update id="update" parameterType="com.liquidnet.client.job.core.model.XxlJobGroup" > <update id="update" parameterType="com.liquidnet.client.job.admin.core.model.XxlJobGroup" >
UPDATE xxl_job_group UPDATE xxl_job_group
SET `app_name` = #{appname}, SET `app_name` = #{appname},
`title` = #{title}, `title` = #{title},
`address_type` = #{addressType}, `address_type` = #{addressType},
`address_list` = #{addressList} `address_list` = #{addressList},
`update_time` = #{updateTime}
WHERE id = #{id} WHERE id = #{id}
</update> </update>
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liquidnet.client.job.dao.XxlJobInfoDao"> <mapper namespace="com.liquidnet.client.job.admin.dao.XxlJobInfoDao">
<resultMap id="XxlJobInfo" type="com.liquidnet.client.job.core.model.XxlJobInfo" > <resultMap id="XxlJobInfo" type="com.liquidnet.client.job.admin.core.model.XxlJobInfo" >
<result column="id" property="id" /> <result column="id" property="id" />
<result column="job_group" property="jobGroup" /> <result column="job_group" property="jobGroup" />
<result column="job_cron" property="jobCron" />
<result column="job_desc" property="jobDesc" /> <result column="job_desc" property="jobDesc" />
<result column="add_time" property="addTime" /> <result column="add_time" property="addTime" />
...@@ -16,6 +15,10 @@ ...@@ -16,6 +15,10 @@
<result column="author" property="author" /> <result column="author" property="author" />
<result column="alarm_email" property="alarmEmail" /> <result column="alarm_email" property="alarmEmail" />
<result column="schedule_type" property="scheduleType" />
<result column="schedule_conf" property="scheduleConf" />
<result column="misfire_strategy" property="misfireStrategy" />
<result column="executor_route_strategy" property="executorRouteStrategy" /> <result column="executor_route_strategy" property="executorRouteStrategy" />
<result column="executor_handler" property="executorHandler" /> <result column="executor_handler" property="executorHandler" />
<result column="executor_param" property="executorParam" /> <result column="executor_param" property="executorParam" />
...@@ -38,12 +41,14 @@ ...@@ -38,12 +41,14 @@
<sql id="Base_Column_List"> <sql id="Base_Column_List">
t.id, t.id,
t.job_group, t.job_group,
t.job_cron,
t.job_desc, t.job_desc,
t.add_time, t.add_time,
t.update_time, t.update_time,
t.author, t.author,
t.alarm_email, t.alarm_email,
t.schedule_type,
t.schedule_conf,
t.misfire_strategy,
t.executor_route_strategy, t.executor_route_strategy,
t.executor_handler, t.executor_handler,
t.executor_param, t.executor_param,
...@@ -106,15 +111,17 @@ ...@@ -106,15 +111,17 @@
</trim> </trim>
</select> </select>
<insert id="save" parameterType="com.liquidnet.client.job.core.model.XxlJobInfo" useGeneratedKeys="true" keyProperty="id" > <insert id="save" parameterType="com.liquidnet.client.job.admin.core.model.XxlJobInfo" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO xxl_job_info ( INSERT INTO xxl_job_info (
job_group, job_group,
job_cron,
job_desc, job_desc,
add_time, add_time,
update_time, update_time,
author, author,
alarm_email, alarm_email,
schedule_type,
schedule_conf,
misfire_strategy,
executor_route_strategy, executor_route_strategy,
executor_handler, executor_handler,
executor_param, executor_param,
...@@ -131,12 +138,14 @@ ...@@ -131,12 +138,14 @@
trigger_next_time trigger_next_time
) VALUES ( ) VALUES (
#{jobGroup}, #{jobGroup},
#{jobCron},
#{jobDesc}, #{jobDesc},
#{addTime}, #{addTime},
#{updateTime}, #{updateTime},
#{author}, #{author},
#{alarmEmail}, #{alarmEmail},
#{scheduleType},
#{scheduleConf},
#{misfireStrategy},
#{executorRouteStrategy}, #{executorRouteStrategy},
#{executorHandler}, #{executorHandler},
#{executorParam}, #{executorParam},
...@@ -164,15 +173,17 @@ ...@@ -164,15 +173,17 @@
WHERE t.id = #{id} WHERE t.id = #{id}
</select> </select>
<update id="update" parameterType="com.liquidnet.client.job.core.model.XxlJobInfo" > <update id="update" parameterType="com.liquidnet.client.job.admin.core.model.XxlJobInfo" >
UPDATE xxl_job_info UPDATE xxl_job_info
SET SET
job_group = #{jobGroup}, job_group = #{jobGroup},
job_cron = #{jobCron},
job_desc = #{jobDesc}, job_desc = #{jobDesc},
update_time = #{updateTime}, update_time = #{updateTime},
author = #{author}, author = #{author},
alarm_email = #{alarmEmail}, alarm_email = #{alarmEmail},
schedule_type = #{scheduleType},
schedule_conf = #{scheduleConf},
misfire_strategy = #{misfireStrategy},
executor_route_strategy = #{executorRouteStrategy}, executor_route_strategy = #{executorRouteStrategy},
executor_handler = #{executorHandler}, executor_handler = #{executorHandler},
executor_param = #{executorParam}, executor_param = #{executorParam},
...@@ -217,7 +228,7 @@ ...@@ -217,7 +228,7 @@
LIMIT #{pagesize} LIMIT #{pagesize}
</select> </select>
<update id="scheduleUpdate" parameterType="com.liquidnet.client.job.core.model.XxlJobInfo" > <update id="scheduleUpdate" parameterType="com.liquidnet.client.job.admin.core.model.XxlJobInfo" >
UPDATE xxl_job_info UPDATE xxl_job_info
SET SET
trigger_last_time = #{triggerLastTime}, trigger_last_time = #{triggerLastTime},
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liquidnet.client.job.dao.XxlJobLogGlueDao"> <mapper namespace="com.liquidnet.client.job.admin.dao.XxlJobLogGlueDao">
<resultMap id="XxlJobLogGlue" type="com.liquidnet.client.job.core.model.XxlJobLogGlue" > <resultMap id="XxlJobLogGlue" type="com.liquidnet.client.job.admin.core.model.XxlJobLogGlue" >
<result column="id" property="id" /> <result column="id" property="id" />
<result column="job_id" property="jobId" /> <result column="job_id" property="jobId" />
<result column="glue_type" property="glueType" /> <result column="glue_type" property="glueType" />
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
t.update_time t.update_time
</sql> </sql>
<insert id="save" parameterType="com.liquidnet.client.job.core.model.XxlJobLogGlue" useGeneratedKeys="true" keyProperty="id" > <insert id="save" parameterType="com.liquidnet.client.job.admin.core.model.XxlJobLogGlue" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO xxl_job_logglue ( INSERT INTO xxl_job_logglue (
`job_id`, `job_id`,
`glue_type`, `glue_type`,
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liquidnet.client.job.dao.XxlJobLogDao"> <mapper namespace="com.liquidnet.client.job.admin.dao.XxlJobLogDao">
<resultMap id="XxlJobLog" type="com.liquidnet.client.job.core.model.XxlJobLog" > <resultMap id="XxlJobLog" type="com.liquidnet.client.job.admin.core.model.XxlJobLog" >
<result column="id" property="id" /> <result column="id" property="id" />
<result column="job_group" property="jobGroup" /> <result column="job_group" property="jobGroup" />
...@@ -117,7 +117,7 @@ ...@@ -117,7 +117,7 @@
</select> </select>
<insert id="save" parameterType="com.liquidnet.client.job.core.model.XxlJobLog" useGeneratedKeys="true" keyProperty="id" > <insert id="save" parameterType="com.liquidnet.client.job.admin.core.model.XxlJobLog" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO xxl_job_log ( INSERT INTO xxl_job_log (
`job_group`, `job_group`,
`job_id`, `job_id`,
...@@ -247,15 +247,27 @@ ...@@ -247,15 +247,27 @@
</update> </update>
<select id="findLostJobIds" resultType="long" > <select id="findLostJobIds" resultType="long" >
SELECT t.id SELECT
FROM xxl_job_log AS t t.id
WHERE t.trigger_code = 200 FROM
and t.handle_code = 0 xxl_job_log t
and t.trigger_time <![CDATA[ <= ]]> #{losedTime} LEFT JOIN xxl_job_registry t2 ON t.executor_address = t2.registry_value
and t.executor_address not in ( WHERE
SELECT t2.registry_value t.trigger_code = 200
FROM xxl_job_registry AS t2 AND t.handle_code = 0
) AND t.trigger_time <![CDATA[ <= ]]> #{losedTime}
AND t2.id IS NULL;
</select> </select>
<!--
SELECT t.id
FROM xxl_job_log AS t
WHERE t.trigger_code = 200
and t.handle_code = 0
and t.trigger_time <![CDATA[ <= ]]> #{losedTime}
and t.executor_address not in (
SELECT t2.registry_value
FROM xxl_job_registry AS t2
)
-->
</mapper> </mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liquidnet.client.job.dao.XxlJobLogReportDao"> <mapper namespace="com.liquidnet.client.job.admin.dao.XxlJobLogReportDao">
<resultMap id="XxlJobLogReport" type="com.liquidnet.client.job.core.model.XxlJobLogReport" > <resultMap id="XxlJobLogReport" type="com.liquidnet.client.job.admin.core.model.XxlJobLogReport" >
<result column="id" property="id" /> <result column="id" property="id" />
<result column="trigger_day" property="triggerDay" /> <result column="trigger_day" property="triggerDay" />
<result column="running_count" property="runningCount" /> <result column="running_count" property="runningCount" />
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
t.fail_count t.fail_count
</sql> </sql>
<insert id="save" parameterType="com.liquidnet.client.job.core.model.XxlJobLogReport" useGeneratedKeys="true" keyProperty="id" > <insert id="save" parameterType="com.liquidnet.client.job.admin.core.model.XxlJobLogReport" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO xxl_job_log_report ( INSERT INTO xxl_job_log_report (
`trigger_day`, `trigger_day`,
`running_count`, `running_count`,
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liquidnet.client.job.dao.XxlJobRegistryDao"> <mapper namespace="com.liquidnet.client.job.admin.dao.XxlJobRegistryDao">
<resultMap id="XxlJobRegistry" type="com.liquidnet.client.job.core.model.XxlJobRegistry" > <resultMap id="XxlJobRegistry" type="com.liquidnet.client.job.admin.core.model.XxlJobRegistry" >
<result column="id" property="id" /> <result column="id" property="id" />
<result column="registry_group" property="registryGroup" /> <result column="registry_group" property="registryGroup" />
<result column="registry_key" property="registryKey" /> <result column="registry_key" property="registryKey" />
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liquidnet.client.job.dao.XxlJobUserDao"> <mapper namespace="com.liquidnet.client.job.admin.dao.XxlJobUserDao">
<resultMap id="XxlJobUser" type="com.liquidnet.client.job.core.model.XxlJobUser" > <resultMap id="XxlJobUser" type="com.liquidnet.client.job.admin.core.model.XxlJobUser" >
<result column="id" property="id" /> <result column="id" property="id" />
<result column="username" property="username" /> <result column="username" property="username" />
<result column="password" property="password" /> <result column="password" property="password" />
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
WHERE t.username = #{username} WHERE t.username = #{username}
</select> </select>
<insert id="save" parameterType="com.liquidnet.client.job.core.model.XxlJobUser" useGeneratedKeys="true" keyProperty="id" > <insert id="save" parameterType="com.liquidnet.client.job.admin.core.model.XxlJobUser" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO xxl_job_user ( INSERT INTO xxl_job_user (
username, username,
password, password,
...@@ -67,7 +67,7 @@ ...@@ -67,7 +67,7 @@
); );
</insert> </insert>
<update id="update" parameterType="com.liquidnet.client.job.core.model.XxlJobUser" > <update id="update" parameterType="com.liquidnet.client.job.admin.core.model.XxlJobUser" >
UPDATE xxl_job_user UPDATE xxl_job_user
SET SET
<if test="password != null and password != ''"> <if test="password != null and password != ''">
......
/**
* Created by xuxueli on 17/4/24.
*/
$(function () { $(function () {
// filter Time // filter Time
......
...@@ -116,7 +116,7 @@ $(function() { ...@@ -116,7 +116,7 @@ $(function() {
"data": 'triggerTime', "data": 'triggerTime',
"width":'20%', "width":'20%',
"render": function ( data, type, row ) { "render": function ( data, type, row ) {
return data?moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss"):""; return data?moment(data).format("YYYY-MM-DD HH:mm:ss"):"";
} }
}, },
{ {
...@@ -145,7 +145,7 @@ $(function() { ...@@ -145,7 +145,7 @@ $(function() {
"data": 'handleTime', "data": 'handleTime',
"width":'20%', "width":'20%',
"render": function ( data, type, row ) { "render": function ( data, type, row ) {
return data?moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss"):""; return data?moment(data).format("YYYY-MM-DD HH:mm:ss"):"";
} }
}, },
{ {
...@@ -187,6 +187,12 @@ $(function() { ...@@ -187,6 +187,12 @@ $(function() {
}*/ }*/
//return temp; //return temp;
var logKillDiv = '';
if(row.handleCode == 0){
logKillDiv = ' <li class="divider"></li>\n' +
' <li><a href="javascript:void(0);" class="logKill" _id="'+ row.id +'" >'+ I18n.joblog_kill_log +'</a></li>\n';
}
var html = '<div class="btn-group">\n' + var html = '<div class="btn-group">\n' +
' <button type="button" class="btn btn-primary btn-sm">'+ I18n.system_opt +'</button>\n' + ' <button type="button" class="btn btn-primary btn-sm">'+ I18n.system_opt +'</button>\n' +
' <button type="button" class="btn btn-primary btn-sm dropdown-toggle" data-toggle="dropdown">\n' + ' <button type="button" class="btn btn-primary btn-sm dropdown-toggle" data-toggle="dropdown">\n' +
...@@ -195,8 +201,7 @@ $(function() { ...@@ -195,8 +201,7 @@ $(function() {
' </button>\n' + ' </button>\n' +
' <ul class="dropdown-menu" role="menu" _id="'+ row.id +'" >\n' + ' <ul class="dropdown-menu" role="menu" _id="'+ row.id +'" >\n' +
' <li><a href="javascript:void(0);" class="logDetail" _id="'+ row.id +'" >'+ I18n.joblog_rolling_log +'</a></li>\n' + ' <li><a href="javascript:void(0);" class="logDetail" _id="'+ row.id +'" >'+ I18n.joblog_rolling_log +'</a></li>\n' +
' <li class="divider"></li>\n' + logKillDiv +
' <li><a href="javascript:void(0);" class="logKill" _id="'+ row.id +'" >'+ I18n.joblog_kill_log +'</a></li>\n' +
' </ul>\n' + ' </ul>\n' +
' </div>'; ' </div>';
......
...@@ -50,7 +50,7 @@ $(function(){ ...@@ -50,7 +50,7 @@ $(function(){
if (data.code == "200") { if (data.code == "200") {
layer.msg( I18n.login_success ); layer.msg( I18n.login_success );
setTimeout(function(){ setTimeout(function(){
window.location.href = base_url; window.location.href = base_url + "/";
}, 500); }, 500);
} else { } else {
layer.open({ layer.open({
......
...@@ -33,7 +33,7 @@ $(function() { ...@@ -33,7 +33,7 @@ $(function() {
}, },
{ {
"data": 'password', "data": 'password',
"visible" : true, "visible" : false,
"width":'20%', "width":'20%',
"render": function ( data, type, row ) { "render": function ( data, type, row ) {
return '*********'; return '*********';
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
options = $.extend({}, $.fn.cronGen.defaultOptions, options); options = $.extend({}, $.fn.cronGen.defaultOptions, options);
//create top menu //create top menu
var cronContainer = $("<div/>", { id: "CronContainer", style: "display:none;width:300px;height:300px;" }); var cronContainer = $("<div/>", { id: "CronContainer", style: "display:none;width:300px;height:300px;" });
var mainDiv = $("<div/>", { id: "CronGenMainDiv", style: "width:410px;height:300px;" }); var mainDiv = $("<div/>", { id: "CronGenMainDiv", style: "width:410px;height:420px;" });
var topMenu = $("<ul/>", { "class": "nav nav-tabs", id: "CronGenTabs" }); var topMenu = $("<ul/>", { "class": "nav nav-tabs", id: "CronGenTabs" });
$('<li/>', { 'class': 'active' }).html($('<a id="SecondlyTab" href="#Secondly">秒</a>')).appendTo(topMenu); $('<li/>', { 'class': 'active' }).html($('<a id="SecondlyTab" href="#Secondly">秒</a>')).appendTo(topMenu);
$('<li/>').html($('<a id="MinutesTab" href="#Minutes">分钟</a>')).appendTo(topMenu); $('<li/>').html($('<a id="MinutesTab" href="#Minutes">分钟</a>')).appendTo(topMenu);
...@@ -318,9 +318,12 @@ ...@@ -318,9 +318,12 @@
// resultsName = $(this).prop("id"); // resultsName = $(this).prop("id");
// $(this).prop("name", resultsName); // $(this).prop("name", resultsName);
var runTime = '<br style="padding-top: 10px"><label>最近运行时间: </label></br><textarea id="runTime" rows="6" style="width: 90%;resize: none;background: none;border: none;outline: none;" readonly = readonly></textarea></div>';
$(span12).appendTo(row); $(span12).appendTo(row);
$(row).appendTo(container); $(row).appendTo(container);
$(container).appendTo(mainDiv); $(container).appendTo(mainDiv);
$(runTime).appendTo(mainDiv);
$(cronContainer).append(mainDiv); $(cronContainer).append(mainDiv);
var that = $(this); var that = $(this);
...@@ -351,9 +354,13 @@ ...@@ -351,9 +354,13 @@
return $(cronContainer).html(); return $(cronContainer).html();
}, },
template: '<div class="popover" style="max-width:500px !important; width:425px;left:-341.656px;"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>', template: '<div class="popover" style="max-width:500px !important; width:425px;left:-341.656px;"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>',
sanitize:false,
placement: options.direction placement: options.direction
}).on('click', function (e) { }).on('click', function (e) {
if (inputElement.val().trim() !== '') {
refreshRunTime();
}
e.preventDefault(); e.preventDefault();
//fillDataOfMinutesAndHoursSelectOptions(); //fillDataOfMinutesAndHoursSelectOptions();
...@@ -374,6 +381,7 @@ ...@@ -374,6 +381,7 @@
}); });
$("#CronGenMainDiv select,input").change(function (e) { $("#CronGenMainDiv select,input").change(function (e) {
generate(); generate();
refreshRunTime();
}); });
$("#CronGenMainDiv input").focus(function (e) { $("#CronGenMainDiv input").focus(function (e) {
generate(); generate();
...@@ -628,6 +636,25 @@ ...@@ -628,6 +636,25 @@
displayElement.val(results); displayElement.val(results);
}; };
var refreshRunTime = function () {
$.ajax({
type : 'GET',
url : base_url + "/jobinfo/nextTriggerTime",
data : {
"scheduleType" : 'CRON',
"scheduleConf" : inputElement.val()
},
dataType : "json",
success : function(data){
if (data.code === 200) {
$('#runTime').val(data.content.join("\n"));
} else {
$('#runTime').val(data.msg);
}
}
});
};
})(jQuery); })(jQuery);
(function($) { (function($) {
...@@ -1011,12 +1038,12 @@ ...@@ -1011,12 +1038,12 @@
//获取参数中表达式的值 //获取参数中表达式的值
if (cronExpress) { if (cronExpress) {
var regs = cronExpress.split(' '); var regs = cronExpress.split(' ');
$("input[name=secondHidden]").val(regs[0]); $("#secondHidden").val(regs[0]);
$("input[name=minHidden]").val(regs[1]); $("#minHidden").val(regs[1]);
$("input[name=hourHidden]").val(regs[2]); $("#hourHidden").val(regs[2]);
$("input[name=dayHidden]").val(regs[3]); $("#dayHidden").val(regs[3]);
$("input[name=monthHidden]").val(regs[4]); $("#monthHidden").val(regs[4]);
$("input[name=weekHidden]").val(regs[5]); $("#weekHidden").val(regs[5]);
$.fn.cronGen.tools.initObj(regs[0], "second"); $.fn.cronGen.tools.initObj(regs[0], "second");
$.fn.cronGen.tools.initObj(regs[1], "min"); $.fn.cronGen.tools.initObj(regs[1], "min");
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
options = $.extend({}, $.fn.cronGen.defaultOptions, options); options = $.extend({}, $.fn.cronGen.defaultOptions, options);
//create top menu //create top menu
var cronContainer = $("<div/>", { id: "CronContainer", style: "display:none;width:300px;height:300px;" }); var cronContainer = $("<div/>", { id: "CronContainer", style: "display:none;width:300px;height:300px;" });
var mainDiv = $("<div/>", { id: "CronGenMainDiv", style: "width:410px;height:300px;" }); var mainDiv = $("<div/>", { id: "CronGenMainDiv", style: "width:410px;height:420px;" });
var topMenu = $("<ul/>", { "class": "nav nav-tabs", id: "CronGenTabs" }); var topMenu = $("<ul/>", { "class": "nav nav-tabs", id: "CronGenTabs" });
$('<li/>', { 'class': 'active' }).html($('<a id="SecondlyTab" href="#Secondly">秒</a>')).appendTo(topMenu); $('<li/>', { 'class': 'active' }).html($('<a id="SecondlyTab" href="#Secondly">秒</a>')).appendTo(topMenu);
$('<li/>').html($('<a id="MinutesTab" href="#Minutes">Minute</a>')).appendTo(topMenu); $('<li/>').html($('<a id="MinutesTab" href="#Minutes">Minute</a>')).appendTo(topMenu);
...@@ -318,9 +318,12 @@ ...@@ -318,9 +318,12 @@
// resultsName = $(this).prop("id"); // resultsName = $(this).prop("id");
// $(this).prop("name", resultsName); // $(this).prop("name", resultsName);
var runTime = '<br style="padding-top: 10px"><label>Recent Run Time: </label></br><textarea id="runTime" rows="6" style="width: 90%;resize: none;background: none;border: none;outline: none;" readonly = readonly></textarea></div>';
$(span12).appendTo(row); $(span12).appendTo(row);
$(row).appendTo(container); $(row).appendTo(container);
$(container).appendTo(mainDiv); $(container).appendTo(mainDiv);
$(runTime).appendTo(mainDiv);
$(cronContainer).append(mainDiv); $(cronContainer).append(mainDiv);
var that = $(this); var that = $(this);
...@@ -351,9 +354,13 @@ ...@@ -351,9 +354,13 @@
return $(cronContainer).html(); return $(cronContainer).html();
}, },
template: '<div class="popover" style="max-width:500px !important; width:425px;left:-341.656px;"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>', template: '<div class="popover" style="max-width:500px !important; width:425px;left:-341.656px;"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>',
sanitize:false,
placement: options.direction placement: options.direction
}).on('click', function (e) { }).on('click', function (e) {
if (inputElement.val().trim() !== '') {
refreshRunTime();
}
e.preventDefault(); e.preventDefault();
//fillDataOfMinutesAndHoursSelectOptions(); //fillDataOfMinutesAndHoursSelectOptions();
...@@ -374,6 +381,7 @@ ...@@ -374,6 +381,7 @@
}); });
$("#CronGenMainDiv select,input").change(function (e) { $("#CronGenMainDiv select,input").change(function (e) {
generate(); generate();
refreshRunTime();
}); });
$("#CronGenMainDiv input").focus(function (e) { $("#CronGenMainDiv input").focus(function (e) {
generate(); generate();
...@@ -628,6 +636,25 @@ ...@@ -628,6 +636,25 @@
displayElement.val(results); displayElement.val(results);
}; };
var refreshRunTime = function () {
$.ajax({
type : 'GET',
url : base_url + "/jobinfo/nextTriggerTime",
data : {
"scheduleType" : 'CRON',
"scheduleConf" : inputElement.val()
},
dataType : "json",
success : function(data){
if (data.code === 200) {
$('#runTime').val(data.content.join("\n"));
} else {
$('#runTime').val(data.msg);
}
}
});
};
})(jQuery); })(jQuery);
(function($) { (function($) {
...@@ -1011,12 +1038,12 @@ ...@@ -1011,12 +1038,12 @@
//获取参数中表达式的值 //获取参数中表达式的值
if (cronExpress) { if (cronExpress) {
var regs = cronExpress.split(' '); var regs = cronExpress.split(' ');
$("input[name=secondHidden]").val(regs[0]); $("#secondHidden").val(regs[0]);
$("input[name=minHidden]").val(regs[1]); $("#minHidden").val(regs[1]);
$("input[name=hourHidden]").val(regs[2]); $("#hourHidden").val(regs[2]);
$("input[name=dayHidden]").val(regs[3]); $("#dayHidden").val(regs[3]);
$("input[name=monthHidden]").val(regs[4]); $("#monthHidden").val(regs[4]);
$("input[name=weekHidden]").val(regs[5]); $("#weekHidden").val(regs[5]);
$.fn.cronGen.tools.initObj(regs[0], "second"); $.fn.cronGen.tools.initObj(regs[0], "second");
$.fn.cronGen.tools.initObj(regs[1], "min"); $.fn.cronGen.tools.initObj(regs[1], "min");
......
...@@ -34,9 +34,9 @@ ...@@ -34,9 +34,9 @@
</#macro> </#macro>
<#macro commonScript> <#macro commonScript>
<!-- jQuery 2.1.4 --> <!-- jQuery -->
<script src="${request.contextPath}/static/adminlte/bower_components/jquery/jquery.min.js"></script> <script src="${request.contextPath}/static/adminlte/bower_components/jquery/jquery.min.js"></script>
<!-- Bootstrap 3.3.5 --> <!-- Bootstrap -->
<script src="${request.contextPath}/static/adminlte/bower_components/bootstrap/js/bootstrap.min.js"></script> <script src="${request.contextPath}/static/adminlte/bower_components/bootstrap/js/bootstrap.min.js"></script>
<!-- FastClick --> <!-- FastClick -->
<script src="${request.contextPath}/static/adminlte/bower_components/fastclick/fastclick.js"></script> <script src="${request.contextPath}/static/adminlte/bower_components/fastclick/fastclick.js"></script>
...@@ -141,7 +141,7 @@ ...@@ -141,7 +141,7 @@
<li class="nav-click <#if pageName == "jobgroup">active</#if>" ><a href="${request.contextPath}/jobgroup"><i class="fa fa-circle-o text-red"></i><span>${I18n.jobgroup_name}</span></a></li> <li class="nav-click <#if pageName == "jobgroup">active</#if>" ><a href="${request.contextPath}/jobgroup"><i class="fa fa-circle-o text-red"></i><span>${I18n.jobgroup_name}</span></a></li>
<li class="nav-click <#if pageName == "user">active</#if>" ><a href="${request.contextPath}/user"><i class="fa fa-circle-o text-purple"></i><span>${I18n.user_manage}</span></a></li> <li class="nav-click <#if pageName == "user">active</#if>" ><a href="${request.contextPath}/user"><i class="fa fa-circle-o text-purple"></i><span>${I18n.user_manage}</span></a></li>
</#if> </#if>
<#-- <li class="nav-click <#if pageName == "help">active</#if>" ><a href="${request.contextPath}/help"><i class="fa fa-circle-o text-gray"></i><span>${I18n.job_help}</span></a></li>--> <li class="nav-click <#if pageName == "help">active</#if>" ><a href="${request.contextPath}/help"><i class="fa fa-circle-o text-gray"></i><span>${I18n.job_help}</span></a></li>
</ul> </ul>
</section> </section>
<!-- /.sidebar --> <!-- /.sidebar -->
...@@ -227,12 +227,12 @@ ...@@ -227,12 +227,12 @@
<#macro commonFooter > <#macro commonFooter >
<footer class="main-footer"> <footer class="main-footer">
Powered by <i>XXL-JOB<i/> ${I18n.admin_version} Powered by <b>XXL-JOB</b> ${I18n.admin_version}
<div class="pull-right hidden-xs" hidden> <div class="pull-right hidden-xs">
<strong>Copyright &copy; 2015-${.now?string('yyyy')} &nbsp; <strong>Copyright &copy; 2015-${.now?string('yyyy')} &nbsp;
<a href="#" target="_blank" >xuxueli</a> <a href="https://www.xuxueli.com/" target="_blank" >xuxueli</a>
&nbsp; &nbsp;
<a href="#" target="_blank" >github</a> <a href="https://github.com/xuxueli/xxl-job" target="_blank" >github</a>
</strong><!-- All rights reserved. --> </strong><!-- All rights reserved. -->
</div> </div>
</footer> </footer>
......
...@@ -28,13 +28,13 @@ ...@@ -28,13 +28,13 @@
<div class="col-xs-3"> <div class="col-xs-3">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon">AppName</span> <span class="input-group-addon">AppName</span>
<input type="text" class="form-control" id="appname" autocomplete="on" placeholder="${I18n.system_please_input}AppName" > <input type="text" class="form-control" id="appname" placeholder="${I18n.system_please_input}AppName" >
</div> </div>
</div> </div>
<div class="col-xs-3"> <div class="col-xs-3">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon">${I18n.jobgroup_field_title}</span> <span class="input-group-addon">${I18n.jobgroup_field_title}</span>
<input type="text" class="form-control" id="title" autocomplete="on" placeholder="${I18n.jobgroup_field_title}" > <input type="text" class="form-control" id="title" placeholder="${I18n.jobgroup_field_title}" >
</div> </div>
</div> </div>
<div class="col-xs-2"> <div class="col-xs-2">
...@@ -98,7 +98,7 @@ ...@@ -98,7 +98,7 @@
<div class="form-group"> <div class="form-group">
<label for="lastname" class="col-sm-2 control-label">${I18n.jobgroup_field_registryList}<font color="red">*</font></label> <label for="lastname" class="col-sm-2 control-label">${I18n.jobgroup_field_registryList}<font color="red">*</font></label>
<div class="col-sm-10"> <div class="col-sm-10">
<textarea class="textarea" name="addressList" maxlength="512" placeholder="${I18n.jobgroup_field_registryList_placeholder}" readonly="readonly" style="background-color:#eee; width: 100%; height: 100px; font-size: 14px; line-height: 15px; border: 1px solid #dddddd; padding: 5px;"></textarea> <textarea class="textarea" name="addressList" maxlength="20000" placeholder="${I18n.jobgroup_field_registryList_placeholder}" readonly="readonly" style="background-color:#eee; width: 100%; height: 100px; font-size: 14px; line-height: 15px; border: 1px solid #dddddd; padding: 5px;"></textarea>
</div> </div>
</div> </div>
<hr> <hr>
...@@ -142,7 +142,7 @@ ...@@ -142,7 +142,7 @@
<div class="form-group"> <div class="form-group">
<label for="lastname" class="col-sm-2 control-label">${I18n.jobgroup_field_registryList}<font color="red">*</font></label> <label for="lastname" class="col-sm-2 control-label">${I18n.jobgroup_field_registryList}<font color="red">*</font></label>
<div class="col-sm-10"> <div class="col-sm-10">
<textarea class="textarea" name="addressList" maxlength="512" placeholder="${I18n.jobgroup_field_registryList_placeholder}" readonly="readonly" style="background-color:#eee; width: 100%; height: 100px; font-size: 14px; line-height: 15px; border: 1px solid #dddddd; padding: 5px;"></textarea> <textarea class="textarea" name="addressList" maxlength="20000" placeholder="${I18n.jobgroup_field_registryList_placeholder}" readonly="readonly" style="background-color:#eee; width: 100%; height: 100px; font-size: 14px; line-height: 15px; border: 1px solid #dddddd; padding: 5px;"></textarea>
</div> </div>
</div> </div>
<hr> <hr>
......
...@@ -48,7 +48,6 @@ ...@@ -48,7 +48,6 @@
<pre style="font-size:12px;position:relative;" > <pre style="font-size:12px;position:relative;" >
<div id="logConsole"></div> <div id="logConsole"></div>
<li class="fa fa-refresh fa-spin" style="font-size: 20px;float: left;" id="logConsoleRunning" ></li> <li class="fa fa-refresh fa-spin" style="font-size: 20px;float: left;" id="logConsoleRunning" ></li>
<div><hr><hr></div>
</pre> </pre>
</section> </section>
</div> </div>
......
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
</div> </div>
<div class="col-xs-1"> <div class="col-xs-1">
<button class="btn btn-block btn-nomal" id="clearLog">${I18n.joblog_clean}</button> <button class="btn btn-block btn-default" id="clearLog">${I18n.joblog_clean}</button>
</div> </div>
</div> </div>
...@@ -123,7 +123,7 @@ ...@@ -123,7 +123,7 @@
<div class="modal-body"> <div class="modal-body">
<form class="form-horizontal form" role="form" > <form class="form-horizontal form" role="form" >
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label"">${I18n.jobinfo_field_jobgroup}:</label> <label class="col-sm-3 control-label">${I18n.jobinfo_field_jobgroup}:</label>
<div class="col-sm-9"> <div class="col-sm-9">
<input type="text" class="form-control jobGroupText" readonly > <input type="text" class="form-control jobGroupText" readonly >
<input type="hidden" name="jobGroup" > <input type="hidden" name="jobGroup" >
...@@ -131,7 +131,7 @@ ...@@ -131,7 +131,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label"">${I18n.jobinfo_job}:</label> <label class="col-sm-3 control-label">${I18n.jobinfo_job}:</label>
<div class="col-sm-9"> <div class="col-sm-9">
<input type="text" class="form-control jobIdText" readonly > <input type="text" class="form-control jobIdText" readonly >
<input type="hidden" name="jobId" > <input type="hidden" name="jobId" >
...@@ -139,7 +139,7 @@ ...@@ -139,7 +139,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label"">${I18n.joblog_clean_type}:</label> <label class="col-sm-3 control-label">${I18n.joblog_clean_type}:</label>
<div class="col-sm-9"> <div class="col-sm-9">
<select class="form-control" name="type" > <select class="form-control" name="type" >
<option value="1" >${I18n.joblog_clean_type_1}</option> <option value="1" >${I18n.joblog_clean_type_1}</option>
......
...@@ -16,11 +16,6 @@ ...@@ -16,11 +16,6 @@
<artifactId>liquidnet-api-feign-sequence</artifactId> <artifactId>liquidnet-api-feign-sequence</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-api-feign-account</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>com.liquidnet</groupId> <groupId>com.liquidnet</groupId>
<artifactId>liquidnet-api-feign-adam</artifactId> <artifactId>liquidnet-api-feign-adam</artifactId>
...@@ -28,7 +23,7 @@ ...@@ -28,7 +23,7 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.liquidnet</groupId> <groupId>com.liquidnet</groupId>
<artifactId>liquidnet-api-feign-reconciliation</artifactId> <artifactId>liquidnet-api-feign-kylin</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
</dependency> </dependency>
</dependencies> </dependencies>
......
package com.liquidnet.service.executor.main.handler;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.liquidnet.service.account.wallet.dto.WalletCalTransBalanceParam;
import com.liquidnet.service.account.wallet.dto.base.WalletCallResult;
import com.liquidnet.service.feign.account.api.FeignAccountTaskClient;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.log.XxlJobLogger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
/**
* ExecutorAccountHandler.class
*
* @author zhanggb
* Created by IntelliJ IDEA at 2020/11/4
*/
@Component
public class ExecutorAccountHandler {
private static final Logger log = LoggerFactory.getLogger(ExecutorAccountHandler.class);
@Autowired
private FeignAccountTaskClient accountTaskClient;
@XxlJob(value = "sev-account:calTransBalance")
public ReturnT<String> calTransBalance(String param) {
XxlJobLogger.log("start:liquidnet.calTransBalance:[{}]", param);
Integer limitedSize = null;
if (!StringUtils.isEmpty(param)) {
JSONObject jsonParam = JSON.parseObject(param);
limitedSize = jsonParam.getInteger("lSize");
}
limitedSize = null == limitedSize ? 1000 : limitedSize;
WalletCalTransBalanceParam calTransBalanceParam = new WalletCalTransBalanceParam();
calTransBalanceParam.setChannelId("50001");
calTransBalanceParam.setBizType("000");
calTransBalanceParam.setLimitedSize(limitedSize);
WalletCallResult<?> result = accountTaskClient.calTransBalance(calTransBalanceParam);
XxlJobLogger.log("end:liquidnet.calTransBalance:[{}]",JSON.toJSONString(result));
return ReturnT.SUCCESS;
}
}
package com.liquidnet.service.executor.main.handler;
import com.alibaba.fastjson.JSON;
import com.liquidnet.service.ResponseDto;
import com.liquidnet.service.feign.adam.task.FeignTaskAdamConversionClient;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.log.XxlJobLogger;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class ExecutorAdamConversionHandler {
@Autowired
private FeignTaskAdamConversionClient feignTaskAdamConversionClient;
@XxlJob(value = "sev-adam:conversionSendConfirmTask")
public ReturnT<String> conversionSendConfirmTask(String param) {
XxlJobLogger.log("start:adam.conversion.sendConfirmTask");
ResponseDto responseDto = feignTaskAdamConversionClient.sendConfirmTask();
XxlJobLogger.log("end:adam.conversion:[{}]", JSON.toJSONString(responseDto));
return ReturnT.SUCCESS;
}
}
package com.liquidnet.service.executor.main.handler;
import com.alibaba.fastjson.JSON;
import com.liquidnet.service.ResponseDto;
import com.liquidnet.service.feign.adam.task.FeignTaskAdamPayoutClient;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.log.XxlJobLogger;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class ExecutorAdamPayoutHandler {
@Autowired
private FeignTaskAdamPayoutClient feignAdamPayoutTaskClient;
@XxlJob(value = "sev-adam:payoutExecutionDateTask")
public ReturnT<String> payoutExecutionDateTask(String param) {
XxlJobLogger.log("start:adam.payout.executionDateTask");
ResponseDto responseDto = feignAdamPayoutTaskClient.executionDateTask();
XxlJobLogger.log("end:adam.payout.executionDateTask:[{}]", JSON.toJSONString(responseDto));
return ReturnT.SUCCESS;
}
@XxlJob(value = "sev-adam:awaitingFundsDoPayoutTask")
public ReturnT<String> awaitingFundsDoPayoutTask(String param) {
XxlJobLogger.log("start:adam.payout.awaitingFundsDoPayoutTask");
ResponseDto responseDto = feignAdamPayoutTaskClient.awaitingFundsDoPayoutTask();
XxlJobLogger.log("end:adam.payout.awaitingFundsDoPayoutTask:[{}]", JSON.toJSONString(responseDto));
return ReturnT.SUCCESS;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment