Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions xxl-job/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# 依赖库名称
简短地介绍本依赖库做了什么,包含了哪些逻辑。可以突出描述一下创新点。

## 逻辑详情

### 逻辑一

描述逻辑的功能,逻辑的出入参。

### 逻辑二

描述逻辑的功能,逻辑的出入参。

### 逻辑n...

## 使用步骤说明

1. 应用引用依赖库
2. 配置应用配置参数(如果有的话)
3. 逻辑调用示例截图
4. ...

## 应用演示链接

[使用了本依赖库的制品应用链接]
93 changes: 93 additions & 0 deletions xxl-job/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<?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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.9.RELEASE</version><!--与当前制品应用默认版本统一-->
<relativePath/> <!-- lookup parent from repository -->
</parent>

<groupId>com.netease.lowcode</groupId>
<artifactId>xxljob-tool</artifactId>
<version>2.0.0</version>

<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<artifactId>nasl-metadata-collector</artifactId>
<groupId>com.netease.lowcode</groupId>
<version>0.12.0</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>com.netease.lowcode</groupId>
<artifactId>lcap-annotation</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<scope>provided</scope>
</dependency>
<!--制品应用使用Springboot框架,父应用引用了的包,为了防止版本冲突,scope可设置为provided-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.netease.lowcode</groupId>
<artifactId>nasl-metadata-maven-plugin</artifactId>
<version>1.5.1</version>
<configuration>
<jarWithDependencies>false</jarWithDependencies>
<rewriteVersion>true</rewriteVersion>
</configuration>
<executions>
<execution>
<goals>
<goal>archive</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.netease.lowcode.xxljob;

/**
* 依赖库自动扫描类
* @author system
*/
public class LibraryAutoScan {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.netease.lowcode.xxljob.annotation;

import com.netease.lowcode.annotation.LCAPLogicAnnotation;
import com.netease.lowcode.core.annotation.NaslAnnotation;

/**
* xxljob注解
*
* @author xujianping
*/
@NaslAnnotation(
applyTo = {NaslAnnotation.Component.LOGIC}
)
public class XxlJobLogicAnnotation extends LCAPLogicAnnotation {

@NaslAnnotation.Property(
title = "是否开启定时任务",
defaultValue = "false"
)
public Boolean useAnno;

@NaslAnnotation.Property(title = "JobHandler")
public String inputText;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.netease.lowcode.xxljob.annotation;

import com.netease.lowcode.annotation.LCAPAnnotation;
import com.netease.lowcode.annotation.context.LogicContext;
import com.netease.lowcode.annotation.handler.LCAPAnnotationHandlerAdvise;
import com.netease.lowcode.annotation.handler.LCAPLogicAnnotationHandler;

import java.util.List;

/**
* 防重放逻辑处理器
*
* @author xujianping
*/
public class XxlJobLogicAnnotationHandler implements LCAPLogicAnnotationHandler<XxlJobLogicAnnotation> {

@Override
public LCAPAnnotationHandlerAdvise[] advises() {
return new LCAPAnnotationHandlerAdvise[]{LCAPAnnotationHandlerAdvise.BEFORE};
}

@Override
public Class<? extends LCAPAnnotation> consume() {
return XxlJobLogicAnnotation.class;
}

@Override
public Boolean report(List<LogicContext<XxlJobLogicAnnotation>> logicContexts) {
return true;
}

@Override
public Object handle(Object[] args, Object result, LogicContext<XxlJobLogicAnnotation> context) {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
package com.netease.lowcode.xxljob.config;

import com.netease.lowcode.annotation.context.LogicContext;
import com.netease.lowcode.xxljob.config.helper.JobConfigHelper;
import com.netease.lowcode.xxljob.model.JobHandlerInterfaceModel;
import com.netease.lowcode.xxljob.task.InterfaceJobHandler;
import com.xxl.job.core.executor.XxlJobExecutor;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Configuration
public class JobHandlerConfig implements ApplicationRunner {

private static final Logger log = LoggerFactory.getLogger("LCAP_EXTENSION_LOGGER");

@Resource
private ApplicationContext applicationContext;
@Resource
private XxlJobConfig xxlJobConfig;

@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
XxlJobSpringExecutor executor = new XxlJobSpringExecutor();
// 配置执行器参数
String adminAddress = xxlJobConfig.getAdminAddress();
if (StringUtils.isNotEmpty(adminAddress)) {
executor.setAdminAddresses(adminAddress.replace("\u200B", ""));
}
if (StringUtils.isNotEmpty(xxlJobConfig.getAppName())) {
executor.setAppname(xxlJobConfig.getAppName());
}
if (StringUtils.isNotEmpty(xxlJobConfig.getAddress())) {
executor.setAddress(xxlJobConfig.getAddress());
}
if (StringUtils.isNotEmpty(xxlJobConfig.getAccessToken())) {
executor.setAccessToken(xxlJobConfig.getAccessToken());
}
if (StringUtils.isNotEmpty(xxlJobConfig.getIp())) {
executor.setIp(xxlJobConfig.getIp());
}
if (StringUtils.isNotEmpty(xxlJobConfig.getLogPath())) {
executor.setLogPath(xxlJobConfig.getLogPath());
}
if (StringUtils.isNotEmpty(xxlJobConfig.getLogRetentionDays())) {
executor.setLogRetentionDays(Integer.parseInt(xxlJobConfig.getLogRetentionDays()));
}
if (StringUtils.isNotEmpty(xxlJobConfig.getPort())) {
executor.setPort(Integer.parseInt(xxlJobConfig.getPort()));
}
return executor;
}

/**
* 初始化并注册所有JobHandler
*/
// @PostConstruct
public void initJobHandlers() {
try {
// 获取xxlJob注解和logic的关系
List<LogicContext> logicContexts = JobConfigHelper.listJobContext();
if (CollectionUtils.isEmpty(logicContexts)) {
return;
}

List<JobHandlerInterfaceModel> jobModelList = logicContexts.stream()
.filter(e -> {
Map<String, Object> annotationProperties = e.getAnnotationProperties();
if (MapUtils.isEmpty(annotationProperties)) {
return false;
}

String useAnno = String.valueOf(annotationProperties.get("useAnno"));
String jobHandler = String.valueOf(annotationProperties.get("inputText"));
// 开启了开关,并设置了JobHandler才被判定开启了定时任务
if ("true".equals(useAnno) && StringUtils.isNotEmpty(jobHandler)) {
return true;
}
return false;
}).map(e -> {
Map<String, Object> annotationProperties = e.getAnnotationProperties();
JobHandlerInterfaceModel model = new JobHandlerInterfaceModel();
model.setJobHandler(String.valueOf(annotationProperties.get("inputText")));
model.setLogicName(e.getLogicName());
return model;
}).collect(Collectors.toList());

// 为每个配置创建JobHandler并注册
for (JobHandlerInterfaceModel config : jobModelList) {
String handlerName = config.getJobHandler();
// 创建处理器
InterfaceJobHandler handler = new InterfaceJobHandler(applicationContext, jobModelList) {
@Override
public String getHandlerName() {
return handlerName;
}
};

XxlJobSpringExecutor.registJobHandler(handlerName, handler);
log.info("Successfully registered job handler: {}", handlerName);
}
} catch (Exception e) {
log.error("Failed to initialize job handlers", e);
}
}

@Override
public void run(ApplicationArguments args) throws Exception {
initJobHandlers();
}
}
Loading
Loading