Pre Merge pull request !28 from 刘西东/master
commit
ea13922f18
@ -0,0 +1,12 @@
|
|||||||
|
package com.xxl.job.executor;
|
||||||
|
|
||||||
|
import org.noear.solon.Solon;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author noear 2021/5/25 created
|
||||||
|
*/
|
||||||
|
public class XxlJobExecutorApp {
|
||||||
|
public static void main(String[] args){
|
||||||
|
Solon.start(XxlJobExecutorApp.class, args);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.xxl.job.executor.controller;//package com.xxl.job.executor.mvc.controller;
|
||||||
|
|
||||||
|
|
||||||
|
//import org.noear.solon.annotation.Controller;
|
||||||
|
//import org.noear.solon.annotation.Mapping;
|
||||||
|
//
|
||||||
|
//@Controller
|
||||||
|
//public class IndexController {
|
||||||
|
// @Mapping("/")
|
||||||
|
// public String index() {
|
||||||
|
// return "xxl job executor running.";
|
||||||
|
// }
|
||||||
|
//}
|
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration debug="false" scan="true" scanPeriod="1 seconds">
|
||||||
|
|
||||||
|
<contextName>logback</contextName>
|
||||||
|
<property name="log.path" value="/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log"/>
|
||||||
|
|
||||||
|
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="info">
|
||||||
|
<appender-ref ref="console"/>
|
||||||
|
</root>
|
||||||
|
|
||||||
|
</configuration>
|
@ -0,0 +1,36 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.xuxueli</groupId>
|
||||||
|
<artifactId>xxl-job</artifactId>
|
||||||
|
<version>2.3.0</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>xxl-job-solon-plugin</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.xuxueli</groupId>
|
||||||
|
<artifactId>xxl-job-core</artifactId>
|
||||||
|
<version>${project.parent.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.noear</groupId>
|
||||||
|
<artifactId>solon.cloud</artifactId>
|
||||||
|
<version>${solon.version}</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.noear</groupId>
|
||||||
|
<artifactId>solon.logging.impl</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
@ -0,0 +1,40 @@
|
|||||||
|
package com.xxl.job.solon;
|
||||||
|
|
||||||
|
import com.xxl.job.core.executor.XxlJobExecutor;
|
||||||
|
import com.xxl.job.core.handler.annotation.XxlJob;
|
||||||
|
import org.noear.solon.SolonApp;
|
||||||
|
import org.noear.solon.cloud.CloudManager;
|
||||||
|
import com.xxl.job.solon.service.CloudJobServiceImpl;
|
||||||
|
import org.noear.solon.core.Aop;
|
||||||
|
import org.noear.solon.core.Plugin;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author noear
|
||||||
|
* @since 1.4
|
||||||
|
*/
|
||||||
|
public class XPluginImp implements Plugin {
|
||||||
|
@Override
|
||||||
|
public void start(SolonApp app) {
|
||||||
|
if (XxljobProps.instance.getJobEnable() == false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//注册Job服务
|
||||||
|
CloudManager.register(CloudJobServiceImpl.instance);
|
||||||
|
|
||||||
|
//注册构建器和提取器
|
||||||
|
Aop.context().beanExtractorAdd(XxlJob.class, new XxlJobExtractor());
|
||||||
|
|
||||||
|
//构建自动配置
|
||||||
|
Aop.context().beanMake(XxlJobAutoConfig.class);
|
||||||
|
|
||||||
|
Aop.beanOnloaded(() -> {
|
||||||
|
try {
|
||||||
|
XxlJobExecutor executor = Aop.get(XxlJobExecutor.class);
|
||||||
|
executor.start();
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,93 @@
|
|||||||
|
package com.xxl.job.solon;
|
||||||
|
|
||||||
|
import com.xxl.job.core.executor.XxlJobExecutor;
|
||||||
|
import org.noear.solon.Solon;
|
||||||
|
import org.noear.solon.Utils;
|
||||||
|
import org.noear.solon.annotation.Bean;
|
||||||
|
import org.noear.solon.annotation.Configuration;
|
||||||
|
import org.noear.solon.annotation.Inject;
|
||||||
|
import org.noear.solon.cloud.utils.LocalUtils;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* auto config XxlJobExecutor
|
||||||
|
*
|
||||||
|
* @author noear
|
||||||
|
* @since 1.4
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
public class XxlJobAutoConfig {
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(XxlJobAutoConfig.class);
|
||||||
|
|
||||||
|
@Inject("${xxl.job.admin.addresses}")
|
||||||
|
private String adminAddresses;
|
||||||
|
|
||||||
|
@Inject("${xxl.job.accessToken}")
|
||||||
|
private String accessToken;
|
||||||
|
|
||||||
|
@Inject("${xxl.job.executor.appname}")
|
||||||
|
private String appname;
|
||||||
|
|
||||||
|
@Inject("${xxl.job.executor.address}")
|
||||||
|
private String address;
|
||||||
|
|
||||||
|
@Inject("${xxl.job.executor.ip}")
|
||||||
|
private String ip;
|
||||||
|
|
||||||
|
@Inject("${xxl.job.executor.port}")
|
||||||
|
private int port;
|
||||||
|
|
||||||
|
@Inject("${xxl.job.executor.logpath}")
|
||||||
|
private String logPath;
|
||||||
|
|
||||||
|
@Inject("${xxl.job.executor.logretentiondays}")
|
||||||
|
private int logRetentionDays;
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public XxlJobExecutor xxlJobExecutor() {
|
||||||
|
logger.info(">>>>>>>>>>> xxl-job config init.");
|
||||||
|
|
||||||
|
if(Utils.isEmpty(adminAddresses)){
|
||||||
|
adminAddresses = XxljobProps.instance.getJobServer();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Utils.isEmpty(appname)){
|
||||||
|
appname = Solon.cfg().appName();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Utils.isEmpty(ip)){
|
||||||
|
ip = LocalUtils.getLocalAddress();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(port < 1000){
|
||||||
|
port = 9999;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(logRetentionDays < 1){
|
||||||
|
logRetentionDays = 30;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Utils.isEmpty(logPath)){
|
||||||
|
logPath = "/data/applogs/xxl-job/jobhandler";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Utils.isEmpty(accessToken)) {
|
||||||
|
accessToken = XxljobProps.instance.getPassword();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
XxlJobExecutor executor = new XxlJobExecutor();
|
||||||
|
|
||||||
|
executor.setAdminAddresses(adminAddresses);
|
||||||
|
executor.setAppname(appname);
|
||||||
|
executor.setAddress(address);
|
||||||
|
executor.setIp(ip);
|
||||||
|
executor.setPort(port);
|
||||||
|
executor.setAccessToken(accessToken);
|
||||||
|
executor.setLogPath(logPath);
|
||||||
|
executor.setLogRetentionDays(logRetentionDays);
|
||||||
|
|
||||||
|
return executor;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
package com.xxl.job.solon;
|
||||||
|
|
||||||
|
import com.xxl.job.core.executor.XxlJobExecutor;
|
||||||
|
import com.xxl.job.core.handler.annotation.XxlJob;
|
||||||
|
import com.xxl.job.core.handler.impl.MethodJobHandler;
|
||||||
|
import org.noear.solon.core.BeanExtractor;
|
||||||
|
import org.noear.solon.core.BeanWrap;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author noear
|
||||||
|
* @since 1.4
|
||||||
|
*/
|
||||||
|
class XxlJobExtractor implements BeanExtractor<XxlJob> {
|
||||||
|
@Override
|
||||||
|
public void doExtract(BeanWrap bw, Method method, XxlJob anno) {
|
||||||
|
String name = anno.value();
|
||||||
|
|
||||||
|
if (name.trim().length() == 0) {
|
||||||
|
throw new RuntimeException("xxl-job method-jobhandler name invalid, for[" + bw.clz() + "#" + method.getName() + "] .");
|
||||||
|
}
|
||||||
|
if (XxlJobExecutor.loadJobHandler(name) != null) {
|
||||||
|
throw new RuntimeException("xxl-job jobhandler[" + name + "] naming conflicts.");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
method.setAccessible(true);
|
||||||
|
|
||||||
|
// init and destory
|
||||||
|
Method initMethod = null;
|
||||||
|
Method destroyMethod = null;
|
||||||
|
|
||||||
|
if (anno.init().trim().length() > 0) {
|
||||||
|
try {
|
||||||
|
initMethod = bw.clz().getDeclaredMethod(anno.init());
|
||||||
|
initMethod.setAccessible(true);
|
||||||
|
} catch (NoSuchMethodException e) {
|
||||||
|
throw new RuntimeException("xxl-job method-jobhandler initMethod invalid, for[" + bw.clz() + "#" + method.getName() + "] .");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (anno.destroy().trim().length() > 0) {
|
||||||
|
try {
|
||||||
|
destroyMethod = bw.clz().getDeclaredMethod(anno.destroy());
|
||||||
|
destroyMethod.setAccessible(true);
|
||||||
|
} catch (NoSuchMethodException e) {
|
||||||
|
throw new RuntimeException("xxl-job method-jobhandler destroyMethod invalid, for[" + bw.clz() + "#" + method.getName() + "] .");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// registry jobhandler
|
||||||
|
XxlJobExecutor.registJobHandler(name, new MethodJobHandler(bw.raw(), method, initMethod, destroyMethod));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package com.xxl.job.solon;
|
||||||
|
|
||||||
|
import org.noear.solon.cloud.CloudProps;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author noear 2021/5/25 created
|
||||||
|
*/
|
||||||
|
public class XxljobProps {
|
||||||
|
public static final CloudProps instance = new CloudProps("xxljob");
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
package com.xxl.job.solon.service;
|
||||||
|
|
||||||
|
import com.xxl.job.core.handler.IJobHandler;
|
||||||
|
import org.noear.solon.core.handle.Context;
|
||||||
|
import org.noear.solon.core.handle.ContextEmpty;
|
||||||
|
import org.noear.solon.core.handle.ContextUtil;
|
||||||
|
import org.noear.solon.core.handle.Handler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author noear
|
||||||
|
* @since 1.4
|
||||||
|
*/
|
||||||
|
class CloudJobHanderProxy extends IJobHandler {
|
||||||
|
Handler real;
|
||||||
|
|
||||||
|
public CloudJobHanderProxy(Handler handler) {
|
||||||
|
real = handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute() throws Exception {
|
||||||
|
Context ctx = Context.current();
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (ctx == null) {
|
||||||
|
ctx = new ContextEmpty();
|
||||||
|
try {
|
||||||
|
ContextUtil.currentSet(ctx);
|
||||||
|
real.handle(ctx);
|
||||||
|
} finally {
|
||||||
|
ContextUtil.currentSet(ctx);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
real.handle(ctx);
|
||||||
|
}
|
||||||
|
} catch (Throwable e) {
|
||||||
|
if (e instanceof Exception) {
|
||||||
|
throw (Exception) e;
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package com.xxl.job.solon.service;
|
||||||
|
|
||||||
|
import com.xxl.job.core.executor.XxlJobExecutor;
|
||||||
|
import org.noear.solon.cloud.service.CloudJobService;
|
||||||
|
import org.noear.solon.core.handle.Handler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author noear
|
||||||
|
* @since 1.4
|
||||||
|
*/
|
||||||
|
public class CloudJobServiceImpl implements CloudJobService {
|
||||||
|
public static final CloudJobService instance = new CloudJobServiceImpl();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean register(String name, String description, Handler handler) {
|
||||||
|
XxlJobExecutor.registJobHandler(name, new CloudJobHanderProxy(handler));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isRegistered(String name) {
|
||||||
|
return XxlJobExecutor.loadJobHandler(name) != null;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
solon.plugin=com.xxl.job.solon.XPluginImp
|
Loading…
Reference in new issue