【v3.8.0合并】Merge remote-tracking branch 'origin/springboot3' into springboot3_sas

# Conflicts:
#	jeecg-boot/jeecg-boot-base-core/pom.xml
#	jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/encryption/AesEncryptUtil.java
#	jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/firewall/interceptor/LowCodeModeInterceptor.java
#	jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
#	jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDataSourceController.java
#	jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartPermissionController.java
#	jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartRoleController.java
#	jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysRoleIndexController.java
#	jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysTableWhiteListController.java
#	jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysTenantPackServiceImpl.java
#	jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai
#	jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml
#	jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml
#	jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/InsertDemoTest.java
#	jeecg-boot/pom.xml
#	jeecgboot-vue3/pnpm-lock.yaml
This commit is contained in:
JEECG
2025-05-19 13:52:08 +08:00
676 changed files with 27598 additions and 10392 deletions

View File

@ -10,6 +10,6 @@ WORKDIR /jeecg-cloud-gateway
EXPOSE 9999
ADD ./target/jeecg-cloud-gateway-3.7.3.jar ./
ADD ./target/jeecg-cloud-gateway-3.8.0.jar ./
CMD sleep 100;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-gateway-3.7.3.jar
CMD sleep 100;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-gateway-3.8.0.jar

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>jeecg-server-cloud</artifactId>
<groupId>org.jeecgframework.boot</groupId>
<version>3.7.3</version>
<version>3.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jeecg-cloud-gateway</artifactId>
@ -73,7 +73,7 @@
<!-- Swagger API文档 -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-gateway-spring-boot-starter</artifactId>
<artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
<version>${knife4j-spring-boot-starter.version}</version>
</dependency>
<dependency>

View File

