package com.xxl.job.core.executor.impl;
|
|
import com.xxl.job.core.executor.XxlJobExecutor;
|
import com.xxl.job.core.glue.GlueFactory;
|
import com.xxl.job.core.handler.IJobHandler;
|
import com.xxl.job.core.handler.annotation.JobHandler;
|
import org.springframework.beans.BeansException;
|
import org.springframework.context.ApplicationContext;
|
import org.springframework.context.ApplicationContextAware;
|
|
import java.util.Map;
|
|
/**
|
* xxl-job executor (for spring)
|
*
|
* @author xuxueli 2018-11-01 09:24:52
|
*/
|
public class XxlJobSpringExecutor extends XxlJobExecutor implements ApplicationContextAware {
|
|
|
@Override
|
public void start() throws Exception {
|
|
// init JobHandler Repository
|
initJobHandlerRepository(applicationContext);
|
|
// refresh GlueFactory
|
GlueFactory.refreshInstance(1);
|
|
|
// super start
|
super.start();
|
}
|
|
private void initJobHandlerRepository(ApplicationContext applicationContext){
|
if (applicationContext == null) {
|
return;
|
}
|
|
// init job handler action
|
Map<String, Object> serviceBeanMap = applicationContext.getBeansWithAnnotation(JobHandler.class);
|
|
if (serviceBeanMap!=null && serviceBeanMap.size()>0) {
|
for (Object serviceBean : serviceBeanMap.values()) {
|
if (serviceBean instanceof IJobHandler){
|
String name = serviceBean.getClass().getAnnotation(JobHandler.class).value();
|
IJobHandler handler = (IJobHandler) serviceBean;
|
if (loadJobHandler(name) != null) {
|
throw new RuntimeException("xxl-job jobhandler naming conflicts.");
|
}
|
registJobHandler(name, handler);
|
}
|
}
|
}
|
}
|
|
// ---------------------- applicationContext ----------------------
|
private static ApplicationContext applicationContext;
|
@Override
|
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
this.applicationContext = applicationContext;
|
}
|
public static ApplicationContext getApplicationContext() {
|
return applicationContext;
|
}
|
|
}
|