执行器与数据库彻底解耦,但是执行器需要配置调度中心集群地址。调度中心提供API供执行器回调和心跳注册服务,取消调度中心内部jetty,心跳周期调整为30s,心跳失效为三倍心跳;
This commit is contained in:
parent
66de2818ba
commit
8a6d462d3b
|
@ -1,30 +1,53 @@
|
||||||
package com.xxl.job.admin.core.biz;
|
package com.xxl.job.admin.controller;
|
||||||
|
|
||||||
|
import com.xxl.job.admin.controller.annotation.PermessionLimit;
|
||||||
import com.xxl.job.admin.core.model.XxlJobInfo;
|
import com.xxl.job.admin.core.model.XxlJobInfo;
|
||||||
import com.xxl.job.admin.core.model.XxlJobLog;
|
import com.xxl.job.admin.core.model.XxlJobLog;
|
||||||
import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
|
import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
|
||||||
import com.xxl.job.core.biz.AdminBiz;
|
import com.xxl.job.admin.dao.IXxlJobInfoDao;
|
||||||
|
import com.xxl.job.admin.dao.IXxlJobLogDao;
|
||||||
|
import com.xxl.job.admin.dao.IXxlJobRegistryDao;
|
||||||
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.ReturnT;
|
import com.xxl.job.core.biz.model.ReturnT;
|
||||||
|
import com.xxl.job.core.util.AdminApiUtil;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.quartz.SchedulerException;
|
import org.quartz.SchedulerException;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by xuxueli on 17/3/1.
|
* Created by xuxueli on 17/5/10.
|
||||||
*/
|
*/
|
||||||
public class AdminBizImpl implements AdminBiz {
|
@Controller
|
||||||
private static Logger logger = LoggerFactory.getLogger(AdminBizImpl.class);
|
public class JobApiController {
|
||||||
|
private static Logger logger = LoggerFactory.getLogger(JobApiController.class);
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
public IXxlJobLogDao xxlJobLogDao;
|
||||||
|
@Resource
|
||||||
|
private IXxlJobInfoDao xxlJobInfoDao;
|
||||||
|
@Resource
|
||||||
|
private IXxlJobRegistryDao xxlJobRegistryDao;
|
||||||
|
|
||||||
|
|
||||||
|
@RequestMapping(value= AdminApiUtil.CALLBACK, method = RequestMethod.POST, consumes = "application/json")
|
||||||
|
@ResponseBody
|
||||||
|
@PermessionLimit(limit=false)
|
||||||
|
public ReturnT<String> callback(@RequestBody HandleCallbackParam handleCallbackParam){
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReturnT<String> callback(HandleCallbackParam handleCallbackParam) {
|
|
||||||
|
|
||||||
// valid log item
|
// valid log item
|
||||||
XxlJobLog log = XxlJobDynamicScheduler.xxlJobLogDao.load(handleCallbackParam.getLogId());
|
XxlJobLog log = xxlJobLogDao.load(handleCallbackParam.getLogId());
|
||||||
if (log == null) {
|
if (log == null) {
|
||||||
return new ReturnT<String>(ReturnT.FAIL_CODE, "log item not found.");
|
return new ReturnT<String>(ReturnT.FAIL_CODE, "log item not found.");
|
||||||
}
|
}
|
||||||
|
@ -32,14 +55,14 @@ public class AdminBizImpl implements AdminBiz {
|
||||||
// trigger success, to trigger child job, and avoid repeat trigger child job
|
// trigger success, to trigger child job, and avoid repeat trigger child job
|
||||||
String childTriggerMsg = null;
|
String childTriggerMsg = null;
|
||||||
if (ReturnT.SUCCESS_CODE==handleCallbackParam.getExecuteResult().getCode() && ReturnT.SUCCESS_CODE!=log.getHandleCode()) {
|
if (ReturnT.SUCCESS_CODE==handleCallbackParam.getExecuteResult().getCode() && ReturnT.SUCCESS_CODE!=log.getHandleCode()) {
|
||||||
XxlJobInfo xxlJobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(log.getJobId());
|
XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(log.getJobId());
|
||||||
if (xxlJobInfo!=null && StringUtils.isNotBlank(xxlJobInfo.getChildJobKey())) {
|
if (xxlJobInfo!=null && StringUtils.isNotBlank(xxlJobInfo.getChildJobKey())) {
|
||||||
childTriggerMsg = "<hr>";
|
childTriggerMsg = "<hr>";
|
||||||
String[] childJobKeys = xxlJobInfo.getChildJobKey().split(",");
|
String[] childJobKeys = xxlJobInfo.getChildJobKey().split(",");
|
||||||
for (int i = 0; i < childJobKeys.length; i++) {
|
for (int i = 0; i < childJobKeys.length; i++) {
|
||||||
String[] jobKeyArr = childJobKeys[i].split("_");
|
String[] jobKeyArr = childJobKeys[i].split("_");
|
||||||
if (jobKeyArr!=null && jobKeyArr.length==2) {
|
if (jobKeyArr!=null && jobKeyArr.length==2) {
|
||||||
XxlJobInfo childJobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(Integer.valueOf(jobKeyArr[1]));
|
XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.valueOf(jobKeyArr[1]));
|
||||||
if (childJobInfo!=null) {
|
if (childJobInfo!=null) {
|
||||||
try {
|
try {
|
||||||
boolean ret = XxlJobDynamicScheduler.triggerJob(String.valueOf(childJobInfo.getId()), String.valueOf(childJobInfo.getJobGroup()));
|
boolean ret = XxlJobDynamicScheduler.triggerJob(String.valueOf(childJobInfo.getId()), String.valueOf(childJobInfo.getJobGroup()));
|
||||||
|
@ -79,9 +102,21 @@ public class AdminBizImpl implements AdminBiz {
|
||||||
log.setHandleTime(new Date());
|
log.setHandleTime(new Date());
|
||||||
log.setHandleCode(handleCallbackParam.getExecuteResult().getCode());
|
log.setHandleCode(handleCallbackParam.getExecuteResult().getCode());
|
||||||
log.setHandleMsg(handleMsg.toString());
|
log.setHandleMsg(handleMsg.toString());
|
||||||
XxlJobDynamicScheduler.xxlJobLogDao.updateHandleInfo(log);
|
xxlJobLogDao.updateHandleInfo(log);
|
||||||
|
|
||||||
return new ReturnT<String>(ReturnT.SUCCESS_CODE, null);
|
return ReturnT.SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@RequestMapping(value=AdminApiUtil.REGISTRY, method = RequestMethod.POST, consumes = "application/json")
|
||||||
|
@ResponseBody
|
||||||
|
@PermessionLimit(limit=false)
|
||||||
|
public ReturnT<String> registry(@RequestBody RegistryParam registryParam){
|
||||||
|
int ret = xxlJobRegistryDao.registryUpdate(registryParam.getRegistGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue());
|
||||||
|
if (ret < 1) {
|
||||||
|
xxlJobRegistryDao.registrySave(registryParam.getRegistGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue());
|
||||||
|
}
|
||||||
|
return ReturnT.SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,11 +1,11 @@
|
||||||
package com.xxl.job.admin.controller;
|
package com.xxl.job.admin.controller;
|
||||||
|
|
||||||
import com.xxl.job.admin.core.model.XxlJobGroup;
|
import com.xxl.job.admin.core.model.XxlJobGroup;
|
||||||
import com.xxl.job.admin.core.thread.JobRegistryHelper;
|
import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper;
|
||||||
import com.xxl.job.admin.dao.IXxlJobGroupDao;
|
import com.xxl.job.admin.dao.IXxlJobGroupDao;
|
||||||
import com.xxl.job.admin.dao.IXxlJobInfoDao;
|
import com.xxl.job.admin.dao.IXxlJobInfoDao;
|
||||||
import com.xxl.job.core.biz.model.ReturnT;
|
import com.xxl.job.core.biz.model.ReturnT;
|
||||||
import com.xxl.job.core.registry.RegistHelper;
|
import com.xxl.job.core.enums.RegistryConfig;
|
||||||
import org.apache.commons.collections.CollectionUtils;
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
|
@ -33,9 +33,6 @@ public class JobGroupController {
|
||||||
@RequestMapping
|
@RequestMapping
|
||||||
public String index(Model model) {
|
public String index(Model model) {
|
||||||
|
|
||||||
// job admin
|
|
||||||
List<String> adminAddressList = JobRegistryHelper.discover(RegistHelper.RegistType.ADMIN.name(), RegistHelper.RegistType.ADMIN.name());
|
|
||||||
|
|
||||||
// job group (executor)
|
// job group (executor)
|
||||||
List<XxlJobGroup> list = xxlJobGroupDao.findAll();
|
List<XxlJobGroup> list = xxlJobGroupDao.findAll();
|
||||||
|
|
||||||
|
@ -43,7 +40,7 @@ public class JobGroupController {
|
||||||
for (XxlJobGroup group: list) {
|
for (XxlJobGroup group: list) {
|
||||||
List<String> registryList = null;
|
List<String> registryList = null;
|
||||||
if (group.getAddressType() == 0) {
|
if (group.getAddressType() == 0) {
|
||||||
registryList = JobRegistryHelper.discover(RegistHelper.RegistType.EXECUTOR.name(), group.getAppName());
|
registryList = JobRegistryMonitorHelper.discover(RegistryConfig.RegistType.EXECUTOR.name(), group.getAppName());
|
||||||
} else {
|
} else {
|
||||||
if (StringUtils.isNotBlank(group.getAddressList())) {
|
if (StringUtils.isNotBlank(group.getAddressList())) {
|
||||||
registryList = Arrays.asList(group.getAddressList().split(","));
|
registryList = Arrays.asList(group.getAddressList().split(","));
|
||||||
|
@ -53,7 +50,6 @@ public class JobGroupController {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
model.addAttribute("adminAddressList", adminAddressList);
|
|
||||||
model.addAttribute("list", list);
|
model.addAttribute("list", list);
|
||||||
return "jobgroup/jobgroup.index";
|
return "jobgroup/jobgroup.index";
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,12 +7,12 @@ import com.xxl.job.admin.core.model.XxlJobLog;
|
||||||
import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
|
import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
|
||||||
import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
|
import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
|
||||||
import com.xxl.job.admin.core.thread.JobMonitorHelper;
|
import com.xxl.job.admin.core.thread.JobMonitorHelper;
|
||||||
import com.xxl.job.admin.core.thread.JobRegistryHelper;
|
import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper;
|
||||||
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 com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
|
import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
|
||||||
import com.xxl.job.core.registry.RegistHelper;
|
import com.xxl.job.core.enums.RegistryConfig;
|
||||||
import com.xxl.job.core.rpc.netcom.NetComClientProxy;
|
import com.xxl.job.core.rpc.netcom.NetComClientProxy;
|
||||||
import org.apache.commons.collections.CollectionUtils;
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
@ -68,7 +68,6 @@ public class RemoteHttpJobBean extends QuartzJobBean {
|
||||||
triggerParam.setGlueUpdatetime(jobInfo.getGlueUpdatetime().getTime());
|
triggerParam.setGlueUpdatetime(jobInfo.getGlueUpdatetime().getTime());
|
||||||
triggerParam.setLogId(jobLog.getId());
|
triggerParam.setLogId(jobLog.getId());
|
||||||
triggerParam.setLogDateTim(jobLog.getTriggerTime().getTime());
|
triggerParam.setLogDateTim(jobLog.getTriggerTime().getTime());
|
||||||
triggerParam.setLogAddress(findCallbackAddressList()); // callback address list
|
|
||||||
|
|
||||||
// do trigger
|
// do trigger
|
||||||
ReturnT<String> triggerResult = doTrigger(triggerParam, jobInfo, jobLog);
|
ReturnT<String> triggerResult = doTrigger(triggerParam, jobInfo, jobLog);
|
||||||
|
@ -100,7 +99,7 @@ public class RemoteHttpJobBean extends QuartzJobBean {
|
||||||
XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(jobInfo.getJobGroup());
|
XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(jobInfo.getJobGroup());
|
||||||
if (group.getAddressType() == 0) {
|
if (group.getAddressType() == 0) {
|
||||||
triggerSb.append("注册方式:自动注册");
|
triggerSb.append("注册方式:自动注册");
|
||||||
addressList = (ArrayList<String>) JobRegistryHelper.discover(RegistHelper.RegistType.EXECUTOR.name(), group.getAppName());
|
addressList = (ArrayList<String>) JobRegistryMonitorHelper.discover(RegistryConfig.RegistType.EXECUTOR.name(), group.getAppName());
|
||||||
} else {
|
} else {
|
||||||
triggerSb.append("注册方式:手动录入");
|
triggerSb.append("注册方式:手动录入");
|
||||||
if (StringUtils.isNotBlank(group.getAddressList())) {
|
if (StringUtils.isNotBlank(group.getAddressList())) {
|
||||||
|
@ -212,19 +211,4 @@ public class RemoteHttpJobBean extends QuartzJobBean {
|
||||||
return runResult;
|
return runResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* find callback address list
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public Set<String> findCallbackAddressList(){
|
|
||||||
Set<String> adminAddressSet = new HashSet<String>();
|
|
||||||
adminAddressSet.add(XxlJobDynamicScheduler.getCallbackAddress());
|
|
||||||
|
|
||||||
List<String> adminAddressList = JobRegistryHelper.discover(RegistHelper.RegistType.ADMIN.name(), RegistHelper.RegistType.ADMIN.name());
|
|
||||||
if (adminAddressList!=null) {
|
|
||||||
adminAddressSet.addAll(adminAddressList);
|
|
||||||
}
|
|
||||||
return adminAddressSet;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -3,15 +3,12 @@ package com.xxl.job.admin.core.schedule;
|
||||||
import com.xxl.job.admin.core.jobbean.RemoteHttpJobBean;
|
import com.xxl.job.admin.core.jobbean.RemoteHttpJobBean;
|
||||||
import com.xxl.job.admin.core.model.XxlJobInfo;
|
import com.xxl.job.admin.core.model.XxlJobInfo;
|
||||||
import com.xxl.job.admin.core.thread.JobMonitorHelper;
|
import com.xxl.job.admin.core.thread.JobMonitorHelper;
|
||||||
import com.xxl.job.admin.core.thread.JobRegistryHelper;
|
import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper;
|
||||||
import com.xxl.job.admin.dao.IXxlJobGroupDao;
|
import com.xxl.job.admin.dao.IXxlJobGroupDao;
|
||||||
import com.xxl.job.admin.dao.IXxlJobInfoDao;
|
import com.xxl.job.admin.dao.IXxlJobInfoDao;
|
||||||
import com.xxl.job.admin.dao.IXxlJobLogDao;
|
import com.xxl.job.admin.dao.IXxlJobLogDao;
|
||||||
import com.xxl.job.admin.dao.IXxlJobRegistryDao;
|
import com.xxl.job.admin.dao.IXxlJobRegistryDao;
|
||||||
import com.xxl.job.core.biz.AdminBiz;
|
|
||||||
import com.xxl.job.admin.core.biz.AdminBizImpl;
|
|
||||||
import com.xxl.job.core.rpc.netcom.NetComServerFactory;
|
import com.xxl.job.core.rpc.netcom.NetComServerFactory;
|
||||||
import com.xxl.job.core.util.IpUtil;
|
|
||||||
import org.quartz.*;
|
import org.quartz.*;
|
||||||
import org.quartz.Trigger.TriggerState;
|
import org.quartz.Trigger.TriggerState;
|
||||||
import org.quartz.impl.matchers.GroupMatcher;
|
import org.quartz.impl.matchers.GroupMatcher;
|
||||||
|
@ -39,37 +36,11 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In
|
||||||
XxlJobDynamicScheduler.scheduler = scheduler;
|
XxlJobDynamicScheduler.scheduler = scheduler;
|
||||||
}
|
}
|
||||||
|
|
||||||
// trigger callback address
|
|
||||||
private String callBackIp;
|
|
||||||
private int callBackPort = 8888;
|
|
||||||
private static String callbackAddress;
|
|
||||||
|
|
||||||
public void setCallBackIp(String callBackIp) {
|
|
||||||
this.callBackIp = callBackIp;
|
|
||||||
}
|
|
||||||
public void setCallBackPort(int callBackPort) {
|
|
||||||
this.callBackPort = callBackPort;
|
|
||||||
}
|
|
||||||
public static String getCallbackAddress(){
|
|
||||||
return callbackAddress;
|
|
||||||
}
|
|
||||||
|
|
||||||
// init
|
// init
|
||||||
private NetComServerFactory serverFactory = new NetComServerFactory();
|
private NetComServerFactory serverFactory = new NetComServerFactory();
|
||||||
public void init() throws Exception {
|
public void init() throws Exception {
|
||||||
// server
|
// admin registry monitor run
|
||||||
NetComServerFactory.putService(AdminBiz.class, new AdminBizImpl());
|
JobRegistryMonitorHelper.getInstance().start();
|
||||||
serverFactory.start(callBackPort, callBackIp, null, null);
|
|
||||||
|
|
||||||
// init callbackAddress
|
|
||||||
if (callBackIp!=null && callBackIp.trim().length()>0) {
|
|
||||||
callbackAddress = callBackIp.trim().concat(":").concat(String.valueOf(callBackPort));
|
|
||||||
} else {
|
|
||||||
callbackAddress = IpUtil.getIpPort(callBackPort);;
|
|
||||||
}
|
|
||||||
|
|
||||||
// admin registry run
|
|
||||||
JobRegistryHelper.getInstance().start();
|
|
||||||
|
|
||||||
// admin monitor run
|
// admin monitor run
|
||||||
JobMonitorHelper.getInstance().start();
|
JobMonitorHelper.getInstance().start();
|
||||||
|
@ -78,7 +49,7 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In
|
||||||
// destroy
|
// destroy
|
||||||
public void destroy(){
|
public void destroy(){
|
||||||
// admin registry stop
|
// admin registry stop
|
||||||
JobRegistryHelper.getInstance().toStop();
|
JobRegistryMonitorHelper.getInstance().toStop();
|
||||||
|
|
||||||
// admin monitor stop
|
// admin monitor stop
|
||||||
JobMonitorHelper.getInstance().toStop();
|
JobMonitorHelper.getInstance().toStop();
|
||||||
|
|
|
@ -2,7 +2,7 @@ package com.xxl.job.admin.core.thread;
|
||||||
|
|
||||||
import com.xxl.job.admin.core.model.XxlJobRegistry;
|
import com.xxl.job.admin.core.model.XxlJobRegistry;
|
||||||
import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
|
import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
|
||||||
import com.xxl.job.core.registry.RegistHelper;
|
import com.xxl.job.core.enums.RegistryConfig;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
@ -15,11 +15,11 @@ import java.util.concurrent.TimeUnit;
|
||||||
* job registry instance
|
* job registry instance
|
||||||
* @author xuxueli 2016-10-02 19:10:24
|
* @author xuxueli 2016-10-02 19:10:24
|
||||||
*/
|
*/
|
||||||
public class JobRegistryHelper {
|
public class JobRegistryMonitorHelper {
|
||||||
private static Logger logger = LoggerFactory.getLogger(JobRegistryHelper.class);
|
private static Logger logger = LoggerFactory.getLogger(JobRegistryMonitorHelper.class);
|
||||||
|
|
||||||
private static JobRegistryHelper instance = new JobRegistryHelper();
|
private static JobRegistryMonitorHelper instance = new JobRegistryMonitorHelper();
|
||||||
public static JobRegistryHelper getInstance(){
|
public static JobRegistryMonitorHelper getInstance(){
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,18 +33,12 @@ public class JobRegistryHelper {
|
||||||
public void run() {
|
public void run() {
|
||||||
while (!toStop) {
|
while (!toStop) {
|
||||||
try {
|
try {
|
||||||
// registry admin
|
|
||||||
int ret = XxlJobDynamicScheduler.xxlJobRegistryDao.registryUpdate(RegistHelper.RegistType.ADMIN.name(), RegistHelper.RegistType.ADMIN.name(), XxlJobDynamicScheduler.getCallbackAddress());
|
|
||||||
if (ret < 1) {
|
|
||||||
XxlJobDynamicScheduler.xxlJobRegistryDao.registrySave(RegistHelper.RegistType.ADMIN.name(), RegistHelper.RegistType.ADMIN.name(), XxlJobDynamicScheduler.getCallbackAddress());
|
|
||||||
}
|
|
||||||
|
|
||||||
// remove dead admin/executor
|
// remove dead admin/executor
|
||||||
XxlJobDynamicScheduler.xxlJobRegistryDao.removeDead(RegistHelper.TIMEOUT*2);
|
XxlJobDynamicScheduler.xxlJobRegistryDao.removeDead(RegistryConfig.DEAD_TIMEOUT);
|
||||||
|
|
||||||
// fresh registry map
|
// fresh registry map
|
||||||
ConcurrentHashMap<String, List<String>> temp = new ConcurrentHashMap<String, List<String>>();
|
ConcurrentHashMap<String, List<String>> temp = new ConcurrentHashMap<String, List<String>>();
|
||||||
List<XxlJobRegistry> list = XxlJobDynamicScheduler.xxlJobRegistryDao.findAll(RegistHelper.TIMEOUT*2);
|
List<XxlJobRegistry> list = XxlJobDynamicScheduler.xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT);
|
||||||
if (list != null) {
|
if (list != null) {
|
||||||
for (XxlJobRegistry item: list) {
|
for (XxlJobRegistry item: list) {
|
||||||
String groupKey = makeGroupKey(item.getRegistryGroup(), item.getRegistryKey());
|
String groupKey = makeGroupKey(item.getRegistryGroup(), item.getRegistryKey());
|
||||||
|
@ -61,7 +55,7 @@ public class JobRegistryHelper {
|
||||||
logger.error("job registry instance error:{}", e);
|
logger.error("job registry instance error:{}", e);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
TimeUnit.SECONDS.sleep(RegistHelper.TIMEOUT);
|
TimeUnit.SECONDS.sleep(RegistryConfig.BEAT_TIMEOUT);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
logger.error("job registry instance error:{}", e);
|
logger.error("job registry instance error:{}", e);
|
||||||
}
|
}
|
|
@ -5,13 +5,16 @@ import com.xxl.job.admin.core.model.XxlJobGroup;
|
||||||
import com.xxl.job.admin.core.model.XxlJobInfo;
|
import com.xxl.job.admin.core.model.XxlJobInfo;
|
||||||
import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
|
import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
|
||||||
import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
|
import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
|
||||||
import com.xxl.job.admin.core.thread.JobRegistryHelper;
|
import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper;
|
||||||
import com.xxl.job.admin.dao.*;
|
import com.xxl.job.admin.dao.IXxlJobGroupDao;
|
||||||
|
import com.xxl.job.admin.dao.IXxlJobInfoDao;
|
||||||
|
import com.xxl.job.admin.dao.IXxlJobLogDao;
|
||||||
|
import com.xxl.job.admin.dao.IXxlJobLogGlueDao;
|
||||||
import com.xxl.job.admin.service.IXxlJobService;
|
import com.xxl.job.admin.service.IXxlJobService;
|
||||||
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.enums.RegistryConfig;
|
||||||
import com.xxl.job.core.glue.GlueTypeEnum;
|
import com.xxl.job.core.glue.GlueTypeEnum;
|
||||||
import com.xxl.job.core.registry.RegistHelper;
|
|
||||||
import org.apache.commons.collections.CollectionUtils;
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.apache.commons.lang.time.DateUtils;
|
import org.apache.commons.lang.time.DateUtils;
|
||||||
|
@ -289,7 +292,7 @@ public class XxlJobServiceImpl implements IXxlJobService {
|
||||||
for (XxlJobGroup group: groupList) {
|
for (XxlJobGroup group: groupList) {
|
||||||
List<String> registryList = null;
|
List<String> registryList = null;
|
||||||
if (group.getAddressType() == 0) {
|
if (group.getAddressType() == 0) {
|
||||||
registryList = JobRegistryHelper.discover(RegistHelper.RegistType.EXECUTOR.name(), group.getAppName());
|
registryList = JobRegistryMonitorHelper.discover(RegistryConfig.RegistType.EXECUTOR.name(), group.getAppName());
|
||||||
} else {
|
} else {
|
||||||
if (StringUtils.isNotBlank(group.getAddressList())) {
|
if (StringUtils.isNotBlank(group.getAddressList())) {
|
||||||
registryList = Arrays.asList(group.getAddressList().split(","));
|
registryList = Arrays.asList(group.getAddressList().split(","));
|
||||||
|
|
|
@ -84,10 +84,6 @@
|
||||||
<bean id="xxlJobDynamicScheduler" class="com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler" init-method="init" destroy-method="destroy" >
|
<bean id="xxlJobDynamicScheduler" class="com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler" init-method="init" destroy-method="destroy" >
|
||||||
<!-- (轻易不要变更“调度器名称”, 任务创建时会绑定该“调度器名称”) -->
|
<!-- (轻易不要变更“调度器名称”, 任务创建时会绑定该“调度器名称”) -->
|
||||||
<property name="scheduler" ref="quartzScheduler"/>
|
<property name="scheduler" ref="quartzScheduler"/>
|
||||||
<!-- 调度中心回调IP[选填],为空则自动获取 -->
|
|
||||||
<property name="callBackIp" value="${xxl.job.callBackIp}"/>
|
|
||||||
<!-- 调度中心回调端口号 -->
|
|
||||||
<property name="callBackPort" value="${xxl.job.callBackPort}"/>
|
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
</beans>
|
</beans>
|
|
@ -4,10 +4,6 @@ xxl.job.db.url=jdbc:mysql://localhost:3306/xxl-job?useUnicode=true&characterEnco
|
||||||
xxl.job.db.user=root
|
xxl.job.db.user=root
|
||||||
xxl.job.db.password=root_pwd
|
xxl.job.db.password=root_pwd
|
||||||
|
|
||||||
### xxl-job callback address
|
|
||||||
xxl.job.callBackIp=
|
|
||||||
xxl.job.callBackPort=8888
|
|
||||||
|
|
||||||
### xxl-job email
|
### xxl-job email
|
||||||
xxl.job.mail.host=smtp.163.com
|
xxl.job.mail.host=smtp.163.com
|
||||||
xxl.job.mail.port=25
|
xxl.job.mail.port=25
|
||||||
|
|
|
@ -30,8 +30,6 @@
|
||||||
<div class="box-header">
|
<div class="box-header">
|
||||||
<h3 class="box-title">执行器列表</h3>
|
<h3 class="box-title">执行器列表</h3>
|
||||||
<button class="btn btn-info btn-xs pull-left2 add" >+新增执行器</button>
|
<button class="btn btn-info btn-xs pull-left2 add" >+新增执行器</button>
|
||||||
|
|
||||||
调度中心OnLine机器:<#if adminAddressList?exists><#list adminAddressList as item><span class="badge bg-green">${item}</span></#list></#if>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">
|
<div class="box-body">
|
||||||
<table id="joblog_list" class="table table-bordered table-striped display" width="100%" >
|
<table id="joblog_list" class="table table-bordered table-striped display" width="100%" >
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
package com.xxl.job.dao.impl;
|
||||||
|
|
||||||
|
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.util.AdminApiUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by xuxueli on 17/5/10.
|
||||||
|
*/
|
||||||
|
public class AdminApiTest {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try {
|
||||||
|
RegistryParam registryParam = new RegistryParam(RegistryConfig.RegistType.EXECUTOR.name(), "aaa", "112312312312");
|
||||||
|
ReturnT<String> registryResult = AdminApiUtil.callApi("http://localhost:8080/xxl-job-admin"+AdminApiUtil.REGISTRY, registryParam);
|
||||||
|
System.out.println(registryResult);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,13 +0,0 @@
|
||||||
package com.xxl.job.core.biz;
|
|
||||||
|
|
||||||
import com.xxl.job.core.biz.model.HandleCallbackParam;
|
|
||||||
import com.xxl.job.core.biz.model.ReturnT;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by xuxueli on 17/3/1.
|
|
||||||
*/
|
|
||||||
public interface AdminBiz {
|
|
||||||
|
|
||||||
public ReturnT<String> callback(HandleCallbackParam handleCallbackParam);
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,7 +1,6 @@
|
||||||
package com.xxl.job.core.biz.model;
|
package com.xxl.job.core.biz.model;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by xuxueli on 17/3/2.
|
* Created by xuxueli on 17/3/2.
|
||||||
|
@ -10,13 +9,11 @@ public class HandleCallbackParam implements Serializable {
|
||||||
private static final long serialVersionUID = 42L;
|
private static final long serialVersionUID = 42L;
|
||||||
|
|
||||||
private int logId;
|
private int logId;
|
||||||
private Set<String> logAddress;
|
|
||||||
|
|
||||||
private ReturnT<String> executeResult;
|
private ReturnT<String> executeResult;
|
||||||
|
|
||||||
public HandleCallbackParam(int logId, Set<String> logAddress, ReturnT<String> executeResult) {
|
public HandleCallbackParam(){}
|
||||||
|
public HandleCallbackParam(int logId, ReturnT<String> executeResult) {
|
||||||
this.logId = logId;
|
this.logId = logId;
|
||||||
this.logAddress = logAddress;
|
|
||||||
this.executeResult = executeResult;
|
this.executeResult = executeResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,14 +25,6 @@ public class HandleCallbackParam implements Serializable {
|
||||||
this.logId = logId;
|
this.logId = logId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<String> getLogAddress() {
|
|
||||||
return logAddress;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLogAddress(Set<String> logAddress) {
|
|
||||||
this.logAddress = logAddress;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ReturnT<String> getExecuteResult() {
|
public ReturnT<String> getExecuteResult() {
|
||||||
return executeResult;
|
return executeResult;
|
||||||
}
|
}
|
||||||
|
@ -43,4 +32,12 @@ public class HandleCallbackParam implements Serializable {
|
||||||
public void setExecuteResult(ReturnT<String> executeResult) {
|
public void setExecuteResult(ReturnT<String> executeResult) {
|
||||||
this.executeResult = executeResult;
|
this.executeResult = executeResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "HandleCallbackParam{" +
|
||||||
|
"logId=" + logId +
|
||||||
|
", executeResult=" + executeResult +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
package com.xxl.job.core.biz.model;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by xuxueli on 2017-05-10 20:22:42
|
||||||
|
*/
|
||||||
|
public class RegistryParam implements Serializable {
|
||||||
|
private static final long serialVersionUID = 42L;
|
||||||
|
|
||||||
|
private String registGroup;
|
||||||
|
private String registryKey;
|
||||||
|
private String registryValue;
|
||||||
|
|
||||||
|
public RegistryParam(){}
|
||||||
|
public RegistryParam(String registGroup, String registryKey, String registryValue) {
|
||||||
|
this.registGroup = registGroup;
|
||||||
|
this.registryKey = registryKey;
|
||||||
|
this.registryValue = registryValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRegistGroup() {
|
||||||
|
return registGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRegistGroup(String registGroup) {
|
||||||
|
this.registGroup = registGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRegistryKey() {
|
||||||
|
return registryKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRegistryKey(String registryKey) {
|
||||||
|
this.registryKey = registryKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRegistryValue() {
|
||||||
|
return registryValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRegistryValue(String registryValue) {
|
||||||
|
this.registryValue = registryValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "RegistryParam{" +
|
||||||
|
"registGroup='" + registGroup + '\'' +
|
||||||
|
", registryKey='" + registryKey + '\'' +
|
||||||
|
", registryValue='" + registryValue + '\'' +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
}
|
|
@ -19,6 +19,7 @@ public class ReturnT<T> implements Serializable {
|
||||||
private String msg;
|
private String msg;
|
||||||
private T content;
|
private T content;
|
||||||
|
|
||||||
|
public ReturnT(){}
|
||||||
public ReturnT(int code, String msg) {
|
public ReturnT(int code, String msg) {
|
||||||
this.code = code;
|
this.code = code;
|
||||||
this.msg = msg;
|
this.msg = msg;
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package com.xxl.job.core.biz.model;
|
package com.xxl.job.core.biz.model;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by xuxueli on 16/7/22.
|
* Created by xuxueli on 16/7/22.
|
||||||
|
@ -22,8 +21,6 @@ public class TriggerParam implements Serializable{
|
||||||
private int logId;
|
private int logId;
|
||||||
private long logDateTim;
|
private long logDateTim;
|
||||||
|
|
||||||
private Set<String> logAddress;
|
|
||||||
|
|
||||||
public int getJobId() {
|
public int getJobId() {
|
||||||
return jobId;
|
return jobId;
|
||||||
}
|
}
|
||||||
|
@ -96,11 +93,18 @@ public class TriggerParam implements Serializable{
|
||||||
this.logDateTim = logDateTim;
|
this.logDateTim = logDateTim;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<String> getLogAddress() {
|
@Override
|
||||||
return logAddress;
|
public String toString() {
|
||||||
}
|
return "TriggerParam{" +
|
||||||
|
"jobId=" + jobId +
|
||||||
public void setLogAddress(Set<String> logAddress) {
|
", executorHandler='" + executorHandler + '\'' +
|
||||||
this.logAddress = logAddress;
|
", executorParams='" + executorParams + '\'' +
|
||||||
|
", executorBlockStrategy='" + executorBlockStrategy + '\'' +
|
||||||
|
", glueType='" + glueType + '\'' +
|
||||||
|
", glueSource='" + glueSource + '\'' +
|
||||||
|
", glueUpdatetime=" + glueUpdatetime +
|
||||||
|
", logId=" + logId +
|
||||||
|
", logDateTim=" + logDateTim +
|
||||||
|
'}';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
package com.xxl.job.core.enums;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by xuxueli on 17/5/10.
|
||||||
|
*/
|
||||||
|
public class RegistryConfig {
|
||||||
|
|
||||||
|
public static final int BEAT_TIMEOUT = 30;
|
||||||
|
public static final int DEAD_TIMEOUT = BEAT_TIMEOUT * 3;
|
||||||
|
|
||||||
|
public enum RegistType{ EXECUTOR, ADMIN }
|
||||||
|
|
||||||
|
}
|
|
@ -4,7 +4,6 @@ import com.xxl.job.core.biz.ExecutorBiz;
|
||||||
import com.xxl.job.core.biz.impl.ExecutorBizImpl;
|
import com.xxl.job.core.biz.impl.ExecutorBizImpl;
|
||||||
import com.xxl.job.core.handler.IJobHandler;
|
import com.xxl.job.core.handler.IJobHandler;
|
||||||
import com.xxl.job.core.handler.annotation.JobHander;
|
import com.xxl.job.core.handler.annotation.JobHander;
|
||||||
import com.xxl.job.core.registry.RegistHelper;
|
|
||||||
import com.xxl.job.core.rpc.netcom.NetComServerFactory;
|
import com.xxl.job.core.rpc.netcom.NetComServerFactory;
|
||||||
import com.xxl.job.core.thread.ExecutorRegistryThread;
|
import com.xxl.job.core.thread.ExecutorRegistryThread;
|
||||||
import com.xxl.job.core.thread.JobThread;
|
import com.xxl.job.core.thread.JobThread;
|
||||||
|
@ -30,7 +29,7 @@ public class XxlJobExecutor implements ApplicationContextAware, ApplicationListe
|
||||||
private String ip;
|
private String ip;
|
||||||
private int port = 9999;
|
private int port = 9999;
|
||||||
private String appName;
|
private String appName;
|
||||||
private RegistHelper registHelper;
|
public static String adminAddresses;
|
||||||
public static String logPath;
|
public static String logPath;
|
||||||
|
|
||||||
public void setIp(String ip) {
|
public void setIp(String ip) {
|
||||||
|
@ -42,8 +41,8 @@ public class XxlJobExecutor implements ApplicationContextAware, ApplicationListe
|
||||||
public void setAppName(String appName) {
|
public void setAppName(String appName) {
|
||||||
this.appName = appName;
|
this.appName = appName;
|
||||||
}
|
}
|
||||||
public void setRegistHelper(RegistHelper registHelper) {
|
public void setAdminAddresses(String adminAddresses) {
|
||||||
this.registHelper = registHelper;
|
this.adminAddresses = adminAddresses;
|
||||||
}
|
}
|
||||||
public void setLogPath(String logPath) {
|
public void setLogPath(String logPath) {
|
||||||
this.logPath = logPath;
|
this.logPath = logPath;
|
||||||
|
@ -54,7 +53,7 @@ public class XxlJobExecutor implements ApplicationContextAware, ApplicationListe
|
||||||
public void start() throws Exception {
|
public void start() throws Exception {
|
||||||
// executor start
|
// executor start
|
||||||
NetComServerFactory.putService(ExecutorBiz.class, new ExecutorBizImpl());
|
NetComServerFactory.putService(ExecutorBiz.class, new ExecutorBizImpl());
|
||||||
serverFactory.start(port, ip, appName, registHelper);
|
serverFactory.start(port, ip, appName);
|
||||||
|
|
||||||
// trigger callback thread start
|
// trigger callback thread start
|
||||||
TriggerCallbackThread.getInstance().start();
|
TriggerCallbackThread.getInstance().start();
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
package com.xxl.job.core.registry;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by xuxueli on 16/9/30.
|
|
||||||
*/
|
|
||||||
public interface RegistHelper {
|
|
||||||
|
|
||||||
public static final int TIMEOUT = 15;
|
|
||||||
public enum RegistType{ EXECUTOR, ADMIN }
|
|
||||||
|
|
||||||
public int registry(String registGroup, String registryKey, String registryValue);
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
package com.xxl.job.core.registry.impl;
|
|
||||||
|
|
||||||
import com.xxl.job.core.registry.RegistHelper;
|
|
||||||
import com.xxl.job.core.util.DBUtil;
|
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by xuxueli on 16/9/30.
|
|
||||||
*/
|
|
||||||
public class DbRegistHelper implements RegistHelper {
|
|
||||||
|
|
||||||
private DataSource dataSource;
|
|
||||||
public void setDataSource(DataSource dataSource) {
|
|
||||||
this.dataSource = dataSource;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int registry(String registGroup, String registryKey, String registryValue) {
|
|
||||||
String updateSql = "UPDATE XXL_JOB_QRTZ_TRIGGER_REGISTRY SET `update_time` = NOW() WHERE `registry_group` = ? AND `registry_key` = ? AND `registry_value` = ?";
|
|
||||||
String insertSql = "INSERT INTO XXL_JOB_QRTZ_TRIGGER_REGISTRY( `registry_group` , `registry_key` , `registry_value`, `update_time`) VALUES(? , ? , ?, NOW())";
|
|
||||||
int ret = DBUtil.update(dataSource, updateSql, new Object[]{registGroup, registryKey, registryValue});
|
|
||||||
if (ret<1) {
|
|
||||||
ret = DBUtil.update(dataSource, insertSql, new Object[]{registGroup, registryKey, registryValue});
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,7 +1,6 @@
|
||||||
package com.xxl.job.core.rpc.netcom;
|
package com.xxl.job.core.rpc.netcom;
|
||||||
|
|
||||||
import com.xxl.job.core.biz.model.ReturnT;
|
import com.xxl.job.core.biz.model.ReturnT;
|
||||||
import com.xxl.job.core.registry.RegistHelper;
|
|
||||||
import com.xxl.job.core.rpc.codec.RpcRequest;
|
import com.xxl.job.core.rpc.codec.RpcRequest;
|
||||||
import com.xxl.job.core.rpc.codec.RpcResponse;
|
import com.xxl.job.core.rpc.codec.RpcResponse;
|
||||||
import com.xxl.job.core.rpc.netcom.jetty.server.JettyServer;
|
import com.xxl.job.core.rpc.netcom.jetty.server.JettyServer;
|
||||||
|
@ -22,8 +21,8 @@ public class NetComServerFactory {
|
||||||
|
|
||||||
// ---------------------- server start ----------------------
|
// ---------------------- server start ----------------------
|
||||||
JettyServer server = new JettyServer();
|
JettyServer server = new JettyServer();
|
||||||
public void start(int port, String ip, String appName, RegistHelper registHelper) throws Exception {
|
public void start(int port, String ip, String appName) throws Exception {
|
||||||
server.start(port, ip, appName, registHelper);
|
server.start(port, ip, appName);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------- server destroy ----------------------
|
// ---------------------- server destroy ----------------------
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package com.xxl.job.core.rpc.netcom.jetty.server;
|
package com.xxl.job.core.rpc.netcom.jetty.server;
|
||||||
|
|
||||||
import com.xxl.job.core.registry.RegistHelper;
|
|
||||||
import com.xxl.job.core.thread.ExecutorRegistryThread;
|
import com.xxl.job.core.thread.ExecutorRegistryThread;
|
||||||
import org.eclipse.jetty.server.Connector;
|
import org.eclipse.jetty.server.Connector;
|
||||||
import org.eclipse.jetty.server.Handler;
|
import org.eclipse.jetty.server.Handler;
|
||||||
|
@ -20,7 +19,7 @@ public class JettyServer {
|
||||||
|
|
||||||
private Server server;
|
private Server server;
|
||||||
private Thread thread;
|
private Thread thread;
|
||||||
public void start(final int port, final String ip, final String appName, final RegistHelper registHelper) throws Exception {
|
public void start(final int port, final String ip, final String appName) throws Exception {
|
||||||
thread = new Thread(new Runnable() {
|
thread = new Thread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
@ -42,7 +41,7 @@ public class JettyServer {
|
||||||
// Start the server
|
// Start the server
|
||||||
server.start();
|
server.start();
|
||||||
logger.info(">>>>>>>>>>>> xxl-job jetty server start success at port:{}.", port);
|
logger.info(">>>>>>>>>>>> xxl-job jetty server start success at port:{}.", port);
|
||||||
ExecutorRegistryThread.getInstance().start(port, ip, appName, registHelper);
|
ExecutorRegistryThread.getInstance().start(port, ip, appName);
|
||||||
server.join(); // block until thread stopped
|
server.join(); // block until thread stopped
|
||||||
logger.info(">>>>>>>>>>> xxl-rpc server join success, netcon={}, port={}", JettyServer.class.getName(), port);
|
logger.info(">>>>>>>>>>> xxl-rpc server join success, netcon={}, port={}", JettyServer.class.getName(), port);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
|
@ -1,7 +1,12 @@
|
||||||
package com.xxl.job.core.thread;
|
package com.xxl.job.core.thread;
|
||||||
|
|
||||||
import com.xxl.job.core.registry.RegistHelper;
|
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.util.AdminApiUtil;
|
||||||
import com.xxl.job.core.util.IpUtil;
|
import com.xxl.job.core.util.IpUtil;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
@ -9,6 +14,7 @@ import java.util.concurrent.TimeUnit;
|
||||||
* Created by xuxueli on 17/3/2.
|
* Created by xuxueli on 17/3/2.
|
||||||
*/
|
*/
|
||||||
public class ExecutorRegistryThread extends Thread {
|
public class ExecutorRegistryThread extends Thread {
|
||||||
|
private static Logger logger = LoggerFactory.getLogger(ExecutorRegistryThread.class);
|
||||||
|
|
||||||
private static ExecutorRegistryThread instance = new ExecutorRegistryThread();
|
private static ExecutorRegistryThread instance = new ExecutorRegistryThread();
|
||||||
public static ExecutorRegistryThread getInstance(){
|
public static ExecutorRegistryThread getInstance(){
|
||||||
|
@ -17,27 +23,36 @@ public class ExecutorRegistryThread extends Thread {
|
||||||
|
|
||||||
private Thread registryThread;
|
private Thread registryThread;
|
||||||
private boolean toStop = false;
|
private boolean toStop = false;
|
||||||
public void start(final int port, final String ip, final String appName, final RegistHelper registHelper){
|
public void start(final int port, final String ip, final String appName){
|
||||||
if (registHelper==null && appName==null || appName.trim().length()==0) {
|
if (appName==null || appName.trim().length()==0) {
|
||||||
|
logger.warn(">>>>>>>>>>>> xxl-job, executor registry config fail");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// executor address (generate addredd = ip:port)
|
||||||
|
final String executorAddress;
|
||||||
|
if (ip != null && ip.trim().length()>0) {
|
||||||
|
executorAddress = ip.trim().concat(":").concat(String.valueOf(port));
|
||||||
|
} else {
|
||||||
|
executorAddress = IpUtil.getIpPort(port);
|
||||||
|
}
|
||||||
|
|
||||||
registryThread = new Thread(new Runnable() {
|
registryThread = new Thread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
while (!toStop) {
|
while (!toStop) {
|
||||||
try {
|
try {
|
||||||
// generate addredd = ip:port
|
RegistryParam registryParam = new RegistryParam(RegistryConfig.RegistType.EXECUTOR.name(), appName, executorAddress);
|
||||||
String address = null;
|
ReturnT<String> registryResult = AdminApiUtil.callApiFailover(AdminApiUtil.REGISTRY, registryParam);
|
||||||
if (ip != null && ip.trim().length()>0) {
|
logger.info(">>>>>>>>>>> xxl-job registry, RegistryParam:{}, registryResult:{}", new Object[]{registryParam.toString(), registryResult.toString()});
|
||||||
address = ip.trim().concat(":").concat(String.valueOf(port));
|
} catch (Exception e) {
|
||||||
} else {
|
logger.error(">>>>>>>>>>> xxl-job ExecutorRegistryThread Exception:", e);
|
||||||
address = IpUtil.getIpPort(port);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
registHelper.registry(RegistHelper.RegistType.EXECUTOR.name(), appName, address);
|
try {
|
||||||
TimeUnit.SECONDS.sleep(RegistHelper.TIMEOUT);
|
TimeUnit.SECONDS.sleep(RegistryConfig.BEAT_TIMEOUT);
|
||||||
} catch (Exception e) {
|
} catch (InterruptedException e) {
|
||||||
e.printStackTrace();
|
logger.error(e.getMessage(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,11 +131,11 @@ public class JobThread extends Thread{
|
||||||
// callback handler info
|
// callback handler info
|
||||||
if (!toStop) {
|
if (!toStop) {
|
||||||
// commonm
|
// commonm
|
||||||
TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), triggerParam.getLogAddress(), executeResult));
|
TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), executeResult));
|
||||||
} else {
|
} else {
|
||||||
// is killed
|
// is killed
|
||||||
ReturnT<String> stopResult = new ReturnT<String>(ReturnT.FAIL_CODE, stopReason + " [业务运行中,被强制终止]");
|
ReturnT<String> stopResult = new ReturnT<String>(ReturnT.FAIL_CODE, stopReason + " [业务运行中,被强制终止]");
|
||||||
TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), triggerParam.getLogAddress(), stopResult));
|
TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), stopResult));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -156,7 +156,7 @@ public class JobThread extends Thread{
|
||||||
if (triggerParam!=null) {
|
if (triggerParam!=null) {
|
||||||
// is killed
|
// is killed
|
||||||
ReturnT<String> stopResult = new ReturnT<String>(ReturnT.FAIL_CODE, stopReason + " [任务尚未执行,在调度队列中被终止]");
|
ReturnT<String> stopResult = new ReturnT<String>(ReturnT.FAIL_CODE, stopReason + " [任务尚未执行,在调度队列中被终止]");
|
||||||
TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), triggerParam.getLogAddress(), stopResult));
|
TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), stopResult));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
package com.xxl.job.core.thread;
|
package com.xxl.job.core.thread;
|
||||||
|
|
||||||
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.ReturnT;
|
import com.xxl.job.core.biz.model.ReturnT;
|
||||||
import com.xxl.job.core.rpc.netcom.NetComClientProxy;
|
import com.xxl.job.core.util.AdminApiUtil;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
@ -33,21 +32,14 @@ public class TriggerCallbackThread {
|
||||||
try {
|
try {
|
||||||
HandleCallbackParam callback = getInstance().callBackQueue.take();
|
HandleCallbackParam callback = getInstance().callBackQueue.take();
|
||||||
if (callback != null) {
|
if (callback != null) {
|
||||||
for (String address : callback.getLogAddress()) {
|
|
||||||
try {
|
|
||||||
// callback
|
// callback
|
||||||
AdminBiz adminBiz = (AdminBiz) new NetComClientProxy(AdminBiz.class, address).getObject();
|
try {
|
||||||
ReturnT<String> callbackResult = adminBiz.callback(callback);
|
ReturnT<String> callbackResult = AdminApiUtil.callApiFailover(AdminApiUtil.CALLBACK, callback);
|
||||||
|
logger.info(">>>>>>>>>>> xxl-job callback, HandleCallbackParam:{}, callbackResult:{}", new Object[]{callback.toString(), callbackResult.toString()});
|
||||||
logger.info(">>>>>>>>>>> xxl-job callback , CallbackParam:{}, callbackResult:{}", new Object[]{callback.toString(), callbackResult.toString()});
|
|
||||||
if (ReturnT.SUCCESS_CODE == callbackResult.getCode()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error(">>>>>>>>>>> xxl-job TriggerCallbackThread Exception:", e);
|
logger.error(">>>>>>>>>>> xxl-job TriggerCallbackThread Exception:", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error("", e);
|
logger.error("", e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,116 @@
|
||||||
|
package com.xxl.job.core.util;
|
||||||
|
|
||||||
|
import com.xxl.job.core.biz.model.ReturnT;
|
||||||
|
import com.xxl.job.core.executor.XxlJobExecutor;
|
||||||
|
import org.apache.http.HttpEntity;
|
||||||
|
import org.apache.http.HttpResponse;
|
||||||
|
import org.apache.http.client.config.RequestConfig;
|
||||||
|
import org.apache.http.client.methods.HttpPost;
|
||||||
|
import org.apache.http.entity.StringEntity;
|
||||||
|
import org.apache.http.impl.client.CloseableHttpClient;
|
||||||
|
import org.apache.http.impl.client.HttpClients;
|
||||||
|
import org.apache.http.util.EntityUtils;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xuxueli 2017-05-10 21:28:15
|
||||||
|
*/
|
||||||
|
public class AdminApiUtil {
|
||||||
|
private static Logger logger = LoggerFactory.getLogger(AdminApiUtil.class);
|
||||||
|
|
||||||
|
public static final String CALLBACK = "/api/callback";
|
||||||
|
public static final String REGISTRY = "/api/registry";
|
||||||
|
|
||||||
|
public static ReturnT<String> callApiFailover(String subUrl, Object requestObj) throws Exception {
|
||||||
|
|
||||||
|
// admin assress list
|
||||||
|
List<String> adminAddressList = new ArrayList<String>();
|
||||||
|
if (XxlJobExecutor.adminAddresses != null) {
|
||||||
|
for (String adminAddressItem: XxlJobExecutor.adminAddresses.split(",")) {
|
||||||
|
if (adminAddressItem.trim().length()>0 && !adminAddressList.contains(adminAddressItem)) {
|
||||||
|
adminAddressList.add(adminAddressItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (adminAddressList==null || adminAddressList.size()==0) {
|
||||||
|
return ReturnT.FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (String adminAddress: adminAddressList) {
|
||||||
|
ReturnT<String> registryResult = null;
|
||||||
|
try {
|
||||||
|
String apiUrl = adminAddress.concat(subUrl);
|
||||||
|
registryResult = callApi(apiUrl, requestObj);
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
if (registryResult!=null && registryResult.getCode()==ReturnT.SUCCESS_CODE) {
|
||||||
|
return ReturnT.SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ReturnT.FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ReturnT<String> callApi(String finalUrl, Object requestObj) throws Exception {
|
||||||
|
HttpPost httpPost = new HttpPost(finalUrl);
|
||||||
|
CloseableHttpClient httpClient = HttpClients.createDefault();
|
||||||
|
try {
|
||||||
|
|
||||||
|
// timeout
|
||||||
|
RequestConfig requestConfig = RequestConfig.custom()
|
||||||
|
.setConnectionRequestTimeout(10000)
|
||||||
|
.setSocketTimeout(10000)
|
||||||
|
.setConnectTimeout(10000)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
httpPost.setConfig(requestConfig);
|
||||||
|
|
||||||
|
// data
|
||||||
|
if (requestObj != null) {
|
||||||
|
String json = JacksonUtil.writeValueAsString(requestObj);
|
||||||
|
|
||||||
|
StringEntity entity = new StringEntity(json, "utf-8");
|
||||||
|
entity.setContentEncoding("UTF-8");
|
||||||
|
entity.setContentType("application/json");
|
||||||
|
|
||||||
|
httpPost.setEntity(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
// do post
|
||||||
|
HttpResponse response = httpClient.execute(httpPost);
|
||||||
|
HttpEntity entity = response.getEntity();
|
||||||
|
if (null != entity) {
|
||||||
|
if (response.getStatusLine().getStatusCode() != 200) {
|
||||||
|
EntityUtils.consume(entity);
|
||||||
|
return ReturnT.FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
String responseMsg = EntityUtils.toString(entity, "UTF-8");
|
||||||
|
EntityUtils.consume(entity);
|
||||||
|
if (responseMsg!=null && responseMsg.startsWith("{")) {
|
||||||
|
ReturnT<String> result = JacksonUtil.readValue(responseMsg, ReturnT.class);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ReturnT.FAIL;
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("", e);
|
||||||
|
return new ReturnT<String>(ReturnT.FAIL_CODE, e.getMessage());
|
||||||
|
} finally {
|
||||||
|
if (httpPost!=null) {
|
||||||
|
httpPost.releaseConnection();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
httpClient.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,93 @@
|
||||||
|
package com.xxl.job.core.util;
|
||||||
|
|
||||||
|
|
||||||
|
import org.codehaus.jackson.JsonGenerationException;
|
||||||
|
import org.codehaus.jackson.JsonParseException;
|
||||||
|
import org.codehaus.jackson.map.JsonMappingException;
|
||||||
|
import org.codehaus.jackson.map.ObjectMapper;
|
||||||
|
import org.codehaus.jackson.type.TypeReference;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Jackson util
|
||||||
|
*
|
||||||
|
* 1、obj need private and set/get;
|
||||||
|
* 2、do not support inner class;
|
||||||
|
*
|
||||||
|
* @author xuxueli 2015-9-25 18:02:56
|
||||||
|
*/
|
||||||
|
public class JacksonUtil {
|
||||||
|
private final static ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
public static ObjectMapper getInstance() {
|
||||||
|
return objectMapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bean、array、List、Map --> json
|
||||||
|
*
|
||||||
|
* @param obj
|
||||||
|
* @return json string
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static String writeValueAsString(Object obj) {
|
||||||
|
try {
|
||||||
|
return getInstance().writeValueAsString(obj);
|
||||||
|
} catch (JsonGenerationException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (JsonMappingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* string --> bean、Map、List(array)
|
||||||
|
*
|
||||||
|
* @param jsonStr
|
||||||
|
* @param clazz
|
||||||
|
* @return obj
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static <T> T readValue(String jsonStr, Class<T> clazz) {
|
||||||
|
try {
|
||||||
|
return getInstance().readValue(jsonStr, clazz);
|
||||||
|
} catch (JsonParseException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (JsonMappingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
public static <T> T readValueRefer(String jsonStr, Class<T> clazz) {
|
||||||
|
try {
|
||||||
|
return getInstance().readValue(jsonStr, new TypeReference<T>() { });
|
||||||
|
} catch (JsonParseException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (JsonMappingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try {
|
||||||
|
Map<String, String> map = new HashMap<String, String>();
|
||||||
|
map.put("aaa", "111");
|
||||||
|
map.put("bbb", "222");
|
||||||
|
String json = writeValueAsString(map);
|
||||||
|
System.out.println(json);
|
||||||
|
System.out.println(readValue(json, Map.class));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -27,34 +27,13 @@
|
||||||
<property name="ip" value="${xxl.job.executor.ip}" />
|
<property name="ip" value="${xxl.job.executor.ip}" />
|
||||||
<!-- 执行器端口号 -->
|
<!-- 执行器端口号 -->
|
||||||
<property name="port" value="${xxl.job.executor.port}" />
|
<property name="port" value="${xxl.job.executor.port}" />
|
||||||
|
<!-- 执行器AppName,为空则关闭自动注册 -->
|
||||||
<property name="appName" value="${xxl.job.executor.appname}" />
|
<property name="appName" value="${xxl.job.executor.appname}" />
|
||||||
<!-- 执行器注册器 -->
|
<!-- 执行器注册中心地址,为空则关闭自动注册 -->
|
||||||
<property name="registHelper" >
|
<property name="adminAddresses" value="${xxl.job.admin.addresses}" />
|
||||||
<!-- 执行器 "DbRegistHelper" 依赖 "XXL-JOB公共数据源" ;推荐将其抽象为RPC远程服务, 可取消对JDBC的依赖;如不启用执行自动注册功能,也可忽略JDBC配置; -->
|
<!-- 执行器日志路径 -->
|
||||||
<bean class="com.xxl.job.core.registry.impl.DbRegistHelper" >
|
|
||||||
<!-- XXL-JOB公共数据源 -->
|
|
||||||
<property name="dataSource" ref="xxlJobDataSource" />
|
|
||||||
</bean>
|
|
||||||
</property>
|
|
||||||
<property name="logPath" value="${xxl.job.executor.logpath}" />
|
<property name="logPath" value="${xxl.job.executor.logpath}" />
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<!-- ********************************* "XXL-JOB公共数据源" 配置, 仅在启动 "DbRegistHelper" 时才需要, 否则可删除 ********************************* -->
|
|
||||||
|
|
||||||
<!-- 配置03、XXL-JOB公共数据源 -->
|
|
||||||
<bean id="xxlJobDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
|
|
||||||
<property name="driverClass" value="${xxl.job.db.driverClass}" />
|
|
||||||
<property name="jdbcUrl" value="${xxl.job.db.url}" />
|
|
||||||
<property name="user" value="${xxl.job.db.user}" />
|
|
||||||
<property name="password" value="${xxl.job.db.password}" />
|
|
||||||
<property name="initialPoolSize" value="3" />
|
|
||||||
<property name="minPoolSize" value="2" />
|
|
||||||
<property name="maxPoolSize" value="10" />
|
|
||||||
<property name="maxIdleTime" value="60" />
|
|
||||||
<property name="acquireRetryDelay" value="1000" />
|
|
||||||
<property name="acquireRetryAttempts" value="10" />
|
|
||||||
<property name="preferredTestQuery" value="SELECT 1" />
|
|
||||||
</bean>
|
|
||||||
|
|
||||||
|
|
||||||
</beans>
|
</beans>
|
|
@ -1,8 +1,5 @@
|
||||||
### xxl-job db
|
### xxl-job admin address, such as "http://host01:port01/project,http://host02:port02/project"
|
||||||
xxl.job.db.driverClass=com.mysql.jdbc.Driver
|
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
|
||||||
xxl.job.db.url=jdbc:mysql://localhost:3306/xxl-job?useUnicode=true&characterEncoding=UTF-8
|
|
||||||
xxl.job.db.user=root
|
|
||||||
xxl.job.db.password=root_pwd
|
|
||||||
|
|
||||||
### xxl-job executor address
|
### xxl-job executor address
|
||||||
xxl.job.executor.appname=xxl-job-executor-example
|
xxl.job.executor.appname=xxl-job-executor-example
|
||||||
|
|
Loading…
Reference in New Issue