@ -1,160 +1,160 @@
//package org.jeecg.handler.swagger;
//
//import cn.hutool.core.util.ArrayUtil;
//import cn.hutool.core.util.ObjectUtil;
//import com.alibaba.nacos.api.naming.NamingFactory;
//import com.alibaba.nacos.api.naming.NamingService;
//import com.alibaba.nacos.api.naming.pojo.Instance;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.cloud.gateway.route.RouteLocator;
//import org.springframework.context.annotation.Primary;
//import org.springframework.stereotype.Component;
//
//import springfox.documentation.swagger.web.SwaggerResource;
//import springfox.documentation.swagger.web.SwaggerResourcesProvider;
//
//import java.util.*;
//
///** 已使用knife4j-gateway支持该功能
// * 聚合各个服务的swagger接口
// * @author zyf
// * @date: 2022/4/21 10:55
// */
//@Component
//@Slf4j
//@Primary
//public class MySwaggerResourceProvider implements SwaggerResourcesProvider {
// /**
// * swagger2默认的url后缀
// */
// private static final String SWAGGER2URL = "/v2/api-docs";
//
// /**
// * 网关路由
// */
// private final RouteLocator routeLocator;
// /**
// * Nacos名字服务
// */
// private NamingService naming;
//
// /**
// * nacos服务地址
// */
// @Value("${spring.cloud.nacos.discovery.server-addr}")
// private String serverAddr;
// /**
// * nacos namespace
// */
// @Value("${spring.cloud.nacos.discovery.namespace:#{null}}")
// private String namespace;
//
// /**
// * nacos groupName
// */
// @Value("${spring.cloud.nacos.config.group:DEFAULT_GROUP:#{null}}")
// private String group;
//
// /**
// * nacos username
// */
// @Value("${spring.cloud.nacos.discovery.username:#{null}}")
// private String username;
// /**
// * nacos password
// */
// @Value("${spring.cloud.nacos.discovery.password:#{null}}")
// private String password;
//
// /**
// * Swagger中需要排除的服务
// */
// private String[] excludeServiceIds=new String[]{"jeecg-cloud-monitor"};
//
//
// /**
// * 网关应用名称
// */
// @Value("${spring.application.name}")
// private String self;
//
// @Autowired
// public MySwaggerResourceProvider(RouteLocator routeLocator) {
// this.routeLocator = routeLocator;
// }
//
// @Override
// public List<SwaggerResource> get() {
// List<SwaggerResource> resources = new ArrayList<>();
// List<String> routeHosts = new ArrayList<>();
// // 获取所有可用的hostserviceId
// routeLocator.getRoutes().filter(route -> route.getUri().getHost() != null)
// .filter(route -> !self.equals(route.getUri().getHost()))
// .subscribe(route ->{
// //update-begin---author:zyf ---date:20220413 for过滤掉无效路由,避免接口文档报错无法打开
// boolean hasRoute=checkRoute(route.getId());
// if(hasRoute){
// routeHosts.add(route.getUri().getHost());
// }
// //update-end---author:zyf ---date:20220413 for过滤掉无效路由,避免接口文档报错无法打开
// });
//
// // 记录已经添加过的server存在同一个应用注册了多个服务在nacos上
// Set<String> dealed = new HashSet<>();
// routeHosts.forEach(instance -> {
// // 拼接url
// String url = "/" + instance.toLowerCase() + SWAGGER2URL;
// if (!dealed.contains(url)) {
// dealed.add(url);
// log.info(" Gateway add SwaggerResource: {}",url);
// SwaggerResource swaggerResource = new SwaggerResource();
// swaggerResource.setUrl(url);
// swaggerResource.setSwaggerVersion("2.0");
// swaggerResource.setName(instance);
// //Swagger排除不展示的服务
// if(!ArrayUtil.contains(excludeServiceIds,instance)){
// resources.add(swaggerResource);
// }
// }
// });
// return resources;
// }
//
// /**
// * 检测nacos中是否有健康实例
// * @param routeId
// * @return
// */
// private Boolean checkRoute(String routeId) {
// Boolean hasRoute = false;
// try {
// //修复使用带命名空间启动网关swagger看不到接口文档的问题
// Properties properties=new Properties();
// properties.setProperty("serverAddr",serverAddr);
// if(namespace!=null && !"".equals(namespace)){
// log.info("nacos.discovery.namespace = {}", namespace);
// properties.setProperty("namespace",namespace);
// }
// if(username!=null && !"".equals(username)){
// properties.setProperty("username",username);
// }
// if(password!=null && !"".equals(password)){
// properties.setProperty("password",password);
// }
// //【issues/5115】因swagger文档导致gateway内存溢出
// if (this.naming == null) {
// this.naming = NamingFactory.createNamingService(properties);
// }
// log.info(" config.group : {}", group);
// List<Instance> list = this.naming.selectInstances(routeId, group , true);
// if (ObjectUtil.isNotEmpty(list)) {
// hasRoute = true;
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// return hasRoute;
// }
//}
package org.jeecg.handler.swagger;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.nacos.api.naming.NamingFactory;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;
import java.util.*;
/** 已使用knife4j-gateway支持该功能
* 聚合各个服务的swagger接口
* @author zyf
* @date: 2022/4/21 10:55
*/
@Component
@Slf4j
@Primary
public class MySwaggerResourceProvider implements SwaggerResourcesProvider {
/**
* swagger2默认的url后缀
*/
private static final String SWAGGER2URL = "/v3/api-docs";
/**
* 网关路由
*/
private final RouteLocator routeLocator;
/**
* Nacos名字服务
*/
private NamingService naming;
/**
* nacos服务地址
*/
@Value("${spring.cloud.nacos.discovery.server-addr}")
private String serverAddr;
/**
* nacos namespace
*/
@Value("${spring.cloud.nacos.discovery.namespace:#{null}}")
private String namespace;
/**
* nacos groupName
*/
@Value("${spring.cloud.nacos.config.group:DEFAULT_GROUP:#{null}}")
private String group;
/**
* nacos username
*/
@Value("${spring.cloud.nacos.discovery.username:#{null}}")
private String username;
/**
* nacos password
*/
@Value("${spring.cloud.nacos.discovery.password:#{null}}")
private String password;
/**
* Swagger中需要排除的服务
*/
private String[] excludeServiceIds=new String[]{"jeecg-cloud-monitor"};
/**
* 网关应用名称
*/
@Value("${spring.application.name}")
private String self;
@Autowired
public MySwaggerResourceProvider(RouteLocator routeLocator) {
this.routeLocator = routeLocator;
}
@Override
public List<SwaggerResource> get() {
List<SwaggerResource> resources = new ArrayList<>();
List<String> routeHosts = new ArrayList<>();
// 获取所有可用的hostserviceId
routeLocator.getRoutes().filter(route -> route.getUri().getHost() != null)
.filter(route -> !self.equals(route.getUri().getHost()))
.subscribe(route ->{
//update-begin---author:zyf ---date:20220413 for过滤掉无效路由,避免接口文档报错无法打开
boolean hasRoute=checkRoute(route.getId());
if(hasRoute){
routeHosts.add(route.getUri().getHost());
}
//update-end---author:zyf ---date:20220413 for过滤掉无效路由,避免接口文档报错无法打开
});
// 记录已经添加过的server存在同一个应用注册了多个服务在nacos上
Set<String> dealed = new HashSet<>();
routeHosts.forEach(instance -> {
// 拼接url
String url = "/" + instance.toLowerCase() + SWAGGER2URL;
if (!dealed.contains(url)) {
dealed.add(url);
log.info(" Gateway add SwaggerResource: {}",url);
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setUrl(url);
swaggerResource.setSwaggerVersion("2.0");
swaggerResource.setName(instance);
//Swagger排除不展示的服务
if(!ArrayUtil.contains(excludeServiceIds,instance)){
resources.add(swaggerResource);
}
}
});
return resources;
}
/**
* 检测nacos中是否有健康实例
* @param routeId
* @return
*/
private Boolean checkRoute(String routeId) {
Boolean hasRoute = false;
try {
//修复使用带命名空间启动网关swagger看不到接口文档的问题
Properties properties=new Properties();
properties.setProperty("serverAddr",serverAddr);
if(namespace!=null && !"".equals(namespace)){
log.info("nacos.discovery.namespace = {}", namespace);
properties.setProperty("namespace",namespace);
}
if(username!=null && !"".equals(username)){
properties.setProperty("username",username);
}
if(password!=null && !"".equals(password)){
properties.setProperty("password",password);
}
//【issues/5115】因swagger文档导致gateway内存溢出
if (this.naming == null) {
this.naming = NamingFactory.createNamingService(properties);
}
log.info(" config.group : {}", group);
List<Instance> list = this.naming.selectInstances(routeId, group , true);
if (ObjectUtil.isNotEmpty(list)) {
hasRoute = true;
}
} catch (Exception e) {
e.printStackTrace();
}
return hasRoute;
}
}

