Pre Merge pull request !27 from 刘西东/master
commit
97fa5c5d1f
@ -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,44 @@
|
||||
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 org.noear.solon.cloud.annotation.CloudJob;
|
||||
import com.xxl.job.solon.service.CloudJobServiceImpl;
|
||||
import org.noear.solon.cloud.impl.CloudJobBuilder;
|
||||
import org.noear.solon.cloud.impl.CloudJobExtractor;
|
||||
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;
|
||||
}
|
||||
|
||||
//register Job Service
|
||||
CloudManager.register(CloudJobServiceImpl.instance);
|
||||
|
||||
//add extractor for bean method
|
||||
Aop.context().beanExtractorAdd(XxlJob.class, new XxlJobExtractor());
|
||||
Aop.context().beanExtractorAdd(CloudJob.class, new CloudJobExtractor());
|
||||
Aop.context().beanBuilderAdd(CloudJob.class,new CloudJobBuilder());
|
||||
|
||||
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