|
@@ -5,19 +5,15 @@ import com.xxl.job.core.biz.ExecutorBiz;
|
|
|
import com.xxl.job.core.biz.impl.ExecutorBizImpl;
|
|
|
import com.xxl.job.core.handler.IJobHandler;
|
|
|
import com.xxl.job.core.handler.annotation.JobHander;
|
|
|
+import com.xxl.job.core.log.XxlJobFileAppender;
|
|
|
import com.xxl.job.core.rpc.netcom.NetComClientProxy;
|
|
|
import com.xxl.job.core.rpc.netcom.NetComServerFactory;
|
|
|
-import com.xxl.job.core.thread.ExecutorRegistryThread;
|
|
|
import com.xxl.job.core.thread.JobThread;
|
|
|
-import com.xxl.job.core.thread.TriggerCallbackThread;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.BeansException;
|
|
|
import org.springframework.context.ApplicationContext;
|
|
|
import org.springframework.context.ApplicationContextAware;
|
|
|
-import org.springframework.context.ApplicationEvent;
|
|
|
-import org.springframework.context.ApplicationListener;
|
|
|
-import org.springframework.context.event.ContextClosedEvent;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
@@ -27,15 +23,16 @@ import java.util.concurrent.ConcurrentHashMap;
|
|
|
/**
|
|
|
* Created by xuxueli on 2016/3/2 21:14.
|
|
|
*/
|
|
|
-public class XxlJobExecutor implements ApplicationContextAware, ApplicationListener {
|
|
|
+public class XxlJobExecutor implements ApplicationContextAware {
|
|
|
private static final Logger logger = LoggerFactory.getLogger(XxlJobExecutor.class);
|
|
|
|
|
|
+ // ---------------------------------- param ------------------------------------
|
|
|
private String ip;
|
|
|
private int port = 9999;
|
|
|
private String appName;
|
|
|
private String adminAddresses;
|
|
|
private String accessToken;
|
|
|
- public static String logPath = "/data/applogs/xxl-job/jobhandler/";
|
|
|
+ private String logPath;
|
|
|
|
|
|
public void setIp(String ip) {
|
|
|
this.ip = ip;
|
|
@@ -56,6 +53,48 @@ public class XxlJobExecutor implements ApplicationContextAware, ApplicationListe
|
|
|
this.logPath = logPath;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ // ---------------------------------- applicationContext ------------------------------------
|
|
|
+ private static ApplicationContext applicationContext;
|
|
|
+ @Override
|
|
|
+ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
|
|
+ this.applicationContext = applicationContext;
|
|
|
+ }
|
|
|
+ public static ApplicationContext getApplicationContext() {
|
|
|
+ return applicationContext;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // ---------------------------------- start + stop ------------------------------------
|
|
|
+ public void start() throws Exception {
|
|
|
+ // init admin-client
|
|
|
+ initAdminBizList(adminAddresses, accessToken);
|
|
|
+
|
|
|
+ // init executor-jobHandlerRepository
|
|
|
+ initJobHandlerRepository(applicationContext);
|
|
|
+
|
|
|
+ // init logpath
|
|
|
+ if (logPath!=null && logPath.trim().length()>0) {
|
|
|
+ XxlJobFileAppender.logPath = logPath;
|
|
|
+ }
|
|
|
+
|
|
|
+ // init executor-server
|
|
|
+ initExecutorServer();
|
|
|
+ }
|
|
|
+ public void destroy(){
|
|
|
+ // destory JobThreadRepository
|
|
|
+ if (JobThreadRepository.size() > 0) {
|
|
|
+ for (Map.Entry<Integer, JobThread> item: JobThreadRepository.entrySet()) {
|
|
|
+ removeJobThread(item.getKey(), "Web容器销毁终止");
|
|
|
+ }
|
|
|
+ JobThreadRepository.clear();
|
|
|
+ }
|
|
|
+
|
|
|
+ // destory executor-server
|
|
|
+ stopExecutorServer();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
// ---------------------------------- admin-client ------------------------------------
|
|
|
private static List<AdminBiz> adminBizList;
|
|
|
private static void initAdminBizList(String adminAddresses, String accessToken) throws Exception {
|
|
@@ -76,49 +115,29 @@ public class XxlJobExecutor implements ApplicationContextAware, ApplicationListe
|
|
|
return adminBizList;
|
|
|
}
|
|
|
|
|
|
- // ---------------------------------- job server ------------------------------------
|
|
|
- private NetComServerFactory serverFactory = new NetComServerFactory();
|
|
|
- public void start() throws Exception {
|
|
|
- // init admin-client
|
|
|
- initAdminBizList(adminAddresses, accessToken);
|
|
|
|
|
|
- // executor start
|
|
|
+ // ---------------------------------- executor-server ------------------------------------
|
|
|
+ private NetComServerFactory serverFactory = new NetComServerFactory();
|
|
|
+ private void initExecutorServer() throws Exception {
|
|
|
NetComServerFactory.putService(ExecutorBiz.class, new ExecutorBizImpl()); // rpc-service, base on jetty
|
|
|
NetComServerFactory.setAccessToken(accessToken);
|
|
|
- serverFactory.start(port, ip, appName);
|
|
|
-
|
|
|
-
|
|
|
- // trigger callback thread start
|
|
|
- TriggerCallbackThread.getInstance().start();
|
|
|
+ serverFactory.start(port, ip, appName); // jetty + registry
|
|
|
}
|
|
|
- public void destroy(){
|
|
|
- // 1、executor registry thread stop
|
|
|
- ExecutorRegistryThread.getInstance().toStop();
|
|
|
-
|
|
|
- // 2、executor stop
|
|
|
- serverFactory.destroy();
|
|
|
-
|
|
|
- // 3、job thread repository destory
|
|
|
- if (JobThreadRepository.size() > 0) {
|
|
|
- for (Map.Entry<Integer, JobThread> item: JobThreadRepository.entrySet()) {
|
|
|
- JobThread jobThread = item.getValue();
|
|
|
- jobThread.toStop("Web容器销毁终止");
|
|
|
- jobThread.interrupt();
|
|
|
-
|
|
|
- }
|
|
|
- JobThreadRepository.clear();
|
|
|
- }
|
|
|
-
|
|
|
- // 4、trigger callback thread stop
|
|
|
- TriggerCallbackThread.getInstance().toStop();
|
|
|
+ private void stopExecutorServer() {
|
|
|
+ serverFactory.destroy(); // jetty + registry + callback
|
|
|
}
|
|
|
|
|
|
- // ---------------------------------- init job handler ------------------------------------
|
|
|
- public static ApplicationContext applicationContext;
|
|
|
- @Override
|
|
|
- public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
|
|
- XxlJobExecutor.applicationContext = applicationContext;
|
|
|
|
|
|
+ // ---------------------------------- job handler repository ------------------------------------
|
|
|
+ private static ConcurrentHashMap<String, IJobHandler> jobHandlerRepository = new ConcurrentHashMap<String, IJobHandler>();
|
|
|
+ public static IJobHandler registJobHandler(String name, IJobHandler jobHandler){
|
|
|
+ logger.info("xxl-job register jobhandler success, name:{}, jobHandler:{}", name, jobHandler);
|
|
|
+ return jobHandlerRepository.put(name, jobHandler);
|
|
|
+ }
|
|
|
+ public static IJobHandler loadJobHandler(String name){
|
|
|
+ return jobHandlerRepository.get(name);
|
|
|
+ }
|
|
|
+ private static void initJobHandlerRepository(ApplicationContext applicationContext){
|
|
|
// init job handler action
|
|
|
Map<String, Object> serviceBeanMap = applicationContext.getBeansWithAnnotation(JobHander.class);
|
|
|
|
|
@@ -134,27 +153,10 @@ public class XxlJobExecutor implements ApplicationContextAware, ApplicationListe
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- // ---------------------------------- destory job executor ------------------------------------
|
|
|
- @Override
|
|
|
- public void onApplicationEvent(ApplicationEvent applicationEvent) {
|
|
|
- if(applicationEvent instanceof ContextClosedEvent){
|
|
|
- // TODO
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
- // ---------------------------------- job handler repository
|
|
|
- private static ConcurrentHashMap<String, IJobHandler> jobHandlerRepository = new ConcurrentHashMap<String, IJobHandler>();
|
|
|
- public static IJobHandler registJobHandler(String name, IJobHandler jobHandler){
|
|
|
- logger.info("xxl-job register jobhandler success, name:{}, jobHandler:{}", name, jobHandler);
|
|
|
- return jobHandlerRepository.put(name, jobHandler);
|
|
|
- }
|
|
|
- public static IJobHandler loadJobHandler(String name){
|
|
|
- return jobHandlerRepository.get(name);
|
|
|
- }
|
|
|
|
|
|
- // ---------------------------------- job thread repository
|
|
|
+ // ---------------------------------- job thread repository ------------------------------------
|
|
|
private static ConcurrentHashMap<Integer, JobThread> JobThreadRepository = new ConcurrentHashMap<Integer, JobThread>();
|
|
|
public static JobThread registJobThread(int jobId, IJobHandler handler, String removeOldReason){
|
|
|
JobThread newJobThread = new JobThread(jobId, handler);
|