View File

@ -1,41 +1,49 @@
//package org.jeecg.handler.swagger;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.ResponseEntity;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//import springfox.documentation.swagger.web.*;
//
//import java.util.List;
//
///** 已使用knife4j-gateway支持该功能
// * swagger聚合接口三个接口都是 doc.html需要访问的接口
// * @author zyf
// * @date: 2022/4/21 10:55
// */
//@RestController
//@RequestMapping("/swagger-resources")
//public class SwaggerResourceController {
// private MySwaggerResourceProvider swaggerResourceProvider;
//
// @Autowired
// public SwaggerResourceController(MySwaggerResourceProvider swaggerResourceProvider) {
// this.swaggerResourceProvider = swaggerResourceProvider;
// }
//
// @RequestMapping(value = "/configuration/security")
// public ResponseEntity<SecurityConfiguration> securityConfiguration() {
// return new ResponseEntity<>(SecurityConfigurationBuilder.builder().build(), HttpStatus.OK);
// }
//
// @RequestMapping(value = "/configuration/ui")
// public ResponseEntity<UiConfiguration> uiConfiguration() {
// return new ResponseEntity<>(UiConfigurationBuilder.builder().build(), HttpStatus.OK);
// }
//
// @RequestMapping
// public ResponseEntity<List<SwaggerResource>> swaggerResources() {
// return new ResponseEntity<>(swaggerResourceProvider.get(), HttpStatus.OK);
// }
//}
package org.jeecg.handler.swagger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.swagger.web.*;
import java.util.ArrayList;
import java.util.List;
/** 已使用knife4j-gateway支持该功能
* swagger聚合接口三个接口都是 doc.html需要访问的接口
* @author zyf
* @date: 2022/4/21 10:55
*/
@RestController
@RequestMapping("/swagger-resources")
public class SwaggerResourceController {
private MySwaggerResourceProvider swaggerResourceProvider;
@Value("${knife4j.gateway.enabled:true}")
private Boolean enableSwagger;
@Autowired
public SwaggerResourceController(MySwaggerResourceProvider swaggerResourceProvider) {
this.swaggerResourceProvider = swaggerResourceProvider;
}
@RequestMapping(value = "/configuration/security")
public ResponseEntity<SecurityConfiguration> securityConfiguration() {
return new ResponseEntity<>(SecurityConfigurationBuilder.builder().build(), HttpStatus.OK);
}
@RequestMapping(value = "/configuration/ui")
public ResponseEntity<UiConfiguration> uiConfiguration() {
return new ResponseEntity<>(UiConfigurationBuilder.builder().build(), HttpStatus.OK);
}
@RequestMapping
public ResponseEntity<List<SwaggerResource>> swaggerResources() {
if (!enableSwagger) {
return new ResponseEntity<>(new ArrayList<>(), HttpStatus.OK);
}
return new ResponseEntity<>(swaggerResourceProvider.get(), HttpStatus.OK);
}
}

View File

