mirror of
https://github.com/PowerJob/PowerJob.git
synced 2025-07-17 00:00:04 +08:00
Merge branch 'v3.2.1' into jenkins_auto_build
This commit is contained in:
commit
8f75f956e8
3
pom.xml
3
pom.xml
@ -40,8 +40,9 @@
|
|||||||
<module>powerjob-server</module>
|
<module>powerjob-server</module>
|
||||||
<module>powerjob-common</module>
|
<module>powerjob-common</module>
|
||||||
<module>powerjob-client</module>
|
<module>powerjob-client</module>
|
||||||
<module>powerjob-worker-samples</module>
|
|
||||||
<module>powerjob-worker-agent</module>
|
<module>powerjob-worker-agent</module>
|
||||||
|
<module>powerjob-worker-spring-boot-starter</module>
|
||||||
|
<module>powerjob-worker-samples</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
@ -24,7 +24,6 @@
|
|||||||
<mvn.invoker.version>3.0.1</mvn.invoker.version>
|
<mvn.invoker.version>3.0.1</mvn.invoker.version>
|
||||||
<commons.net.version>3.6</commons.net.version>
|
<commons.net.version>3.6</commons.net.version>
|
||||||
<fastjson.version>1.2.68</fastjson.version>
|
<fastjson.version>1.2.68</fastjson.version>
|
||||||
<druid.starter.version>1.1.23</druid.starter.version>
|
|
||||||
|
|
||||||
<!-- 部署时跳过该module -->
|
<!-- 部署时跳过该module -->
|
||||||
<maven.deploy.skip>true</maven.deploy.skip>
|
<maven.deploy.skip>true</maven.deploy.skip>
|
||||||
@ -79,18 +78,6 @@
|
|||||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||||
<version>${springboot.version}</version>
|
<version>${springboot.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.alibaba</groupId>
|
|
||||||
<artifactId>druid-spring-boot-starter</artifactId>
|
|
||||||
<version>${druid.starter.version}</version>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-autoconfigure</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-data-mongodb</artifactId>
|
<artifactId>spring-boot-starter-data-mongodb</artifactId>
|
||||||
|
@ -184,7 +184,6 @@ public class HashedWheelTimer implements Timer {
|
|||||||
log.warn("[HashedWheelTimer] timerFuture.totalTicks < currentTick, please fix the bug");
|
log.warn("[HashedWheelTimer] timerFuture.totalTicks < currentTick, please fix the bug");
|
||||||
}
|
}
|
||||||
|
|
||||||
timerFuture.status = HashedWheelTimerFuture.RUNNING;
|
|
||||||
try {
|
try {
|
||||||
// 提交执行
|
// 提交执行
|
||||||
runTask(timerFuture);
|
runTask(timerFuture);
|
||||||
@ -202,6 +201,7 @@ public class HashedWheelTimer implements Timer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void runTask(HashedWheelTimerFuture timerFuture) {
|
private void runTask(HashedWheelTimerFuture timerFuture) {
|
||||||
|
timerFuture.status = HashedWheelTimerFuture.RUNNING;
|
||||||
if (taskProcessPool == null) {
|
if (taskProcessPool == null) {
|
||||||
timerFuture.timerTask.run();
|
timerFuture.timerTask.run();
|
||||||
}else {
|
}else {
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
package com.github.kfcfans.powerjob.server.persistence.config;
|
package com.github.kfcfans.powerjob.server.persistence.config;
|
||||||
|
|
||||||
import com.alibaba.druid.pool.DruidDataSource;
|
import com.zaxxer.hikari.HikariConfig;
|
||||||
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
|
import com.zaxxer.hikari.HikariDataSource;
|
||||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.boot.jdbc.DataSourceBuilder;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.Primary;
|
import org.springframework.context.annotation.Primary;
|
||||||
@ -20,28 +21,26 @@ public class MultiDatasourceConfig {
|
|||||||
|
|
||||||
private static final String H2_DRIVER_CLASS_NAME = "org.h2.Driver";
|
private static final String H2_DRIVER_CLASS_NAME = "org.h2.Driver";
|
||||||
private static final String H2_JDBC_URL = "jdbc:h2:file:~/powerjob-server/h2/powerjob_server_db";
|
private static final String H2_JDBC_URL = "jdbc:h2:file:~/powerjob-server/h2/powerjob_server_db";
|
||||||
private static final int H2_INITIAL_SIZE = 4;
|
|
||||||
private static final int H2_MIN_SIZE = 4;
|
private static final int H2_MIN_SIZE = 4;
|
||||||
private static final int H2_MAX_ACTIVE_SIZE = 10;
|
private static final int H2_MAX_ACTIVE_SIZE = 10;
|
||||||
private static final String H2_DATASOURCE_NAME = "localDatasource";
|
|
||||||
|
|
||||||
@Primary
|
@Primary
|
||||||
@Bean("omsCoreDatasource")
|
@Bean("omsCoreDatasource")
|
||||||
@ConfigurationProperties(prefix = "spring.datasource.druid")
|
@ConfigurationProperties(prefix = "spring.datasource.core")
|
||||||
public DataSource initOmsCoreDatasource() {
|
public DataSource initOmsCoreDatasource() {
|
||||||
return DruidDataSourceBuilder.create().build();
|
return DataSourceBuilder.create().build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean("omsLocalDatasource")
|
@Bean("omsLocalDatasource")
|
||||||
public DataSource initOmsLocalDatasource() {
|
public DataSource initOmsLocalDatasource() {
|
||||||
DruidDataSource ds = new DruidDataSource();
|
HikariConfig config = new HikariConfig();
|
||||||
ds.setDriverClassName(H2_DRIVER_CLASS_NAME);
|
config.setDriverClassName(H2_DRIVER_CLASS_NAME);
|
||||||
ds.setUrl(H2_JDBC_URL);
|
config.setJdbcUrl(H2_JDBC_URL);
|
||||||
ds.setInitialSize(H2_INITIAL_SIZE);
|
config.setAutoCommit(true);
|
||||||
ds.setMinIdle(H2_MIN_SIZE);
|
// 池中最小空闲连接数量
|
||||||
ds.setMaxActive(H2_MAX_ACTIVE_SIZE);
|
config.setMinimumIdle(H2_MIN_SIZE);
|
||||||
ds.setName(H2_DATASOURCE_NAME);
|
// 池中最大连接数量
|
||||||
ds.setTestWhileIdle(false);
|
config.setMaximumPoolSize(H2_MAX_ACTIVE_SIZE);
|
||||||
return ds;
|
return new HikariDataSource(config);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -78,13 +78,15 @@ public class DispatchService {
|
|||||||
long current = System.currentTimeMillis();
|
long current = System.currentTimeMillis();
|
||||||
|
|
||||||
// 0 代表不限制在线任务,还能省去一次 DB 查询
|
// 0 代表不限制在线任务,还能省去一次 DB 查询
|
||||||
if (jobInfo.getMaxInstanceNum() > 0) {
|
Integer maxInstanceNum = jobInfo.getMaxInstanceNum();
|
||||||
|
if (maxInstanceNum > 0) {
|
||||||
|
|
||||||
|
// 这个 runningInstanceCount 已经包含了本 instance
|
||||||
long runningInstanceCount = instanceInfoRepository.countByJobIdAndStatusIn(jobId, Lists.newArrayList(WAITING_WORKER_RECEIVE.getV(), RUNNING.getV()));
|
long runningInstanceCount = instanceInfoRepository.countByJobIdAndStatusIn(jobId, Lists.newArrayList(WAITING_WORKER_RECEIVE.getV(), RUNNING.getV()));
|
||||||
// 超出最大同时运行限制,不执行调度
|
// 超出最大同时运行限制,不执行调度
|
||||||
if (runningInstanceCount > jobInfo.getMaxInstanceNum()) {
|
if (runningInstanceCount > maxInstanceNum) {
|
||||||
String result = String.format(SystemInstanceResult.TOO_MUCH_INSTANCE, runningInstanceCount, jobInfo.getMaxInstanceNum());
|
String result = String.format(SystemInstanceResult.TOO_MUCH_INSTANCE, runningInstanceCount, maxInstanceNum);
|
||||||
log.warn("[Dispatcher-{}|{}] cancel dispatch job due to too much instance(num={}) is running.", jobId, instanceId, runningInstanceCount);
|
log.warn("[Dispatcher-{}|{}] cancel dispatch job due to too much instance is running ({} > {}).", jobId, instanceId, runningInstanceCount, maxInstanceNum);
|
||||||
instanceInfoRepository.update4TriggerFailed(instanceId, FAILED.getV(), currentRunningTimes, current, current, RemoteConstant.EMPTY_ADDRESS, result, dbInstanceParams, now);
|
instanceInfoRepository.update4TriggerFailed(instanceId, FAILED.getV(), currentRunningTimes, current, current, RemoteConstant.EMPTY_ADDRESS, result, dbInstanceParams, now);
|
||||||
|
|
||||||
instanceManager.processFinishedInstance(instanceId, wfInstanceId, FAILED, result);
|
instanceManager.processFinishedInstance(instanceId, wfInstanceId, FAILED, result);
|
||||||
|
@ -204,7 +204,7 @@ public class WorkflowInstanceManager {
|
|||||||
node.setStatus(status.getV());
|
node.setStatus(status.getV());
|
||||||
node.setResult(result);
|
node.setResult(result);
|
||||||
|
|
||||||
log.debug("[Workflow-{}|{}] node(jobId={},instanceId={}) finished in workflowInstance, status={},result={}", wfId, wfInstanceId, node.getJobId(), instanceId, status.name(), result);
|
log.info("[Workflow-{}|{}] node(jobId={},instanceId={}) finished in workflowInstance, status={},result={}", wfId, wfInstanceId, node.getJobId(), instanceId, status.name(), result);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (InstanceStatus.generalizedRunningStatus.contains(node.getStatus())) {
|
if (InstanceStatus.generalizedRunningStatus.contains(node.getStatus())) {
|
||||||
|
@ -41,6 +41,7 @@ public class AppInfoController {
|
|||||||
@PostMapping("/save")
|
@PostMapping("/save")
|
||||||
public ResultDTO<Void> saveAppInfo(@RequestBody ModifyAppInfoRequest req) {
|
public ResultDTO<Void> saveAppInfo(@RequestBody ModifyAppInfoRequest req) {
|
||||||
|
|
||||||
|
req.valid();
|
||||||
AppInfoDO appInfoDO;
|
AppInfoDO appInfoDO;
|
||||||
|
|
||||||
Long id = req.getId();
|
Long id = req.getId();
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
package com.github.kfcfans.powerjob.server.web.request;
|
package com.github.kfcfans.powerjob.server.web.request;
|
||||||
|
|
||||||
|
import com.github.kfcfans.powerjob.common.OmsException;
|
||||||
|
import com.github.kfcfans.powerjob.common.utils.CommonUtils;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改应用信息请求
|
* 修改应用信息请求
|
||||||
@ -14,4 +17,11 @@ public class ModifyAppInfoRequest {
|
|||||||
private Long id;
|
private Long id;
|
||||||
private String appName;
|
private String appName;
|
||||||
private String password;
|
private String password;
|
||||||
|
|
||||||
|
public void valid() {
|
||||||
|
CommonUtils.requireNonNull(appName, "appName can't be empty");
|
||||||
|
if (StringUtils.containsWhitespace(appName)) {
|
||||||
|
throw new OmsException("appName can't contains white space!");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,17 +2,15 @@ oms.env=DAILY
|
|||||||
logging.config=classpath:logback-dev.xml
|
logging.config=classpath:logback-dev.xml
|
||||||
|
|
||||||
####### 外部数据库配置(需要用户更改为自己的数据库配置) #######
|
####### 外部数据库配置(需要用户更改为自己的数据库配置) #######
|
||||||
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
|
spring.datasource.core.driver-class-name=com.mysql.cj.jdbc.Driver
|
||||||
spring.datasource.druid.url=jdbc:mysql://remotehost:3306/powerjob-daily?useUnicode=true&characterEncoding=UTF-8
|
spring.datasource.core.jdbc-url=jdbc:mysql://localhost:3306/powerjob-daily?useUnicode=true&characterEncoding=UTF-8
|
||||||
spring.datasource.druid.username=root
|
spring.datasource.core.username=root
|
||||||
spring.datasource.druid.password=No1Bug2Please3!
|
spring.datasource.core.password=No1Bug2Please3!
|
||||||
spring.datasource.druid.initial-size=5
|
spring.datasource.core.hikari.maximum-pool-size=20
|
||||||
spring.datasource.druid.max-active=10
|
spring.datasource.core.hikari.minimum-idle=5
|
||||||
spring.datasource.druid.test-while-idle=false
|
|
||||||
spring.datasource.druid.name=remoteDatasource
|
|
||||||
|
|
||||||
####### mongoDB配置,非核心依赖,可移除 #######
|
####### mongoDB配置,非核心依赖,可移除 #######
|
||||||
spring.data.mongodb.uri=mongodb://remotehost:27017/powerjob-daily
|
spring.data.mongodb.uri=mongodb://localhost:27017/powerjob-daily
|
||||||
|
|
||||||
####### 邮件配置(启用邮件报警则需要) #######
|
####### 邮件配置(启用邮件报警则需要) #######
|
||||||
spring.mail.host=smtp.163.com
|
spring.mail.host=smtp.163.com
|
||||||
|
@ -2,14 +2,12 @@ oms.env=PRE
|
|||||||
logging.config=classpath:logback-product.xml
|
logging.config=classpath:logback-product.xml
|
||||||
|
|
||||||
####### 数据库配置 #######
|
####### 数据库配置 #######
|
||||||
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
|
spring.datasource.core.driver-class-name=com.mysql.cj.jdbc.Driver
|
||||||
spring.datasource.druid.url=jdbc:mysql://remotehost:3306/powerjob-pre?useUnicode=true&characterEncoding=UTF-8
|
spring.datasource.core.jdbc-url=jdbc:mysql://remotehost:3306/powerjob-pre?useUnicode=true&characterEncoding=UTF-8
|
||||||
spring.datasource.druid.username=root
|
spring.datasource.core.username=root
|
||||||
spring.datasource.druid.password=No1Bug2Please3!
|
spring.datasource.core.password=No1Bug2Please3!
|
||||||
spring.datasource.druid.initial-size=5
|
spring.datasource.core.hikari.maximum-pool-size=20
|
||||||
spring.datasource.druid.max-active=20
|
spring.datasource.core.hikari.minimum-idle=5
|
||||||
spring.datasource.druid.test-while-idle=false
|
|
||||||
spring.datasource.druid.name=remoteDatasource
|
|
||||||
|
|
||||||
####### mongoDB配置,非核心依赖,可移除 #######
|
####### mongoDB配置,非核心依赖,可移除 #######
|
||||||
spring.data.mongodb.uri=mongodb://remotehost:27017/powerjob-pre
|
spring.data.mongodb.uri=mongodb://remotehost:27017/powerjob-pre
|
||||||
|
@ -2,14 +2,12 @@ oms.env=PRODUCT
|
|||||||
logging.config=classpath:logback-product.xml
|
logging.config=classpath:logback-product.xml
|
||||||
|
|
||||||
####### 数据库配置 #######
|
####### 数据库配置 #######
|
||||||
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
|
spring.datasource.core.driver-class-name=com.mysql.cj.jdbc.Driver
|
||||||
spring.datasource.druid.url=jdbc:mysql://localhost:3306/powerjob-product?useUnicode=true&characterEncoding=UTF-8
|
spring.datasource.core.jdbc-url=jdbc:mysql://localhost:3306/powerjob-product?useUnicode=true&characterEncoding=UTF-8
|
||||||
spring.datasource.druid.username=root
|
spring.datasource.core.username=root
|
||||||
spring.datasource.druid.password=No1Bug2Please3!
|
spring.datasource.core.password=No1Bug2Please3!
|
||||||
spring.datasource.druid.initial-size=5
|
spring.datasource.core.hikari.maximum-pool-size=20
|
||||||
spring.datasource.druid.max-active=20
|
spring.datasource.core.hikari.minimum-idle=5
|
||||||
spring.datasource.druid.test-while-idle=false
|
|
||||||
spring.datasource.druid.name=remoteDatasource
|
|
||||||
|
|
||||||
####### mongoDB配置,非核心依赖,可移除 #######
|
####### mongoDB配置,非核心依赖,可移除 #######
|
||||||
spring.data.mongodb.uri=mongodb://localhost:27017/powerjob-product
|
spring.data.mongodb.uri=mongodb://localhost:27017/powerjob-product
|
||||||
|
@ -2,8 +2,10 @@
|
|||||||
server.port=7700
|
server.port=7700
|
||||||
|
|
||||||
spring.profiles.active=daily
|
spring.profiles.active=daily
|
||||||
|
spring.main.banner-mode=log
|
||||||
spring.jpa.open-in-view=false
|
spring.jpa.open-in-view=false
|
||||||
spring.data.mongodb.repositories.type=none
|
spring.data.mongodb.repositories.type=none
|
||||||
|
logging.level.org.mongodb=warn
|
||||||
|
|
||||||
# 文件上传配置
|
# 文件上传配置
|
||||||
spring.servlet.multipart.enabled=true
|
spring.servlet.multipart.enabled=true
|
||||||
@ -11,16 +13,6 @@ spring.servlet.multipart.file-size-threshold=0
|
|||||||
spring.servlet.multipart.max-file-size=209715200
|
spring.servlet.multipart.max-file-size=209715200
|
||||||
spring.servlet.multipart.max-request-size=209715200
|
spring.servlet.multipart.max-request-size=209715200
|
||||||
|
|
||||||
# druid 监控配置(监控地址 /druid,登陆账号和密码默认都是 powerjob)
|
|
||||||
spring.datasource.druid.filters=stat
|
|
||||||
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
|
|
||||||
spring.datasource.druid.filter.stat.enabled=true
|
|
||||||
spring.datasource.druid.filter.stat.log-slow-sql=true
|
|
||||||
spring.datasource.druid.filter.stat.slow-sql-millis=5000
|
|
||||||
spring.datasource.druid.stat-view-servlet.enabled=true
|
|
||||||
spring.datasource.druid.stat-view-servlet.login-username=powerjob
|
|
||||||
spring.datasource.druid.stat-view-servlet.login-password=powerjob
|
|
||||||
|
|
||||||
###### PowerJob 自身配置(该配置只允许存在于 application.properties 文件中) ######
|
###### PowerJob 自身配置(该配置只允许存在于 application.properties 文件中) ######
|
||||||
# akka ActorSystem 服务端口
|
# akka ActorSystem 服务端口
|
||||||
oms.akka.port=10086
|
oms.akka.port=10086
|
||||||
|
@ -5,6 +5,7 @@ import com.github.kfcfans.powerjob.server.common.utils.timewheel.HashedWheelTime
|
|||||||
import com.github.kfcfans.powerjob.server.common.utils.timewheel.TimerFuture;
|
import com.github.kfcfans.powerjob.server.common.utils.timewheel.TimerFuture;
|
||||||
import com.github.kfcfans.powerjob.server.common.utils.timewheel.TimerTask;
|
import com.github.kfcfans.powerjob.server.common.utils.timewheel.TimerTask;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@ -82,4 +83,12 @@ public class UtilsTest {
|
|||||||
public void testTZ() {
|
public void testTZ() {
|
||||||
System.out.println(TimeZone.getDefault());
|
System.out.println(TimeZone.getDefault());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testStringUtils() {
|
||||||
|
String goodAppName = "powerjob-server";
|
||||||
|
String appName = "powerjob-server ";
|
||||||
|
System.out.println(StringUtils.containsWhitespace(goodAppName));
|
||||||
|
System.out.println(StringUtils.containsWhitespace(appName));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
45
powerjob-worker-spring-boot-starter/pom.xml
Normal file
45
powerjob-worker-spring-boot-starter/pom.xml
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<?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">
|
||||||
|
<parent>
|
||||||
|
<artifactId>powerjob</artifactId>
|
||||||
|
<groupId>com.github.kfcfans</groupId>
|
||||||
|
<version>1.0.0</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>powerjob-worker-spring-boot-starter</artifactId>
|
||||||
|
<version>3.2.1</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<powerjob.worker.version>3.2.1</powerjob.worker.version>
|
||||||
|
<springboot.version>2.2.6.RELEASE</springboot.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<!-- oms-worker -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.kfcfans</groupId>
|
||||||
|
<artifactId>powerjob-worker</artifactId>
|
||||||
|
<version>${powerjob.worker.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter</artifactId>
|
||||||
|
<version>${springboot.version}</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<version>${springboot.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,50 @@
|
|||||||
|
package com.github.kfcfans.powerjob.worker.autoconfigure;
|
||||||
|
|
||||||
|
import com.github.kfcfans.powerjob.common.utils.CommonUtils;
|
||||||
|
import com.github.kfcfans.powerjob.worker.OhMyWorker;
|
||||||
|
import com.github.kfcfans.powerjob.worker.common.OhMyConfig;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||||
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PowerJob 自动装配
|
||||||
|
*
|
||||||
|
* @author songyinyin
|
||||||
|
* @since 2020/7/26 16:37
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
@EnableConfigurationProperties(PowerJobProperties.class)
|
||||||
|
public class PowerJobAutoConfiguration {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@ConditionalOnMissingBean
|
||||||
|
public OhMyWorker initPowerJob(PowerJobProperties properties) {
|
||||||
|
|
||||||
|
// 服务器HTTP地址(端口号为 server.port,而不是 ActorSystem port),请勿添加任何前缀(http://)
|
||||||
|
CommonUtils.requireNonNull(properties.getServerAddress(), "serverAddress can't be empty!");
|
||||||
|
List<String> serverAddress = Arrays.asList(properties.getServerAddress().split(","));
|
||||||
|
|
||||||
|
// 1. 创建配置文件
|
||||||
|
OhMyConfig config = new OhMyConfig();
|
||||||
|
// 可以不显式设置,默认值 27777
|
||||||
|
config.setPort(properties.getAkkaPort());
|
||||||
|
// appName,需要提前在控制台注册,否则启动报错
|
||||||
|
config.setAppName(properties.getAppName());
|
||||||
|
config.setServerAddress(serverAddress);
|
||||||
|
// 如果没有大型 Map/MapReduce 的需求,建议使用内存来加速计算
|
||||||
|
// 有大型 Map/MapReduce 需求,可能产生大量子任务(Task)的场景,请使用 DISK,否则妥妥的 OutOfMemory
|
||||||
|
config.setStoreStrategy(properties.getStoreStrategy());
|
||||||
|
// 启动测试模式,true情况下,不再尝试连接 server 并验证appName
|
||||||
|
config.setEnableTestMode(properties.isEnableTestMode());
|
||||||
|
|
||||||
|
// 2. 创建 Worker 对象,设置配置文件
|
||||||
|
OhMyWorker ohMyWorker = new OhMyWorker();
|
||||||
|
ohMyWorker.setConfig(config);
|
||||||
|
return ohMyWorker;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
package com.github.kfcfans.powerjob.worker.autoconfigure;
|
||||||
|
|
||||||
|
import com.github.kfcfans.powerjob.common.RemoteConstant;
|
||||||
|
import com.github.kfcfans.powerjob.worker.common.constants.StoreStrategy;
|
||||||
|
import com.github.kfcfans.powerjob.worker.core.processor.ProcessResult;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PowerJob 配置项
|
||||||
|
*
|
||||||
|
* @author songyinyin
|
||||||
|
* @since 2020/7/26 16:37
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ConfigurationProperties(prefix = "powerjob")
|
||||||
|
public class PowerJobProperties {
|
||||||
|
/**
|
||||||
|
* 应用名称,需要提前在控制台注册,否则启动报错
|
||||||
|
*/
|
||||||
|
private String appName;
|
||||||
|
/**
|
||||||
|
* 启动 akka 端口
|
||||||
|
*/
|
||||||
|
private int akkaPort = RemoteConstant.DEFAULT_WORKER_PORT;
|
||||||
|
/**
|
||||||
|
* 调度服务器地址,ip:port 或 域名,多个用英文逗号分隔
|
||||||
|
*/
|
||||||
|
private String serverAddress;
|
||||||
|
/**
|
||||||
|
* 本地持久化方式,默认使用磁盘
|
||||||
|
*/
|
||||||
|
private StoreStrategy storeStrategy = StoreStrategy.DISK;
|
||||||
|
/**
|
||||||
|
* 最大返回值长度,超过会被截断
|
||||||
|
* {@link ProcessResult}#msg 的最大长度
|
||||||
|
*/
|
||||||
|
private int maxResultLength = 8096;
|
||||||
|
/**
|
||||||
|
* 启动测试模式,true情况下,不再尝试连接 server 并验证appName。
|
||||||
|
* true -> 用于本地写单元测试调试; false -> 默认值,标准模式
|
||||||
|
*/
|
||||||
|
private boolean enableTestMode = false;
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"groups": [
|
||||||
|
{
|
||||||
|
"name": "powerjob",
|
||||||
|
"type": "com.github.kfcfans.powerjob.worker.autoconfigure.PowerJobProperties",
|
||||||
|
"sourceType": "com.github.kfcfans.powerjob.worker.autoconfigure.PowerJobProperties"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"properties": [
|
||||||
|
{
|
||||||
|
"name": "powerjob.app-name",
|
||||||
|
"type": "java.lang.String",
|
||||||
|
"description": "应用名称,需要提前在控制台注册,否则启动报错",
|
||||||
|
"sourceType": "com.github.kfcfans.powerjob.worker.autoconfigure.PowerJobProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "powerjob.max-result-length",
|
||||||
|
"type": "java.lang.Integer",
|
||||||
|
"description": "最大返回值长度,超过会被截断 {@link ProcessResult}#msg 的最大长度",
|
||||||
|
"sourceType": "com.github.kfcfans.powerjob.worker.autoconfigure.PowerJobProperties",
|
||||||
|
"defaultValue": 8096
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "powerjob.akka-port",
|
||||||
|
"type": "java.lang.Integer",
|
||||||
|
"description": "启动 akka 端口",
|
||||||
|
"sourceType": "com.github.kfcfans.powerjob.worker.autoconfigure.PowerJobProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "powerjob.server-address",
|
||||||
|
"type": "java.lang.String",
|
||||||
|
"description": "调度服务器地址,ip:port 或 域名,多值用英文逗号分隔",
|
||||||
|
"sourceType": "com.github.kfcfans.powerjob.worker.autoconfigure.PowerJobProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "powerjob.store-strategy",
|
||||||
|
"type": "com.github.kfcfans.powerjob.worker.common.constants.StoreStrategy",
|
||||||
|
"description": "本地持久化方式,默认使用磁盘",
|
||||||
|
"sourceType": "com.github.kfcfans.powerjob.worker.autoconfigure.PowerJobProperties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "powerjob.enable-test-mode",
|
||||||
|
"type": "java.lang.Boolean",
|
||||||
|
"description": "启动测试模式,true情况下,不再尝试连接 server 并验证appName。true -> 用于本地写单元测试调试; false -> 默认值,标准模式",
|
||||||
|
"sourceType": "com.github.kfcfans.powerjob.worker.autoconfigure.PowerJobProperties",
|
||||||
|
"defaultValue": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"hints": []
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
|
||||||
|
com.github.kfcfans.powerjob.worker.autoconfigure.PowerJobAutoConfiguration
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.github.kfcfans.powerjob.worker.autoconfigure;
|
||||||
|
|
||||||
|
import com.github.kfcfans.powerjob.worker.OhMyWorker;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||||
|
import org.springframework.context.ConfigurableApplicationContext;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@EnableAutoConfiguration
|
||||||
|
class PowerJobAutoConfigurationTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testAutoConfiguration() {
|
||||||
|
ConfigurableApplicationContext run = SpringApplication.run(PowerJobAutoConfigurationTest.class);
|
||||||
|
OhMyWorker worker = run.getBean(OhMyWorker.class);
|
||||||
|
Assert.assertNotNull(worker);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
|
||||||
|
powerjob.enable-test-mode=true
|
@ -171,11 +171,13 @@ public class FrequentTaskTracker extends TaskTracker {
|
|||||||
newRootTask.setLastReportTime(-1L);
|
newRootTask.setLastReportTime(-1L);
|
||||||
|
|
||||||
// 判断是否超出最大执行实例数
|
// 判断是否超出最大执行实例数
|
||||||
if (timeExpressionType == TimeExpressionType.FIX_RATE) {
|
if (maxInstanceNum > 0) {
|
||||||
if (subInstanceId2TimeHolder.size() > maxInstanceNum) {
|
if (timeExpressionType == TimeExpressionType.FIX_RATE) {
|
||||||
log.warn("[TaskTracker-{}] cancel to launch the subInstance({}) due to too much subInstance is running.", instanceId, subInstanceId);
|
if (subInstanceId2TimeHolder.size() > maxInstanceNum) {
|
||||||
processFinishedSubInstance(subInstanceId, false, "TOO_MUCH_INSTANCE");
|
log.warn("[TaskTracker-{}] cancel to launch the subInstance({}) due to too much subInstance is running.", instanceId, subInstanceId);
|
||||||
return;
|
processFinishedSubInstance(subInstanceId, false, "TOO_MUCH_INSTANCE");
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user