@ -9,6 +9,8 @@ import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.common.utils.StringUtils;
import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.base.BaseMap;
import org.jeecg.common.constant.CacheConstant;
@ -30,7 +32,6 @@ import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import reactor.core.publisher.Mono;
import java.net.URI;
@ -108,7 +109,7 @@ public class DynamicRouteLoader implements ApplicationEventPublisherAware {
* @return
*/
private void loadRoutesByNacos() {
List<RouteDefinition> routes = Collections.emptyList();
List<RouteDefinition> routes = Lists.newArrayList();
configService = createConfigService();
if (configService == null) {
log.warn("initConfigService fail");
@ -117,7 +118,7 @@ public class DynamicRouteLoader implements ApplicationEventPublisherAware {
log.info("jeecg.route.config.data-id = {}", gatewayRoutersConfig.getDataId());
log.info("nacos.config.group = {}", gatewayRoutersConfig.getRouteGroup());
String configInfo = configService.getConfig(gatewayRoutersConfig.getDataId(), gatewayRoutersConfig.getRouteGroup(), DEFAULT_TIMEOUT);
if (StringUtils.hasText(configInfo)) {
if (StringUtils.isNotBlank(configInfo)) {
log.info("获取网关当前配置:\r\n{}", configInfo);
routes = JSON.parseArray(configInfo, RouteDefinition.class);
}else{
@ -142,7 +143,7 @@ public class DynamicRouteLoader implements ApplicationEventPublisherAware {
* @return
*/
private void loadRoutesByRedis(BaseMap baseMap) {
List<MyRouteDefinition> routes = Collections.emptyList();
List<MyRouteDefinition> routes = Lists.newArrayList();
configService = createConfigService();
if (configService == null) {
log.warn("initConfigService fail");
@ -359,13 +360,13 @@ public class DynamicRouteLoader implements ApplicationEventPublisherAware {
try {
Properties properties = new Properties();
properties.setProperty("serverAddr", gatewayRoutersConfig.getServerAddr());
if(StringUtils.hasText(gatewayRoutersConfig.getNamespace())){
if(StringUtils.isNotBlank(gatewayRoutersConfig.getNamespace())){
properties.setProperty("namespace", gatewayRoutersConfig.getNamespace());
}
if(StringUtils.hasText( gatewayRoutersConfig.getUsername())){
if(StringUtils.isNotBlank( gatewayRoutersConfig.getUsername())){
properties.setProperty("username", gatewayRoutersConfig.getUsername());
}
if(StringUtils.hasText(gatewayRoutersConfig.getPassword())){
if(StringUtils.isNotBlank(gatewayRoutersConfig.getPassword())){
properties.setProperty("password", gatewayRoutersConfig.getPassword());
}
return configService = NacosFactory.createConfigService(properties);

View File

@ -4,10 +4,6 @@ server:
knife4j:
gateway:
enabled: true
discover:
excluded-services: ${spring.application.name}
enabled: true
strategy: discover
spring:
application:

View File

@ -1,5 +1,5 @@
import org.jeecg.loader.vo.PredicatesVo;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import java.util.*;

View File

@ -10,6 +10,6 @@ WORKDIR /jeecg-cloud-nacos
EXPOSE 8848
ADD ./target/jeecg-cloud-nacos-3.7.3.jar ./
ADD ./target/jeecg-cloud-nacos-3.8.0.jar ./
CMD sleep 30;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-nacos-3.7.3.jar
CMD sleep 30;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-nacos-3.8.0.jar

View File

@ -5,7 +5,7 @@
<artifactId>jeecg-cloud-nacos</artifactId>
<name>jeecg-cloud-nacos</name>
<description>nacos启动模块</description>
<version>3.7.3</version>
<version>3.8.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
@ -35,8 +35,8 @@
<properties>
<log4j2.version>2.17.0</log4j2.version>
<dm8.version>8.1.1.49</dm8.version>
<nacos.version>2.3.2</nacos.version>
<dm8.version>8.1.1.49</dm8.version>
</properties>
<dependencies>

View File

@ -6,9 +6,9 @@ import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import javax.servlet.http.HttpServletResponse;
/**
* Nacos 启动类
*

View File

@ -10,6 +10,6 @@ WORKDIR /jeecg-demo-cloud
EXPOSE 7002
ADD ./target/jeecg-demo-cloud-start-3.7.3.jar ./
ADD ./target/jeecg-demo-cloud-start-3.8.0.jar ./
CMD sleep 60;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-demo-cloud-start-3.7.3.jar
CMD sleep 60;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-demo-cloud-start-3.8.0.jar

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>jeecg-server-cloud</artifactId>
<groupId>org.jeecgframework.boot</groupId>
<version>3.7.3</version>
<version>3.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@ -10,6 +10,6 @@ WORKDIR /jeecg-system-cloud
EXPOSE 7001
ADD ./target/jeecg-system-cloud-start-3.7.3.jar ./
ADD ./target/jeecg-system-cloud-start-3.8.0.jar ./
CMD sleep 60;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-system-cloud-start-3.7.3.jar
CMD sleep 60;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-system-cloud-start-3.8.0.jar

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>jeecg-server-cloud</artifactId>
<groupId>org.jeecgframework.boot</groupId>
<version>3.7.3</version>
<version>3.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jeecg-system-cloud-start</artifactId>

View File

@ -1,6 +1,6 @@
server:
port: 7001
spring:
application:
name: jeecg-system

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>jeecg-visual</artifactId>
<groupId>org.jeecgframework.boot</groupId>
<version>3.7.3</version>
<version>3.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jeecg-cloud-monitor</artifactId>

View File

@ -1,4 +1,4 @@
FROM registry.cn-hangzhou.aliyuncs.com/jeecgdocker/alpine-java:8_server-jre_unlimited
FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:21-anolis
MAINTAINER jeecgos@163.com
@ -10,6 +10,6 @@ WORKDIR /jeecg-cloud-sentinel
EXPOSE 8848
ADD ./target/jeecg-cloud-sentinel-3.7.3.jar ./
ADD ./target/jeecg-cloud-sentinel-3.8.0.jar ./
CMD sleep 5;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-sentinel-3.7.3.jar
CMD sleep 5;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-sentinel-3.8.0.jar

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>jeecg-cloud-test</artifactId>
<groupId>org.jeecgframework.boot</groupId>
<version>3.7.3</version>
<version>3.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<description>公共测试模块</description>

View File

@ -32,7 +32,7 @@ public class JeecgTestFeignController {
* @return
*/
@GetMapping("/getMessage")
@Operation(summary = "测试feign @SentinelResource熔断写法 | 测试熔断关闭jeecg-demo服务")
@Operation(summary = "测试feign @SentinelResource熔断写法 | 测试熔断关闭jeecg-demo服务")
@SentinelResource(value = "test_more_getMessage", fallback = "getDefaultUser")
public Result<String> getMessage(@RequestParam(value = "name", required = false) String name) {
log.info("---------Feign fallbackFactory优先级高于@SentinelResource-----------------");
@ -47,7 +47,7 @@ public class JeecgTestFeignController {
* @return
*/
@GetMapping("/getMessage2")
@Operation(summary = "测试feign fallbackFactory熔断写法 | 测试熔断关闭jeecg-demo服务")
@Operation(summary = "测试feign fallbackFactory熔断写法 | 测试熔断关闭jeecg-demo服务")
public Result<String> getMessage2(@RequestParam(value = "name", required = false) String name) {
log.info("---------测试 Feign fallbackFactory-----------------");
String resultMsg = jeecgTestClient.getMessage(" I am jeecg-system 服务节点,呼叫 jeecg-demo!");
@ -56,7 +56,7 @@ public class JeecgTestFeignController {
@GetMapping("/fallback")
@Operation(summary = "测试熔断")
@Operation(summary = "测试熔断")
@SentinelResource(value = "test_more_fallback", fallback = "getDefaultUser")
public Result<Object> test(@RequestParam(value = "name", required = false) String name) {
if (StringUtils.isEmpty(name)) {

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>jeecg-cloud-test</artifactId>
<groupId>org.jeecgframework.boot</groupId>
<version>3.7.3</version>
<version>3.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<description>消息队列测试模块</description>

View File

@ -5,6 +5,8 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.jeecg.boot.starter.rabbitmq.client.RabbitMqClient;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.base.BaseMap;

View File

@ -5,7 +5,7 @@
<parent>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-cloud-test</artifactId>
<version>3.7.3</version>
<version>3.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<description>消息队列测试模块</description>

View File

@ -4,7 +4,6 @@ package org.jeecg.modules.test.rocketmq.controller;
import cn.hutool.core.util.RandomUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import org.jeecg.boot.starter.rabbitmq.client.RabbitMqClient;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.base.BaseMap;
@ -14,6 +13,8 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import jakarta.servlet.http.HttpServletRequest;
/**
* RocketMqClient发送消息

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>jeecg-cloud-test-seata</artifactId>
<groupId>org.jeecgframework.boot</groupId>
<version>3.7.3</version>
<version>3.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<description>分布式事务测试模块</description>

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>jeecg-cloud-test-seata</artifactId>
<groupId>org.jeecgframework.boot</groupId>
<version>3.7.3</version>
<version>3.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<description>分布式事务测试模块</description>

View File

@ -6,7 +6,6 @@ package org.jeecg.modules.test.seata.order.controller;
* @date: 2022/01/24
* @version: V1.0
*/
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.jeecg.modules.test.seata.order.dto.PlaceOrderRequest;

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>jeecg-cloud-test-seata</artifactId>
<groupId>org.jeecgframework.boot</groupId>
<version>3.7.3</version>
<version>3.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<description>分布式事务测试模块</description>

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>jeecg-cloud-test</artifactId>
<groupId>org.jeecgframework.boot</groupId>
<version>3.7.3</version>
<version>3.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jeecg-cloud-test-seata</artifactId>

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>jeecg-cloud-test</artifactId>
<groupId>org.jeecgframework.boot</groupId>
<version>3.7.3</version>
<version>3.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>jeecg-visual</artifactId>
<groupId>org.jeecgframework.boot</groupId>
<version>3.7.3</version>
<version>3.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@ -1,4 +1,4 @@
FROM registry.cn-hangzhou.aliyuncs.com/jeecgdocker/alpine-java:8_server-jre_unlimited
FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:21-anolis
MAINTAINER jeecgos@163.com
@ -10,7 +10,7 @@ WORKDIR /jeecg-cloud-xxljob
EXPOSE 9080
ADD ./target/jeecg-cloud-xxljob-3.7.3.jar ./
ADD ./target/jeecg-cloud-xxljob-3.8.0.jar ./
CMD java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-xxljob-3.7.3.jar
CMD java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-xxljob-3.8.0.jar

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>jeecg-visual</artifactId>
<groupId>org.jeecgframework.boot</groupId>
<version>3.7.3</version>
<version>3.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@ -1,32 +0,0 @@
//package com.xxl.job.admin.core.jobbean;
//
//import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
//import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
//import org.quartz.JobExecutionContext;
//import org.quartz.JobExecutionException;
//import org.quartz.JobKey;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.scheduling.quartz.QuartzJobBean;
//
///**
// * http job bean
// * “@DisallowConcurrentExecution” disable concurrent, thread size can not be only one, better given more
// * @author xuxueli 2015-12-17 18:20:34
// */
////@DisallowConcurrentExecution
//public class RemoteHttpJobBean extends QuartzJobBean {
// private static Logger logger = LoggerFactory.getLogger(RemoteHttpJobBean.class);
//
// @Override
// protected void executeInternal(JobExecutionContext context)
// throws JobExecutionException {
//
// // load jobId
// JobKey jobKey = context.getTrigger().getJobKey();
// Integer jobId = Integer.valueOf(jobKey.getName());
//
//
// }
//
//}

View File

@ -1,413 +0,0 @@
//package com.xxl.job.admin.core.schedule;
//
//import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
//import com.xxl.job.admin.core.jobbean.RemoteHttpJobBean;
//import com.xxl.job.admin.core.model.XxlJobInfo;
//import com.xxl.job.admin.core.thread.JobFailMonitorHelper;
//import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper;
//import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
//import com.xxl.job.admin.core.util.I18nUtil;
//import com.xxl.job.core.biz.AdminBiz;
//import com.xxl.job.core.biz.ExecutorBiz;
//import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
//import com.xxl.rpc.remoting.invoker.XxlRpcInvokerFactory;
//import com.xxl.rpc.remoting.invoker.call.CallType;
//import com.xxl.rpc.remoting.invoker.reference.XxlRpcReferenceBean;
//import com.xxl.rpc.remoting.invoker.route.LoadBalance;
//import com.xxl.rpc.remoting.net.NetEnum;
//import com.xxl.rpc.remoting.net.impl.servlet.server.ServletServerHandler;
//import com.xxl.rpc.remoting.provider.XxlRpcProviderFactory;
//import com.xxl.rpc.serialize.Serializer;
//import org.quartz.*;
//import org.quartz.Trigger.TriggerState;
//import org.quartz.impl.triggers.CronTriggerImpl;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.util.Assert;
//
//import javax.servlet.ServletException;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.io.IOException;
//import java.util.Date;
//import java.util.concurrent.ConcurrentHashMap;
//
///**
// * base quartz scheduler util
// * @author xuxueli 2015-12-19 16:13:53
// */
//public final class XxlJobDynamicScheduler {
// private static final Logger logger = LoggerFactory.getLogger(XxlJobDynamicScheduler_old.class);
//
// // ---------------------- param ----------------------
//
// // scheduler
// private static Scheduler scheduler;
// public void setScheduler(Scheduler scheduler) {
// XxlJobDynamicScheduler_old.scheduler = scheduler;
// }
//
//
// // ---------------------- init + destroy ----------------------
// public void start() throws Exception {
// // valid
// Assert.notNull(scheduler, "quartz scheduler is null");
//
// // init i18n
// initI18n();
//
// // admin registry monitor run
// JobRegistryMonitorHelper.getInstance().start();
//
// // admin monitor run
// JobFailMonitorHelper.getInstance().start();
//
// // admin-server
// initRpcProvider();
//
// logger.info(">>>>>>>>> init xxl-job admin success.");
// }
//
//
// public void destroy() throws Exception {
// // admin trigger pool stop
// JobTriggerPoolHelper.toStop();
//
// // admin registry stop
// JobRegistryMonitorHelper.getInstance().toStop();
//
// // admin monitor stop
// JobFailMonitorHelper.getInstance().toStop();
//
// // admin-server
// stopRpcProvider();
// }
//
//
// // ---------------------- I18n ----------------------
//
// private void initI18n(){
// for (ExecutorBlockStrategyEnum item:ExecutorBlockStrategyEnum.values()) {
// item.setTitle(I18nUtil.getString("jobconf_block_".concat(item.name())));
// }
// }
//
//
// // ---------------------- admin rpc provider (no server version) ----------------------
// private static ServletServerHandler servletServerHandler;
// private void initRpcProvider(){
// // init
// XxlRpcProviderFactory xxlRpcProviderFactory = new XxlRpcProviderFactory();
// xxlRpcProviderFactory.initConfig(
// NetEnum.NETTY_HTTP,
// Serializer.SerializeEnum.HESSIAN.getSerializer(),
// null,
// 0,
// XxlJobAdminConfig.getAdminConfig().getAccessToken(),
// null,
// null);
//
// // add services
// xxlRpcProviderFactory.addService(AdminBiz.class.getName(), null, XxlJobAdminConfig.getAdminConfig().getAdminBiz());
//
// // servlet handler
// servletServerHandler = new ServletServerHandler(xxlRpcProviderFactory);
// }
// private void stopRpcProvider() throws Exception {
// XxlRpcInvokerFactory.getInstance().stop();
// }
// public static void invokeAdminService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
// servletServerHandler.handle(null, request, response);
// }
//
//
// // ---------------------- executor-client ----------------------
// private static ConcurrentHashMap<String, ExecutorBiz> executorBizRepository = new ConcurrentHashMap<String, ExecutorBiz>();
// public static ExecutorBiz getExecutorBiz(String address) throws Exception {
// // valid
// if (address==null || address.trim().length()==0) {
// return null;
// }
//
// // load-cache
// address = address.trim();
// ExecutorBiz executorBiz = executorBizRepository.get(address);
// if (executorBiz != null) {
// return executorBiz;
// }
//
// // set-cache
// executorBiz = (ExecutorBiz) new XxlRpcReferenceBean(
// NetEnum.NETTY_HTTP,
// Serializer.SerializeEnum.HESSIAN.getSerializer(),
// CallType.SYNC,
// LoadBalance.ROUND,
// ExecutorBiz.class,
// null,
// 5000,
// address,
// XxlJobAdminConfig.getAdminConfig().getAccessToken(),
// null,
// null).getObject();
//
// executorBizRepository.put(address, executorBiz);
// return executorBiz;
// }
//
//
// // ---------------------- schedule util ----------------------
//
// /**
// * fill job info
// *
// * @param jobInfo
// */
// public static void fillJobInfo(XxlJobInfo jobInfo) {
//
// String name = String.valueOf(jobInfo.getId());
//
// // trigger key
// TriggerKey triggerKey = TriggerKey.triggerKey(name);
// try {
//
// // trigger cron
// Trigger trigger = scheduler.getTrigger(triggerKey);
// if (trigger!=null && trigger instanceof CronTriggerImpl) {
// String cronExpression = ((CronTriggerImpl) trigger).getCronExpression();
// jobInfo.setJobCron(cronExpression);
// }
//
// // trigger state
// TriggerState triggerState = scheduler.getTriggerState(triggerKey);
// if (triggerState!=null) {
// jobInfo.setJobStatus(triggerState.name());
// }
//
// //JobKey jobKey = new JobKey(jobInfo.getJobName(), String.valueOf(jobInfo.getJobGroup()));
// //JobDetail jobDetail = scheduler.getJobDetail(jobKey);
// //String jobClass = jobDetail.getJobClass().getName();
//
// } catch (SchedulerException e) {
// logger.error(e.getMessage(), e);
// }
// }
//
//
// /**
// * add trigger + job
// *
// * @param jobName
// * @param cronExpression
// * @return
// * @throws SchedulerException
// */
// public static boolean addJob(String jobName, String cronExpression) throws SchedulerException {
// // 1、job key
// TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
// JobKey jobKey = new JobKey(jobName);
//
// // 2、valid
// if (scheduler.checkExists(triggerKey)) {
// return true; // PASS
// }
//
// // 3、corn trigger
// CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing(); // withMisfireHandlingInstructionDoNothing 忽略掉调度终止过程中忽略的调度
// CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
//
// // 4、job detail
// Class<? extends Job> jobClass_ = RemoteHttpJobBean.class; // Class.forName(jobInfo.getJobClass());
// JobDetail jobDetail = JobBuilder.newJob(jobClass_).withIdentity(jobKey).build();
//
// /*if (jobInfo.getJobData()!=null) {
// JobDataMap jobDataMap = jobDetail.getJobDataMap();
// jobDataMap.putAll(JacksonUtil.readValue(jobInfo.getJobData(), Map.class));
// // JobExecutionContext context.getMergedJobDataMap().get("mailGuid");
// }*/
//
// // 5、schedule job
// Date date = scheduler.scheduleJob(jobDetail, cronTrigger);
//
// logger.info(">>>>>>>>>>> addJob success(quartz), jobDetail:{}, cronTrigger:{}, date:{}", jobDetail, cronTrigger, date);
// return true;
// }
//
//
// /**
// * remove trigger + job
// *
// * @param jobName
// * @return
// * @throws SchedulerException
// */
// public static boolean removeJob(String jobName) throws SchedulerException {
//
// JobKey jobKey = new JobKey(jobName);
// scheduler.deleteJob(jobKey);
//
// /*TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
// if (scheduler.checkExists(triggerKey)) {
// scheduler.unscheduleJob(triggerKey); // trigger + job
// }*/
//
// logger.info(">>>>>>>>>>> removeJob success(quartz), jobKey:{}", jobKey);
// return true;
// }
//
//
// /**
// * updateJobCron
// *
// * @param jobName
// * @param cronExpression
// * @return
// * @throws SchedulerException
// */
// public static boolean updateJobCron(String jobName, String cronExpression) throws SchedulerException {
//
// // 1、job key
// TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
//
// // 2、valid
// if (!scheduler.checkExists(triggerKey)) {
// return true; // PASS
// }
//
// CronTrigger oldTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
//
// // 3、avoid repeat cron
// String oldCron = oldTrigger.getCronExpression();
// if (oldCron.equals(cronExpression)){
// return true; // PASS
// }
//
// // 4、new cron trigger
// CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();
// oldTrigger = oldTrigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
//
// // 5、rescheduleJob
// scheduler.rescheduleJob(triggerKey, oldTrigger);
//
// /*
// JobKey jobKey = new JobKey(jobName);
//
// // old job detail
// JobDetail jobDetail = scheduler.getJobDetail(jobKey);
//
// // new trigger
// HashSet<Trigger> triggerSet = new HashSet<Trigger>();
// triggerSet.add(cronTrigger);
// // cover trigger of job detail
// scheduler.scheduleJob(jobDetail, triggerSet, true);*/
//
// logger.info(">>>>>>>>>>> resumeJob success, JobName:{}", jobName);
// return true;
// }
//
//
// /**
// * pause
// *
// * @param jobName
// * @return
// * @throws SchedulerException
// */
// /*public static boolean pauseJob(String jobName) throws SchedulerException {
//
// TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
//
// boolean result = false;
// if (scheduler.checkExists(triggerKey)) {
// scheduler.pauseTrigger(triggerKey);
// result = true;
// }
//
// logger.info(">>>>>>>>>>> pauseJob {}, triggerKey:{}", (result?"success":"fail"),triggerKey);
// return result;
// }*/
//
//
// /**
// * resume
// *
// * @param jobName
// * @return
// * @throws SchedulerException
// */
// /*public static boolean resumeJob(String jobName) throws SchedulerException {
//
// TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
//
// boolean result = false;
// if (scheduler.checkExists(triggerKey)) {
// scheduler.resumeTrigger(triggerKey);
// result = true;
// }
//
// logger.info(">>>>>>>>>>> resumeJob {}, triggerKey:{}", (result?"success":"fail"), triggerKey);
// return result;
// }*/
//
//
// /**
// * run
// *
// * @param jobName
// * @return
// * @throws SchedulerException
// */
// /*public static boolean triggerJob(String jobName) throws SchedulerException {
// // TriggerKey : name + group
// JobKey jobKey = new JobKey(jobName);
// TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
//
// boolean result = false;
// if (scheduler.checkExists(triggerKey)) {
// scheduler.triggerJob(jobKey);
// result = true;
// logger.info(">>>>>>>>>>> runJob success, jobKey:{}", jobKey);
// } else {
// logger.info(">>>>>>>>>>> runJob fail, jobKey:{}", jobKey);
// }
// return result;
// }*/
//
//
// /**
// * finaAllJobList
// *
// * @return
// *//*
// @Deprecated
// public static List<Map<String, Object>> finaAllJobList(){
// List<Map<String, Object>> jobList = new ArrayList<Map<String,Object>>();
//
// try {
// if (scheduler.getJobGroupNames()==null || scheduler.getJobGroupNames().size()==0) {
// return null;
// }
// String groupName = scheduler.getJobGroupNames().get(0);
// Set<JobKey> jobKeys = scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName));
// if (jobKeys!=null && jobKeys.size()>0) {
// for (JobKey jobKey : jobKeys) {
// TriggerKey triggerKey = TriggerKey.triggerKey(jobKey.getName(), Scheduler.DEFAULT_GROUP);
// Trigger trigger = scheduler.getTrigger(triggerKey);
// JobDetail jobDetail = scheduler.getJobDetail(jobKey);
// TriggerState triggerState = scheduler.getTriggerState(triggerKey);
// Map<String, Object> jobMap = new HashMap<String, Object>();
// jobMap.put("TriggerKey", triggerKey);
// jobMap.put("Trigger", trigger);
// jobMap.put("JobDetail", jobDetail);
// jobMap.put("TriggerState", triggerState);
// jobList.add(jobMap);
// }
// }
//
// } catch (SchedulerException e) {
// logger.error(e.getMessage(), e);
// return null;
// }
// return jobList;
// }*/
//
//}

View File

@ -1,58 +0,0 @@
//package com.xxl.job.admin.core.quartz;
//
//import org.quartz.SchedulerConfigException;
//import org.quartz.spi.ThreadPool;
//
///**
// * single thread pool, for async trigger
// *
// * @author xuxueli 2019-03-06
// */
//public class XxlJobThreadPool implements ThreadPool {
//
// @Override
// public boolean runInThread(Runnable runnable) {
//
// // async run
// runnable.run();
// return true;
//
// //return false;
// }
//
// @Override
// public int blockForAvailableThreads() {
// return 1;
// }
//
// @Override
// public void initialize() throws SchedulerConfigException {
//
// }
//
// @Override
// public void shutdown(boolean waitForJobsToComplete) {
//
// }
//
// @Override
// public int getPoolSize() {
// return 1;
// }
//
// @Override
// public void setInstanceId(String schedInstId) {
//
// }
//
// @Override
// public void setInstanceName(String schedName) {
//
// }
//
// // support
// public void setThreadCount(int count) {
// //
// }
//
//}

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>jeecg-server-cloud</artifactId>
<groupId>org.jeecgframework.boot</groupId>
<version>3.7.3</version>
<version>3.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>jeecg-boot-parent</artifactId>
<groupId>org.jeecgframework.boot</groupId>
<version>3.7.3</version>
<version>3.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>